使用node指令碼全自動刪除豆瓣評論與帖子

Leo_chen發表於2019-03-02

前情提要

最近由於轉租房子的事情,搞得很疲憊,前期沒考慮好就換了新的住處,導致需要自己轉租以前的房子,不然房東不退押金啊;怎麼辦,轉租唄,抄起傢伙就是幹,以前用過豆瓣小組轉過房子,這次也是一樣(我不是做廣告的,別打我!),拼命發帖,拼命自己頂帖啊,加了一二十個小組,發了一二十個貼子,本來想寫個指令碼定時頂帖呢,可無奈還需要搞驗證碼,工作事情多,沒時間做了,全自動頂帖的就人工代替了,偶爾一兩個小時頂一次;

前兩天剛轉租出去,本來想去豆瓣把帖子刪了,因為帖子中有太多的個人資訊,一個一個清空太麻煩。無奈看了一遍沒有刪帖的地方,後來才知道原來豆瓣刪帖必須是沒有評論的帖子才可以刪除,我看了一下我的帖子,瞬間石化,我自己的回覆都已經有上百條了,一個一個刪要到什麼時候啊;本能的我開始研究豆瓣刪除評論的介面呼叫規律,發現了規律後就擼起袖子幹;

豆瓣介面

由於豆瓣中的一些相關操作都是需要認證的,所以我們需要提前用瀏覽器登入進行操作,取到Cookie 和一個ck值,ck值具體什麼作用不是很清楚,不過大部分的操作都需要這個引數,這個引數的值基本沒有變化,很容易找到,最好刪帖前自己操作一下刪除評論就可以獲取到ck值,cid值就是評論的編號值,後續程式碼中有介紹相關引數獲取方式;

使用node指令碼全自動刪除豆瓣評論與帖子

技術選型

以前做過node爬蟲工具,這次也一樣,不過這個相對更簡單點,只有兩個依賴包,一個是

superagent 一個是 cheerio,這兩個是爬蟲工具經常使用的,我就不詳細介紹了,不知道的可以去搜尋看一下介紹;

主要程式碼

思路:

主要的程式碼內容很簡單,主要就是先獲取個人發帖列表,然後模擬訪問所有的帖子列表,獲得每個帖子的html文字,接著去爬取每篇帖子的評論id號,獲取到id號後就進行刪帖操作;

注意事項

這裡值得注意的是,當執行完刪除評論以後,你會發現還存在一部分評論,因為對於自己的評論是可以直接呼叫介面刪除的,但是對於別人的評論,需要呼叫另外一個介面才能刪除,並且需要填寫刪除原因,所以第一步操作是刪除自己所有的評論,然後第二步是刪除其他人所有的評論;最後一步才是刪除所有帖子;

目錄結構

就是最簡單的目錄結構,直接在一個專案資料夾中執行npm init 

然後建立一個douSpider.js檔案,npm 安裝 superagent 和 cheerio

使用node指令碼全自動刪除豆瓣評論與帖子

程式碼

douSpider.js

//豆瓣刪帖
var superagent = require(`superagent`);//引入superagent 外掛
var cheerio = require(`cheerio`);//引入cheerio

//Cookie
var Cookie=`填寫你的Cookie值`;
//host
var host =`www.douban.com`;
//Origin
var Origin =`https://www.douban.com`;
//Referer
var Referer = `https://www.douban.com/group/`;
//引數ck
var ck =`填寫你的ck值`;

//獲取個人帖子列表
getTopic =function () {
    //這裡需要注意的是需要點選到小組,你釋出的列表
    var url = `https://www.douban.com/group/people/1732*****(填入自己的url)/publish`;
    superagent
        .get(url)
        .set(`Cookie`,Cookie)
        .set(`Host`,host)
        .set(`Referer`,Referer)
        .end(function (err,res) {
            if(err){
                return err
            }
            var $=cheerio.load(res.text);
         var urlList=[];
         $(`.title a`).each(function (index,element) {
            var $element = $(element);
            var href =$element.attr(`href`);
            var href_item = href.split(`/`);
            urlList.push(href_item[5]);
         });
         for(var i =0;i<urlList.length;i++){
             console.log(`正在處理第`+i+`帖子`);
             spider(urlList[i]);
             // 第三執行刪帖操作
            //removeTopic(urlList[i]);
            }
      })
};
//獲取指定帖子的cid
spider = function (topic) {
    var url = `https://www.douban.com/group/topic/`+topic+`/`;
    superagent
        .get(url)
        //請求結束後的操作
        .end(function (err, res) {
            if (err) {
                console.log(err);
                return err;
            }
            //解析請求後得到的body資料
            var $=cheerio.load(res.text);
            var cid=[];
            $(`#comments li`).each(function (index,element) {
                var $element = $(element);
                cid.push($element.attr(`data-cid`));
         });
            for(let i=0;i<cid.length;i++){
               console.log(`正在刪除第`+topic+`帖子的第`+i+`條評論`);
            // 第一次執行刪除自己的回覆
             removeComment(topic,cid[i]);

                //  第二次執行刪除其他人的回覆
            // removeOtherComment(topic,cid[i]);
            }
        });
};
//刪除帖子
removeTopic =function (topic) {
    var url3=`https://www.douban.com/group/topic/`+topic+`/remove?ck=`+ck;
   superagent
      .get(url3)
      .set(`Cookie`,Cookie)
      .set(`Host`,host)
      .set(`Referer`,Referer+`topic/`+topic+`/`)
      .end(function (err,res) {
         if(err){
            console.log(err);
            return err
         }
         console.log(`成功刪帖`);
      })
};
//刪除其他人評論
removeOtherComment=function (topic,cid) {
    var url2 =`https://www.douban.com/group/topic/`+topic+`/remove_comment?cid=`+cid;
   superagent
      .post(url2)
      .send({`cid`:cid,`ck`:ck,`reason`:`other_reason`,`submit`:`確定`})
      .set(`Cookie`,Cookie)
      .set(`Host`,host)
      .set(`Origin`,Origin)
      .set(`Content-Type`,`application/x-www-form-urlencoded`)
      .set(`Referer`,Referer+`topic/`+topic+`/remove_comment?cid=`+cid)
      .end(function (err,res) {
         if(err){
            console.log(err);
            return err
         }
         console.log(`成功刪除`);
      })
};
//刪除自己評論
removeComment =function (topic,cid) {
    var url1 = `https://www.douban.com/j/group/topic/`+topic+`/remove_comment`; //移除評論介面
    superagent
        .post(url1)
      .send({`cid`:cid,`ck`:ck})
        .set(`Cookie`,Cookie)
        .set(`Host`,host)
        .set(`Origin`,Origin)
        .set(`Content-Type`,`application/x-www-form-urlencoded`)
        .set(`Referer`,Referer+`topic/`+topic+`/`)
      .end(function (err,res) {
         if(err){
             console.log(err);
            return err
         }
         console.log(`成功刪除`);
      })

};
getTopic();

複製程式碼

使用

此指令碼已經放在了我個人git上,有興趣的可以fork一下,或者給個star,不勝感激;

使用方法,git上也有,我相信大家應該都會的;直接node 指令碼名.js 

git傳送門

使用node指令碼全自動刪除豆瓣評論與帖子

問題

目前本刪帖指令碼只適用於刪除所有帖子的評論,所以請慎用,我因為所有的帖子都是轉租資訊,所以可以一鍵放心刪除,如果你有重要資訊,請注意可以呼叫部分函式,填入你的指定帖子ID值進行刪除;

相關文章