十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
本篇文章為大家展示了基于Anyproxyrhrh 使用"中間人攻擊"爬取公眾號(hào)推送,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)怒江州免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
以前博客一直使用的是別人制作的框架,typecho、WordPress等都有使用過(guò),但由于是別人的框架,始終不知道其內(nèi)部運(yùn)作的原理。這次使用Node.js完全重構(gòu)了一遍,使得我對(duì)整個(gè)博客的運(yùn)作原理清晰了許多,以前看起來(lái)很復(fù)雜的東西(WordPress 留下的第一印象,雖然WordPress其實(shí)不全是用來(lái)做博客的),現(xiàn)在看起來(lái)竟是這么簡(jiǎn)單,如果有用框架搭建博客的朋友,建議完全自己做一個(gè)試試。當(dāng)然,這些都不是本次推送的重點(diǎn),半自動(dòng)化爬取自己的公眾號(hào)推送才是重點(diǎn)。
爬取所需要的環(huán)境與工具:
后端:Node.js + MongoDB
代理服務(wù)器:Anyproxy
一個(gè)安卓模擬器
服務(wù)器環(huán)境:
Node.js + MongoDB
首先介紹一下Anyproxy, 這是一個(gè)基于Node.js的代理服務(wù)器,本項(xiàng)目中,Anyproxy的作用如下:若把我們本機(jī)當(dāng)做代理服務(wù)器,手機(jī)模擬器中的微信當(dāng)成客戶端,那么其運(yùn)作原理可以如下圖所示。手機(jī)客戶端(Client)發(fā)送請(qǐng)求給代理服務(wù)器(Server,即本機(jī)),本機(jī)再將這個(gè)請(qǐng)求發(fā)送給微信服務(wù)器,微信服務(wù)器返回信息需要經(jīng)過(guò)本機(jī),再由本機(jī)傳遞給手機(jī)客戶端。
在這個(gè)過(guò)程中,本機(jī)承擔(dān)中間人的作用,而接受到微信返回的信息后,我們可以對(duì)那個(gè)信息植入腳本,再發(fā)送給手機(jī)客戶端。這就是中間人攻擊。
對(duì)了,使用Anyproxy還有一個(gè)好處就是,它支持HTTPS,它能夠生成證書(shū),使得客戶端和代理服務(wù)器端互相信任,從而能接收HTTPS請(qǐng)求和回復(fù),而公眾號(hào)歷史消息中,許多請(qǐng)求都是HTTPS的。
步驟如下(參考自 :https://zhuanlan.zhihu.com/p/24302048)
1.新建一個(gè)Node.js項(xiàng)目,新建MongoDB數(shù)據(jù)庫(kù)(可先在本地上進(jìn)行調(diào)試),新建一個(gè)名為blog的庫(kù),名為articles的Collections.
2.運(yùn)行終端執(zhí)行下面這個(gè)命令安裝Anyproxy:
sudo npm -g install anyproxy
3.生成證書(shū),使其支持https
sudo anyproxy --root
4.啟動(dòng)Anyproxy, 運(yùn)行
sudo anyproxy -i
5.在安卓模擬器中安裝證書(shū):
啟動(dòng)Anyproxy, 在瀏覽器中訪問(wèn) localhost:8002/qr_root 可以獲取證書(shū)路徑的二維碼,移動(dòng)端安裝時(shí)會(huì)比較便捷,使用微信識(shí)別二維碼即可完成安裝。
6.設(shè)置代理,打開(kāi)模擬器的WiFi,修改WiFi-使用代理,代理服務(wù)器地址就是運(yùn)行anyproxy的電腦的ip地址。代理服務(wù)器默認(rèn)端口是8001。
現(xiàn)在微信上任何聯(lián)網(wǎng)操作,在運(yùn)行Anyproxy的終端中或打開(kāi) http://localhost:8002 應(yīng)該都可以看到服務(wù)器返回的信息了。如圖所示:
在這過(guò)程中,若你有任何疑問(wèn),可見(jiàn)最上面感謝的那篇文章。
接下來(lái)植入腳本,植入腳本我們是通過(guò)修改配置文件實(shí)現(xiàn)的。
配置文件地址:
Mac在 /usr/local/lib/node_modules/anyproxy/lib/.
Windows據(jù)說(shuō)在 APPdata\Roaming(若不是的話請(qǐng)找一下Windows npm默認(rèn)全局安裝的位置)。
我們只需要修改rule_default.js內(nèi)的replaceServerResDataAsync:function(req,res,serverResData,callback) 函數(shù)
由于那篇文章里是大型爬蟲(chóng)代碼,我只需要爬取個(gè)人公眾號(hào)的,因此對(duì)其進(jìn)行了修改,并轉(zhuǎn)換成了js代碼。代碼就先不貼了,有興趣可以見(jiàn)GitHub庫(kù):https://github.com/Ckend/GzhToBlog,喜歡請(qǐng)star一下,讓我有動(dòng)力更新。
步驟如下:
1.啟動(dòng)Anyproxy, 打開(kāi)公眾號(hào)的歷史消息列表,在 localhost:8002 觀察Anyproxy接收到的信息中哪一個(gè)是消息列表的。最后發(fā)現(xiàn)帶有profile-ext的鏈接的是消息列表相關(guān)的。
插句題外話,profile-ext里的-其實(shí)是_才對(duì),但是公眾號(hào)推送檢測(cè)文章里是否引用了別的公眾號(hào)的文章竟然就是通過(guò)這個(gè)關(guān)鍵詞,驚了個(gè)呆,知道我浪費(fèi)了半小時(shí)來(lái)找這篇文章的錯(cuò),最后發(fā)現(xiàn)是這里的表情是怎樣的嗎。
2.于是對(duì)帶有profile-ext的鏈接的回復(fù)(有兩種,一種是頁(yè)面格式,一種是json(第二頁(yè)以后就是json))進(jìn)行植入腳本。將其返回的所有信息存入之前所創(chuàng)建的MongoDB數(shù)據(jù)庫(kù)blog里的Collections中(見(jiàn)GitHub里rule_default.js文件的getToMongodb()函數(shù),建議先連接本地的MongoDB,成功后再連接服務(wù)器的)。
3.在模擬器上往下拖,保存所有的推送。
4.新建一個(gè)js文件,負(fù)責(zé)通過(guò)前面所爬取到的articles里的文章鏈接爬取文章并保存到數(shù)據(jù)庫(kù)中(GitHub里對(duì)應(yīng)crawl.js)。
5.大功告成,接下來(lái)就差前端渲染數(shù)據(jù)展現(xiàn)博客了。
上述內(nèi)容就是基于Anyproxyrhrh 使用"中間人攻擊"爬取公眾號(hào)推送,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。