一、先說整體的解決方案
1、通過搜狗進(jìn)行公眾號文章的采集,這樣獲取到的文章URL是一個(gè)帶時(shí)間戳的臨時(shí)鏈接。
2、通過安卓模擬器+Anyproxy代理抓包分析微信客戶端打開臨時(shí)鏈接時(shí)與其服務(wù)器請求的協(xié)議內(nèi)容,得出永久鏈接。
3、通過按鍵精靈模擬或Python腳本在微信號上發(fā)送臨時(shí)鏈接內(nèi)容,只有在安卓模擬器上的微信號上發(fā)送了內(nèi)容,Anyproxy代理才能抓取到相關(guān)的包內(nèi)容。
二、再說具體的解決方案,主要是第2點(diǎn)
1、通過搜狗進(jìn)行公眾號文章的采集,這樣獲取到的文章URL是一個(gè)帶時(shí)間戳的臨時(shí)鏈接。在用這個(gè)做數(shù)據(jù)采集時(shí),經(jīng)常會出現(xiàn)“請輸入驗(yàn)證碼”。我嘗試用IP代理池,但目前尚未找到可以避免或叫解決這個(gè)問題的IP代理服務(wù)器。我這塊的處理方式是用動(dòng)態(tài)IP VPS服務(wù)解決。具體的解決步驟我這塊就不細(xì)講啦,因?yàn)檫@個(gè)不是本文章的重點(diǎn)。
2、通過安卓模擬器+Anyproxy代理抓包分析微信客戶端打開臨時(shí)鏈接時(shí)與其服務(wù)器請求的協(xié)議內(nèi)容,得出永久鏈接。我用的是win10系統(tǒng)。
1)一個(gè)微信客戶端:下載一個(gè)安卓模擬器,在這個(gè)模擬器上安裝一個(gè)微信app。
2)一個(gè)微信個(gè)人號:為了采集內(nèi)容不僅需要微信客戶端,還要有一個(gè)微信個(gè)人號專門用于發(fā)送臨時(shí)鏈接。
3)本地代理服務(wù)器系統(tǒng):使用的方法是通過Anyproxy代理服務(wù)器將臨時(shí)鏈接和永久鏈接發(fā)送到我們自己的服務(wù)器上進(jìn)行替換。具體安裝設(shè)置方法在后面詳細(xì)介紹。
我使用的是Anyproxy。這個(gè)軟件的特點(diǎn)是可以獲取到https鏈接的內(nèi)容。在2016年年初的時(shí)候微信公眾號和微信文章開始使用https鏈接。并且Anyproxy可以通過修改rule向服務(wù)器發(fā)送請求。下面開始介紹安裝與配置過程。
1、安裝NodeJS
2、在命令行或者終端運(yùn)行 npm install -g anyproxy
3、生成RootCA,https需要這個(gè)證書:運(yùn)行命令anyproxy --root
4、啟動(dòng)anyproxy運(yùn)行命令:win+R打開運(yùn)行,輸入anyproxy -i;參數(shù)-i是解析HTTPS的意思;
5、安裝證書,在安卓模擬器中安裝證書:啟動(dòng)anyproxy,瀏覽器打開http://localhost:8002/fetchCrtFile,能獲取rootCA.crt文件
6、設(shè)置代理:安卓模擬器的代理服務(wù)器地址是wifi鏈接的網(wǎng)關(guān),可以通過把dhcp設(shè)置為靜態(tài)后看到網(wǎng)關(guān)地址,看完后別忘了再設(shè)置為自動(dòng)。代理服務(wù)器默認(rèn)端口是8001。
檢測是否成功方法:打開模擬器上的微信,點(diǎn)擊到任意一個(gè)文章中,在終端都可以看到響應(yīng)的代碼滾動(dòng)。如果沒有出現(xiàn),請檢查手機(jī)的代理設(shè)置是否正確。我下面的截圖是打開瀏覽器地址http://localhost:8002看到anyproxy的web界面。
我在微信app上打開的是文章的臨時(shí)鏈接,通過協(xié)議分析可以知道永久鏈接是重定向到302時(shí)的location中。
4)修改Anyproxy文件rule_default.js,獲取抓包中的協(xié)議內(nèi)容。
rule_default.js文件在*\node_modules\anyproxy\lib\rule_default.js中,找到replaceServerResDataAsync: function(req,res,serverResData,callback) 函數(shù),修改函數(shù)內(nèi)容,劫取需要的內(nèi)容。因?yàn)槲抑恍枰偃》祷貫?02的code內(nèi)容,所以我只有當(dāng)statusCode==302時(shí)才callback。
找到replaceResponseHeader: function(req,res,header)函數(shù),修改函數(shù)內(nèi)容。獲取永久鏈接,調(diào)用我在服務(wù)器寫好的http接口,我這邊接口只有兩個(gè)參數(shù):臨時(shí)鏈接和永久鏈接,根據(jù)臨時(shí)鏈接增加永久鏈接。
好,到目前為止,通過使用Anyproxy把臨時(shí)鏈接轉(zhuǎn)永久鏈接的功能介紹完成啦。
PS:使用Anyproxy可以直接獲取微信公眾號的全部文章(永久鏈接),包括點(diǎn)贊數(shù),閱讀數(shù)之類的信息。這樣的話可以不用使用搜狗。不過這里會有些問題,微信會封你在做這個(gè)事情的微信個(gè)人號,所以我采取的是使用搜狗爬文章(急),再利用Anyproxy在臨時(shí)鏈接有效時(shí)間內(nèi)更新為永久鏈接。
3、通過按鍵精靈模擬在微信app上點(diǎn)擊臨時(shí)鏈接,或者也可以通過python腳本模擬。這塊我正在編寫,等完成之后再更新上來。