前情提要
最近由於轉租房子的事情,搞得很疲憊,前期沒考慮好就換了新的住處,導致需要自己轉租以前的房子,不然房東不退押金啊;怎麼辦,轉租唄,抄起傢伙就是幹,以前用過豆瓣小組轉過房子,這次也是一樣(我不是做廣告的,別打我!),拼命發帖,拼命自己頂帖啊,加了一二十個小組,發了一二十個貼子,本來想寫個指令碼定時頂帖呢,可無奈還需要搞驗證碼,工作事情多,沒時間做了,全自動頂帖的就人工代替了,偶爾一兩個小時頂一次;
前兩天剛轉租出去,本來想去豆瓣把帖子刪了,因為帖子中有太多的個人資訊,一個一個清空太麻煩。無奈看了一遍沒有刪帖的地方,後來才知道原來豆瓣刪帖必須是沒有評論的帖子才可以刪除,我看了一下我的帖子,瞬間石化,我自己的回覆都已經有上百條了,一個一個刪要到什麼時候啊;本能的我開始研究豆瓣刪除評論的介面呼叫規律,發現了規律後就擼起袖子幹;
豆瓣介面
由於豆瓣中的一些相關操作都是需要認證的,所以我們需要提前用瀏覽器登入進行操作,取到Cookie 和一個ck值,ck值具體什麼作用不是很清楚,不過大部分的操作都需要這個引數,這個引數的值基本沒有變化,很容易找到,最好刪帖前自己操作一下刪除評論就可以獲取到ck值,cid值就是評論的編號值,後續程式碼中有介紹相關引數獲取方式;
技術選型
以前做過node爬蟲工具,這次也一樣,不過這個相對更簡單點,只有兩個依賴包,一個是
superagent
一個是 cheerio
,這兩個是爬蟲工具經常使用的,我就不詳細介紹了,不知道的可以去搜尋看一下介紹;
主要程式碼
思路:
主要的程式碼內容很簡單,主要就是先獲取個人發帖列表,然後模擬訪問所有的帖子列表,獲得每個帖子的html文字,接著去爬取每篇帖子的評論id號,獲取到id號後就進行刪帖操作;
注意事項
這裡值得注意的是,當執行完刪除評論以後,你會發現還存在一部分評論,因為對於自己的評論是可以直接呼叫介面刪除的,但是對於別人的評論,需要呼叫另外一個介面才能刪除,並且需要填寫刪除原因,所以第一步操作是刪除自己所有的評論,然後第二步是刪除其他人所有的評論;最後一步才是刪除所有帖子;
目錄結構
就是最簡單的目錄結構,直接在一個專案資料夾中執行npm init
然後建立一個douSpider.js檔案,npm 安裝 superagent
和 cheerio
程式碼
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
問題
目前本刪帖指令碼只適用於刪除所有帖子的評論,所以請慎用,我因為所有的帖子都是轉租資訊,所以可以一鍵放心刪除,如果你有重要資訊,請注意可以呼叫部分函式,填入你的指定帖子ID值進行刪除;