百度贴吧登录过程分析
分析登錄過(guò)程的話(huà)有很多工具可供選擇,Fiddler等抓包工具都是很好的選擇。不過(guò)這次不需要,由于登錄過(guò)程需要在瀏覽器上完成,所以我們這次直接使用瀏覽器的F12開(kāi)發(fā)人員工具。火狐、Chrome、Edge的F12工具都差不多。這次我就以Edge的為例來(lái)說(shuō)明。
熟悉調(diào)試工具
一開(kāi)始由于我的調(diào)試姿勢(shì)不正確,所以浪費(fèi)了很多時(shí)間。在這里我把我的人生經(jīng)驗(yàn)分享一下。其實(shí)很簡(jiǎn)單,就是一句話(huà):瀏覽器必須進(jìn)入隱私模式。因?yàn)闉g覽器有可能保存以前的登錄信息、cookie等,對(duì)分析工作造成混淆影響。所以我們必須不斷地調(diào)試不斷地清除數(shù)據(jù)。不妨直接進(jìn)入隱私模式,這樣所有東西都是新的,方便我們分析。
來(lái)上兩張圖看看。首先是調(diào)試工具。在這里我們主要看的就是cookie的值。網(wǎng)頁(yè)登錄的每一步驟我們都需要看看新增加了什么cookie,哪些cookie在登錄過(guò)程中是必要的。這需要我們一步一步分析。
調(diào)試程序第二個(gè)部分就是網(wǎng)絡(luò)標(biāo)簽。在這里就是我們主要分析的地方了。登錄過(guò)程中哪一部分發(fā)送了什么類(lèi)型的數(shù)據(jù)、發(fā)到了哪個(gè)URL、服務(wù)器返回了什么結(jié)果,都需要我們分析,然后模擬出登錄過(guò)程。這里橫排的幾個(gè)按鈕還可以清除緩存、cookie、記錄等等,如果我們需要重復(fù)分析,這幾個(gè)按鈕是非常方便的。
網(wǎng)絡(luò)標(biāo)簽這里有一個(gè)小技巧,那就是內(nèi)容類(lèi)型這里。一個(gè)網(wǎng)頁(yè)常常包含了很多靜態(tài)文件、需要從很多CDN返回圖片等,但是這些都是和登錄內(nèi)容無(wú)關(guān)的東西。所以我們可以在這里選擇需要查看的內(nèi)容,圖片之類(lèi)的幾乎完全可以忽略(當(dāng)然如果遇到驗(yàn)證碼,還是需要分析一下)。
內(nèi)容過(guò)濾如果還有什么不熟悉的地方,最好自己打開(kāi)幾個(gè)網(wǎng)頁(yè),然后用開(kāi)發(fā)人員工具看看。一個(gè)合格的程序員,利用調(diào)試工具的技能肯定是必不可少的。另外Edge的開(kāi)發(fā)人員工具是中文的,對(duì)于英文不好的同學(xué)還是很友好的。
登錄過(guò)程分析
獲取BAIDUID
按照上面的技巧,打開(kāi)一個(gè)隱私模式網(wǎng)頁(yè),然后把開(kāi)發(fā)人員工具調(diào)教到合適的位置。然后進(jìn)入百度主頁(yè)面www.baidu.com。回到調(diào)試工具看看瀏覽器在這一步做了什么。
首先第一步是訪(fǎng)問(wèn)了https://www.baidu.com/ 這個(gè)地址,作用是設(shè)置了BAIDUID這個(gè)cookie。后續(xù)的請(qǐng)求我們都需要附上這個(gè)cookie。該cookie只有在附有UA的時(shí)候才會(huì)返回。
獲取登錄token
然后我們點(diǎn)擊百度首頁(yè)右上角的登錄,看看會(huì)發(fā)生什么。這一步步訪(fǎng)問(wèn)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 這個(gè)地址,可以看到它帶了很多參數(shù)。其中只有兩個(gè)參數(shù)需要我們注意:一是tt參數(shù),代表當(dāng)前時(shí)間的毫秒數(shù);二是gid,也就是GUID,我們用Python代碼就能生成。其他參數(shù)不變就行了。
這一步如果成功的話(huà),服務(wù)器就會(huì)返回一個(gè)JSONP。這里最重要的就是data中的token了。我們后續(xù)的登陸請(qǐng)求就需要這個(gè)玩意。
bd__cbs__m6q67t({"errInfo": {"no": "0"},"data": {"rememberedUserName": "","codeString": "","token": "7ddcb9b9dd7b57623a77730c53b4df76","cookie": "1","usernametype": "","spLogin": "rate","disable": "","loginrecord": {"email": [],"phone": []}} })獲取驗(yàn)證碼
這時(shí)候頁(yè)面上應(yīng)該已經(jīng)彈出登錄對(duì)話(huà)框了,有時(shí)候好像還是直接在頁(yè)面上登錄。這幾種登錄方式?jīng)]有區(qū)別,只不過(guò)上面的logintype參數(shù)可能會(huì)有不同的值,這不會(huì)影響我們的登錄過(guò)程。
在登錄框中輸入用戶(hù)名,當(dāng)輸入密碼的時(shí)候會(huì)彈出驗(yàn)證碼。然后我們返回開(kāi)發(fā)工具看看瀏覽器做了什么。
這次發(fā)出的請(qǐng)求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 ,這個(gè)URL其實(shí)很長(zhǎng),因?yàn)橛幸粋€(gè)很長(zhǎng)的dv參數(shù)。這個(gè)dv參數(shù)是登錄頁(yè)面隱藏表單域的一個(gè)部分,用的時(shí)候把它取出來(lái)即可。變化的只有一個(gè)編碼的用戶(hù)名參數(shù),剩下的基本都是固定值。
我們看到這個(gè)請(qǐng)求用到了用戶(hù)名,所以對(duì)于每個(gè)不同的用戶(hù)名,都會(huì)重新發(fā)送一次請(qǐng)求。如果你在登錄框中更改了用戶(hù)名,那么就會(huì)瀏覽器就會(huì)重新發(fā)送請(qǐng)求,順便驗(yàn)證碼也會(huì)刷新。
請(qǐng)求返回的結(jié)果同樣是JSONP。重點(diǎn)就是codeString和vcodetype兩個(gè)參數(shù)了。
bd__cbs__p5fzjy({"errInfo": {"no": "0"},"data": {"codeString": "tcG7d07e2dcb2f8c18d02dc14669801a07b9bcd440666043195","vcodetype": "46dbjrl3l5wu82vPoSiQz/tmNWQIm1xOR0JMD0I7U/UjpgY6Sye/mCtpzMJEvJTK3PJ2hGntFKiNnDNLxjd3bmxt7FlJ3yaomPUj","userid": "","mobile": ""} })由于我們把圖片的請(qǐng)求過(guò)濾了,所以調(diào)試工具只給出了這些請(qǐng)求。下面我們把圖片那一項(xiàng)選中,然后在網(wǎng)頁(yè)上選擇更新驗(yàn)證碼,看看會(huì)出現(xiàn)什么。
這次請(qǐng)求圖片的URL是https://passport.baidu.com/cgi-bin/genimage?tcG9c07c1deb266c1790286146443019a7f46b1430702017e69,這里的參數(shù)正是上面的codeString。而這個(gè)請(qǐng)求的返回值正是驗(yàn)證碼圖片。每次重新請(qǐng)求,都會(huì)發(fā)送一個(gè)新的驗(yàn)證碼圖片。看到這里,圖片這一塊的問(wèn)題就解決了。我們可以選擇再次過(guò)濾圖片請(qǐng)求。
然后我們?cè)诰W(wǎng)頁(yè)上填寫(xiě)驗(yàn)證碼,瀏覽器會(huì)將驗(yàn)證碼發(fā)送給服務(wù)器驗(yàn)證。在開(kāi)發(fā)人員工具中可以看到,這次的請(qǐng)求是https://passport.baidu.com/v2/?checkvcode&token=7ddcb9b9dd7b57623a77730c53b4df76&tpl=mn&apiver=v3&tt=1491499485871&verifycode=BFIM&codestring=tcG3907c1deb2eac174026314a24301df7f5820430750017e35&callback=bd__cbs__66bgjs,verifycode參數(shù)正是我們填寫(xiě)的驗(yàn)證碼,剩下的參數(shù)都已經(jīng)介紹過(guò)了。這次請(qǐng)求返回的結(jié)果會(huì)提示驗(yàn)證碼輸入是否正確。
獲取密鑰
瀏覽器還會(huì)發(fā)送請(qǐng)求https://passport.baidu.com/v2/getpublickey?token=571fd331d62e4c8dc56c4c9a8788e0b8&tpl=mn&apiver=v3&tt=1491559255612&gid=027CF18-F8F4-47EB-BD7C-A48337DD5F8F&callback=bd__cbs__m915m4來(lái)獲取加密密碼的密鑰。
請(qǐng)求的結(jié)果就是下面的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'})最終登錄
當(dāng)驗(yàn)證碼填寫(xiě)正確的時(shí)候,我們就可以點(diǎn)擊登錄按鈕登錄了。這次會(huì)向https://passport.baidu.com/v2/api/?login發(fā)送一個(gè)POST請(qǐng)求,請(qǐng)求體就是登錄所需要的全部信息了。
這些信息非常多,不過(guò)所有所需信息都在上面解釋過(guò)了。唯一需要注意的就是password參數(shù),這需要通過(guò)上面獲取的密鑰進(jìn)行加密。非常遺憾的是,具體的加密算法我沒(méi)有找到。看那些參數(shù)的名字我猜應(yīng)該是RSA加密,可惜我沒(méi)有從百度的一大堆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所以這篇文章只能到這里結(jié)束了。不過(guò)現(xiàn)在百度賬號(hào)的安全機(jī)制也比較完善了,基本上繞不過(guò)驗(yàn)證碼這道工序,也就是說(shuō)無(wú)論如何都必須人工登錄。所以有這功夫研究登錄過(guò)程不如直接把BDUSS參數(shù)復(fù)制過(guò)來(lái)省事,而且也更加安全。
參考資料
http://baogege.info/2016/04/21/baidu-login-with-httpclient/
https://zhuanlan.zhihu.com/p/25577023
總結(jié)
以上是生活随笔為你收集整理的百度贴吧登录过程分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 原创:卧龙凤雏得其一可安天下?其实后面还
- 下一篇: 第三章Selenide测试框架(三)