Python爬蟲之模擬登錄wechat
不知何時,微信已經成為我們不可缺少的一部分了,我們的社交圈、關注的新聞或是公眾號、還有個人信息或是隱私都被綁定在了一起。既然它這麼重要,如果我們可以利用爬蟲模擬登錄,是不是就意味著我們可以獲取這些信息,甚至可以根據需要來對它們進行有效的查看和管理。是的,沒錯,這完全可以。本篇博主將會給大家分享一下如何模擬登錄,並展示模擬登錄後獲取的好友列表信息。
微信模擬登錄的過程比較複雜,當然不管怎麼樣方法都是萬變不離其宗,我們還是使用抓包工具來模擬登錄的過程。
好了,下面讓我們一步一步的詳細講解一下如何實現的這個複雜的過程。
1. 用fiddler模擬登錄的請求
然後我們使用手機微信掃描並確認,這時候網頁版的微信就登陸了。
好,我們去看看都給我們抓取了什麼信息包。由於過程中發出的請求有點多,這裡把抓包按操作進行分解並逐一分析。
1.打開微信網頁
這一步驟的抓包是這樣的,發現其中的兩個鏈接是我們需要的。
於是點開詳細分析一下。
第一個鏈接如下,是一個請求,可以看到uri中攜帶了一些參數。
GET /jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=1520350213674 HTTP/1.1
經過多次抓取發現參數都是固定的,而是一串變化的數字,我們在之前模擬京東商城的文章提過,它其實是一個,如果不清楚可以回顧一下Python爬蟲之模擬登錄京東商城。
知道這些參數,模擬get發送出去就可以了。那麼我們為什麼要模擬這一步呢?
是因為訪問這個鏈接會有如下的響應,而其中有我們後續需要的重要信息(後面步驟會提到)。
window.QRLogin.code = 200; window.QRLogin.uuid= "Idf_QdW1OQ==";
2.模擬獲取二維碼
微信網頁提供的登錄方式是掃碼,我們模擬也無法避開,因此也要進行掃碼驗證。回到瀏覽器,使用開發者工具可以輕鬆找到二維碼的鏈接。
我們發現最後的字元串是變化的。等等,它和一模一樣的。沒錯,它就是,用來保證二維碼的唯一性。
因此,我們將上面提取的拼接到後面就可以得到二維碼圖片了,然後進行掃碼確認操作。
3.識別登錄狀態
為了識別掃碼是否成功,這個步驟我們需要用到上面提到的第二個鏈接。
GET /cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=Idf_QdW8OQ==&tip=1&r=68288473&_=1520050213675 HTTP/1.1
這個鏈接也是個,同樣攜帶了一些參數。
那麼我們如何判斷二維碼是否被掃描或者已經登陸了呢?
還是通過響應的數據來進行判斷的。經分析發現如果二維碼一直沒被掃,那麼響應是這樣的:
window.code=408;
但是如果二維碼被掃描了,響應是這樣的:
window.code=201;window.userAvatar = .....
window.code=200;
window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AaL_Xd5muLPKNVY_Hzt_uoBs@qrticket_0&uuid=gbJqPdkNSQ==&lang=zh_CN&scan=1520353803";
說明二維碼被掃描成功了。
說明是登錄成功了。
4.登錄
掃描了二維碼之後,fiddler上會多出幾個新的請求。
你可能發現了,上一步驟中後面有個,這個uri就是此步驟中跳轉的登錄鏈接。
GEThttps://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AaL_Xd5muLPKNVY_Hzt_udBs@qrticket_0&uuid=gbJqPdfNSQ==&lang=zh_CN&scan=1520353803&fun=new&version=v2 HTTP/1.1
通過上一步驟識別登錄成功的響應我們可以得到響應裡面的所有參數。沒錯,這些參數正好可以用在正式登錄(即跳轉鏈接)的請求中。於是我們利用這些參數再進行一次。攜帶參數如下:
當然,這個登錄請求同樣也會返回一些響應代碼,響應代碼如下:
0
OK
xxx
xxx
xxx
xxx
1
又是一堆參數,簡直沒完沒了啊。別著急,我們已經接近成功了。獲取這個響應我們一樣需要將其中的參數全部提取出來供下一請求使用。
5.初始化同步
好了,終於到了最後一步了,就是微信的初始化和同步的請求了,初始化信息鏈接如下:
POST https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=64629109&pass_ticket=4dU5IS9EqtXt5cIV2Gni1tKG7m2V56PXk5XI%252BdjdrIk%253D HTTP/1.1
GEThttps://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?pass_ticket=4dU5IS9EqtXt5cIV2Gni1tKG7m2V56PXk5XI%252BdjdrIk%253D&r=1520353806102&seq=0&skey=@crypt_a82dd73a_3885c878ae2f4590f7b2b5ee949dd1bd HTTP/1.1
uri中參數在上一步的響應中已獲取,直接發送請求即可完成。從這兩個鏈接的響應中,我們就可以得到一些真實有用的信息了。
還有一個同步的請求鏈接,所需參數可以從上面兩個鏈接響應中提取。但是至此我們通過上面兩個鏈接已經可以獲取我們想要的信息,因此可以不必請求這個同步鏈接。
GEThttps://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=1520353806125&skey=%40crypt_a82dd73a_3885c878ae2f4590f7b2b5ee949dd1bd&sid=O2Se5s2LJzPebME2&uin=254891255&deviceid=e289448639092966&synckey=1_694936977%7C2_694936979%7C3_694936982%7C1000_1520324882&_=1520353793581 HTTP/1.1
基本的登錄過程就是這樣,有點複雜,博主總結了個流程圖供參考。
2. 代碼實現
請求模擬使用模塊完成,解析使用。這裡需要注意一下,如果運行一直報的錯,可以在request請求裡面加上了跳過證書認證來解決。
1.初始化參數
定義一個類,初始化實例的所有請求參數,定義二維碼的路徑。
2.請求uuid
使用正則對相應進行提取獲取,通過判斷請求是否成功,響應如下:
3.模擬獲取二維碼
使用uuid請求二維碼圖片,並根據操作系統自動打開。
4.識別登錄狀態
響應如下:
根據響應中的代碼識別登錄狀態。
408:超時
201:已掃描
200:已登錄
5.登錄
請求跳轉的登錄鏈接,提取響應代碼參數,響應如下:
6.初始化獲取信息
請求初始化的鏈接,獲取初始化響應數據。
請求的鏈接,獲取聯繫人、公眾號、群聊以及個人信息。響應代碼為格式,如下:
根據響應中欄位信息做信息操作,這裡是獲取好友列表,所以將其它欄位如公眾號、群聊、自己都去掉了,只保留好友信息。
7.主函數運行
3. 模擬登錄結果
好友列表如下:
這裡只截取一部分好友信息,大家看看簽名有沒有上榜的。當然,好友列表只是個例子,我們也可以對其它信息進行查看和管理或者數據分析。
4. 總結
本篇與大家分享了網頁版微信的模擬登錄過程。儘管過程中請求多有點複雜,但是只要我們仔細分析還是可以一步一步實現的,希望對大家有幫助,代碼已上傳到github:https://github.com/xiaoyusmd/webwx_login
完畢。
歡迎大家轉發分享,覺得好就給個贊把!
~發送獲取經典書籍電子書~
※看完此文再不懂區塊鏈算我輸,用Python從零開始創建區塊鏈
※Python爬蟲快手視頻
TAG:Python |