百度贴吧登录过程分析
分析登錄過程的話有很多工具可供選擇,Fiddler等抓包工具都是很好的選擇。不過這次不需要,由于登錄過程需要在瀏覽器上完成,所以我們這次直接使用瀏覽器的F12開發人員工具。火狐、Chrome、Edge的F12工具都差不多。這次我就以Edge的為例來說明。
熟悉調試工具
一開始由于我的調試姿勢不正確,所以浪費了很多時間。在這里我把我的人生經驗分享一下。其實很簡單,就是一句話:瀏覽器必須進入隱私模式。因為瀏覽器有可能保存以前的登錄信息、cookie等,對分析工作造成混淆影響。所以我們必須不斷地調試不斷地清除數據。不妨直接進入隱私模式,這樣所有東西都是新的,方便我們分析。
來上兩張圖看看。首先是調試工具。在這里我們主要看的就是cookie的值。網頁登錄的每一步驟我們都需要看看新增加了什么cookie,哪些cookie在登錄過程中是必要的。這需要我們一步一步分析。
調試程序第二個部分就是網絡標簽。在這里就是我們主要分析的地方了。登錄過程中哪一部分發送了什么類型的數據、發到了哪個URL、服務器返回了什么結果,都需要我們分析,然后模擬出登錄過程。這里橫排的幾個按鈕還可以清除緩存、cookie、記錄等等,如果我們需要重復分析,這幾個按鈕是非常方便的。
網絡標簽這里有一個小技巧,那就是內容類型這里。一個網頁常常包含了很多靜態文件、需要從很多CDN返回圖片等,但是這些都是和登錄內容無關的東西。所以我們可以在這里選擇需要查看的內容,圖片之類的幾乎完全可以忽略(當然如果遇到驗證碼,還是需要分析一下)。
內容過濾如果還有什么不熟悉的地方,最好自己打開幾個網頁,然后用開發人員工具看看。一個合格的程序員,利用調試工具的技能肯定是必不可少的。另外Edge的開發人員工具是中文的,對于英文不好的同學還是很友好的。
登錄過程分析
獲取BAIDUID
按照上面的技巧,打開一個隱私模式網頁,然后把開發人員工具調教到合適的位置。然后進入百度主頁面www.baidu.com。回到調試工具看看瀏覽器在這一步做了什么。
首先第一步是訪問了https://www.baidu.com/ 這個地址,作用是設置了BAIDUID這個cookie。后續的請求我們都需要附上這個cookie。該cookie只有在附有UA的時候才會返回。
獲取登錄token
然后我們點擊百度首頁右上角的登錄,看看會發生什么。這一步步訪問https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt=1491554358163&class=login&gid=134D887-FD18-4D86-AED8-0880DCA39820&logintype=dialogLogin&callback=bd__cbs__m6q67t 這個地址,可以看到它帶了很多參數。其中只有兩個參數需要我們注意:一是tt參數,代表當前時間的毫秒數;二是gid,也就是GUID,我們用Python代碼就能生成。其他參數不變就行了。
這一步如果成功的話,服務器就會返回一個JSONP。這里最重要的就是data中的token了。我們后續的登陸請求就需要這個玩意。
bd__cbs__m6q67t({"errInfo": {"no": "0"},"data": {"rememberedUserName": "","codeString": "","token": "7ddcb9b9dd7b57623a77730c53b4df76","cookie": "1","usernametype": "","spLogin": "rate","disable": "","loginrecord": {"email": [],"phone": []}} })獲取驗證碼
這時候頁面上應該已經彈出登錄對話框了,有時候好像還是直接在頁面上登錄。這幾種登錄方式沒有區別,只不過上面的logintype參數可能會有不同的值,這不會影響我們的登錄過程。
在登錄框中輸入用戶名,當輸入密碼的時候會彈出驗證碼。然后我們返回開發工具看看瀏覽器做了什么。
這次發出的請求URL是https://passport.baidu.com/v2/api/?logincheck&token=7ddcb9b9dd7b57623a77730c53b4df76&tpl=mn&apiver=v3&tt=1491497010074&sub_source=leadsetpwd&username=%E9%82%AA%E7%8C%AB%E9%98%BF%E6%9E%AB&isphone=false&dv={dv}&callback=bd__cbs__p5fzjy ,這個URL其實很長,因為有一個很長的dv參數。這個dv參數是登錄頁面隱藏表單域的一個部分,用的時候把它取出來即可。變化的只有一個編碼的用戶名參數,剩下的基本都是固定值。
我們看到這個請求用到了用戶名,所以對于每個不同的用戶名,都會重新發送一次請求。如果你在登錄框中更改了用戶名,那么就會瀏覽器就會重新發送請求,順便驗證碼也會刷新。
請求返回的結果同樣是JSONP。重點就是codeString和vcodetype兩個參數了。
bd__cbs__p5fzjy({"errInfo": {"no": "0"},"data": {"codeString": "tcG7d07e2dcb2f8c18d02dc14669801a07b9bcd440666043195","vcodetype": "46dbjrl3l5wu82vPoSiQz/tmNWQIm1xOR0JMD0I7U/UjpgY6Sye/mCtpzMJEvJTK3PJ2hGntFKiNnDNLxjd3bmxt7FlJ3yaomPUj","userid": "","mobile": ""} })由于我們把圖片的請求過濾了,所以調試工具只給出了這些請求。下面我們把圖片那一項選中,然后在網頁上選擇更新驗證碼,看看會出現什么。
這次請求圖片的URL是https://passport.baidu.com/cgi-bin/genimage?tcG9c07c1deb266c1790286146443019a7f46b1430702017e69,這里的參數正是上面的codeString。而這個請求的返回值正是驗證碼圖片。每次重新請求,都會發送一個新的驗證碼圖片。看到這里,圖片這一塊的問題就解決了。我們可以選擇再次過濾圖片請求。
然后我們在網頁上填寫驗證碼,瀏覽器會將驗證碼發送給服務器驗證。在開發人員工具中可以看到,這次的請求是https://passport.baidu.com/v2/?checkvcode&token=7ddcb9b9dd7b57623a77730c53b4df76&tpl=mn&apiver=v3&tt=1491499485871&verifycode=BFIM&codestring=tcG3907c1deb2eac174026314a24301df7f5820430750017e35&callback=bd__cbs__66bgjs,verifycode參數正是我們填寫的驗證碼,剩下的參數都已經介紹過了。這次請求返回的結果會提示驗證碼輸入是否正確。
獲取密鑰
瀏覽器還會發送請求https://passport.baidu.com/v2/getpublickey?token=571fd331d62e4c8dc56c4c9a8788e0b8&tpl=mn&apiver=v3&tt=1491559255612&gid=027CF18-F8F4-47EB-BD7C-A48337DD5F8F&callback=bd__cbs__m915m4來獲取加密密碼的密鑰。
請求的結果就是下面的JSONP,包含了公鑰pubkey和密鑰key。
bd__cbs__ksjbq7({"errno":'0',"msg":'',"pubkey":'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXN3F7epcT2k2yjuw95Nd3iEDS\nz04mTwPUAOaZIQ+JWtawDWMh6+hpwnT8STs1fa5CZwb1L\/nam4zqu\/Y4zETCp\/uL\nSl8\/6jdNsjVtiyq+IlQ0IkmPHiSk022BfBw0RGrSMUGuPPvdjy0eJ5a5pzRYWfK7\nvJ0QdYEdTovg7hm70QIDAQAB\n-----END PUBLIC KEY-----\n',"key":'KTS4sxpzVAnKxSxAej7ZfPgZE5neIy85'})最終登錄
當驗證碼填寫正確的時候,我們就可以點擊登錄按鈕登錄了。這次會向https://passport.baidu.com/v2/api/?login發送一個POST請求,請求體就是登錄所需要的全部信息了。
這些信息非常多,不過所有所需信息都在上面解釋過了。唯一需要注意的就是password參數,這需要通過上面獲取的密鑰進行加密。非常遺憾的是,具體的加密算法我沒有找到。看那些參數的名字我猜應該是RSA加密,可惜我沒有從百度的一大堆JS中找到那段加密代碼。
apiver: v3callback: parent.bd__pcbs__6j4pnacharset: utf-8codestring: tcG0407c116b36dc11202ae14e24301427f443077f047e16countrycode: crypttype: 12detect: 1dv: MDEwAAoAyAAKAIAACAAAAF0HLFwIAFcjL5-f3lKfG9Nz7y7PS6s3kzZDthxYCACLqnvXF69nt3eXQ5t7q0-Pb4tDk1ObX49rr3ujY69vq2-_bBQIABMvLy8EBAgAGy8nJxkK0FQIACMvLypHWOjiiBAIABsnJy8r_zQICABDKysrKrq6ur_SzX1wICjsPgid: E2D73BA-FC75-44B1-A051-BA0E6B4F9ED9idc: isPhone: loginmerge: truelogintype: dialogLoginlogLoginType: pc_loginDialogmem_pass: onpassword: k2KCYNYLju5rt08imdZGdavn62s71kGnHYiALR%2FmZMmKfw2WgkNdkuddhqIm7QtSokqs84nDqyBh67cZRUV79iAEllJjO0l3lq1RMBmR49hMS1iKsIFiPUe%2F7NkooiVvaYCDqtZH1tHw3AtUkVKuL9O9lHswDDn%2Bwy9WTs%3Dppui_logintime: 91424quick_user: 0rsakey: 8qbRUQebUUsasdmeawvQNIAGvJqgT3DDsafeflg: 0splogin: ratestaticpage: https%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.htmlsubpro: token: 422d13308efaf3fb8aa05606c13147cctpl: mntt: 1491560392290u: https%3A%2F%2Fwww.baidu.com%2Fusername: %E5%86%B7%E6%BC%A0%E5%B0%98%E4%B8%96verifycode: %E6%9A%82%E5%81%9C所以這篇文章只能到這里結束了。不過現在百度賬號的安全機制也比較完善了,基本上繞不過驗證碼這道工序,也就是說無論如何都必須人工登錄。所以有這功夫研究登錄過程不如直接把BDUSS參數復制過來省事,而且也更加安全。
參考資料
http://baogege.info/2016/04/21/baidu-login-with-httpclient/
https://zhuanlan.zhihu.com/p/25577023
總結
以上是生活随笔為你收集整理的百度贴吧登录过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原创:卧龙凤雏得其一可安天下?其实后面还
- 下一篇: 第三章Selenide测试框架(三)