Python爬蟲(chóng)-百度模擬登錄(一)

千呼萬(wàn)喚屎出來(lái)呀奥溺,百度模擬登錄終于要呈現(xiàn)在大家眼前了谚赎,最近比較忙壶唤,晚上又得早點(diǎn)休息棕所,這篇文章寫(xiě)了好幾天才完成琳省。這個(gè)成功以后针贬,我打算試試百度網(wǎng)盤(pán)的其他接口實(shí)現(xiàn)桦他】煅梗看看能不能把服務(wù)器文件上傳到網(wǎng)盤(pán)蔫劣,好歹也有幾T的空間。

登錄百度

先清理瀏覽器緩存歪沃,打開(kāi)Charles沪曙,登錄一次百度主頁(yè)珊蟀,抓取到登錄過(guò)程育灸。


本來(lái)是想改一下寫(xiě)作的格式磅崭,美觀一些砸喻,但是想了想割岛,還是按照分析的順序來(lái)寫(xiě)癣漆,這樣有利于大家了解一種分析的思路惠爽』樗粒看過(guò)上一篇新浪微博PC端模擬登陸的應(yīng)該知道,首先要找到登錄的請(qǐng)求用僧,一般為post永毅,地址中有l(wèi)ogin

請(qǐng)求找到了,參數(shù)......意蛀,太TM多了健芭。先觀察一下參數(shù)慈迈,一般無(wú)序痒留、隨機(jī)伸头、沒(méi)有什么規(guī)則的參數(shù)有可能是變化參數(shù)恤磷,其他的一般都是固定參數(shù)。當(dāng)然匈子,也可以多次登錄抓包旬牲,對(duì)比一下大概也能確定。那么我們確定一下變化的參數(shù):token堕仔、tt(時(shí)間戳)摩骨、codestring恼五、gid灾馒、password睬罗、verifycode(驗(yàn)證碼)容达、rsakey花盐、ppui_logintime算芯、fp_uid也祠、fp_info诈嘿、dv奖亚、traceid

參數(shù)分析

確定了需要分析的參數(shù)昔字,從哪個(gè)開(kāi)始分析呢作郭?隨意吧

一般有些參數(shù)之間是有關(guān)系的夹攒,比如token的請(qǐng)求參數(shù)里需要gid參數(shù)
這里我就不一一去分析參數(shù)間的關(guān)系了压语,直接來(lái)了啊

參數(shù) gid

一方面其他參數(shù)需要它胎食,另外就是這個(gè)參數(shù)是完全由本地js生成的厕怜。先看一下這個(gè)參數(shù)

搜索一下這個(gè)值酣倾,沒(méi)有。那么我們?cè)賮?lái)搜一下這個(gè)name映之,就是gid蜡坊,之前說(shuō)過(guò)我們一般是找xxx=這種蠢甲,先來(lái)搜一下gid=

點(diǎn)擊loginv4_9f3632a.js鹦牛,然后在JavaScript頁(yè)簽搜索gid=

有好幾個(gè)曼追,我圈出了這個(gè)getqrcode?請(qǐng)求礼殊,為啥捏碟狞?看圖篷就,我們找到這個(gè)請(qǐng)求

看到請(qǐng)求里的gid值了嗎?跟我們登錄的gid是一樣的及舍,那就確定是這個(gè)地方了锯玛,gid=e.guideRandom攘残,然后在這個(gè)腳本里搜一下guideRandom

然后翻譯一下這個(gè)js歼郭,這......就自己去琢磨吧

參數(shù) token

先搜索token的值

得到請(qǐng)求地址:https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt=1520951400830&class=login&gid=E8ED064-D480-4F3E-A5CE-BCF25F8DD1E2&loginversion=v4&logintype=dialogLogin&traceid=&callback=bd__cbs__6l1agx

就剩下callback漾根,其他的請(qǐng)求里也需要callback這個(gè)

搜一下bd__cbs__辐怕,為啥要搜這個(gè)寄疏?這個(gè)真的很痛苦妖泄,callback搜出來(lái)一大片蹈胡,而且沒(méi)看出來(lái)什么有效數(shù)據(jù)罚渐,值又搜不到荷并,那就搜一半吧源织,你問(wèn)我為啥谈息?第六感侠仇,不管你信不信逻炊,反正我是信了

其實(shí)呢豹休,有好幾個(gè)請(qǐng)求都有這個(gè)參數(shù)callback慕爬,然后我們觀察這些callback的規(guī)律医窿,基本就是這個(gè)bd__cbs__沒(méi)變姥卢,所以可以搜一下它試試独榴,搜到兩個(gè)

分析一下這段代碼瓶堕,基本就是c.getUniqueId這個(gè)函數(shù)了郎笆,搜一下這個(gè)函數(shù)

oj8k宛蚓,找到了凄吏,代碼貼下面痕钢,為什么這么寫(xiě)盖喷?自己查js去,當(dāng)然有更簡(jiǎn)單了pyv8或者psexecjs

Token這里我要再說(shuō)一下,參數(shù)我們分析完了,你以為請(qǐng)求就成功了嗎步势?

Oh坏瘩!yeah,之前我們都是得到所有請(qǐng)求參數(shù)就訪問(wèn)成功了
就這里卡了我好長(zhǎng)時(shí)間漠魏。那么碰到這種情況要從那幾個(gè)點(diǎn)著手呢倔矾,首先我想到的是cookies
然后向上去找Set Cookie的地方

訪問(wèn)首頁(yè)得到四個(gè)cookie值,H_PS_PSSID、BIDUPSID哪自、PSTM丰包、BAIDUID


這里又找到一個(gè)BDORZ壤巷,首頁(yè)很簡(jiǎn)單邑彪,沒(méi)有什么參數(shù),

注意看這幾個(gè)參數(shù)胧华,就在上面四個(gè)cookies中寄症,t是時(shí)間戳,參數(shù)都搞定了撑柔,那么Token的cookies也都搞定了瘸爽,終于可以成功了,圖樣圖森破铅忿,還是不行剪决。MMP,cookies搞定都不行檀训,我還有招柑潦,請(qǐng)求頭!>臁渗鬼!瀏覽器里直接拷過(guò)去,看你還想咋的

然鵝....荧琼,算你狠譬胎,不過(guò)我不會(huì)輕易認(rèn)輸?shù)?div id="6syq4aw" class="image-package">

調(diào)試他娘的,一遍一遍又一遍命锄,兩遍三遍四五遍堰乔,各種姿勢(shì)都試了,終于高潮要來(lái)了脐恩,特么的請(qǐng)求不一樣

先上圖
瀏覽器的正常請(qǐng)求

程序發(fā)送的請(qǐng)求

看到不一樣了吧镐侯,為什么呢?我們?cè)谟胷equests庫(kù)的時(shí)候驶冒,get請(qǐng)求我比較習(xí)慣用.get(url, params=data)苟翻,參數(shù)用params的方式傳入,再來(lái)看一下Token請(qǐng)求的參數(shù)

getapi是空骗污,那很明顯
data = {
  "getapi":"",
  "tpl":"mn",
  ....
}
session.get(url, params=data)

然后發(fā)送的請(qǐng)求就是/v2/api/?getapi=&tpl=mn&....崇猫,實(shí)際上正常的請(qǐng)求是/v2/api/?getapi&tpl=mn&...,竟然還有這種操作身堡,我真的是第一次碰到邓尤,改一下

data = {
  "tpl":"mn",
  ...
}
url = ".../v2/api/?getapi&{}".format(urlencode(data))
session.get(url)

到這里才算OK了,最后總結(jié)了一下敞葛,請(qǐng)求的那個(gè)坑熊尉、請(qǐng)求頭中的Referer、cookies辐啄,終于可以說(shuō)一句OJ8K

參數(shù) dv

為什么要先說(shuō)這個(gè)dv澈魄,首先這個(gè)我沒(méi)完全破解景鼠,另外就算你用固定值,也不影響結(jié)果痹扇,這個(gè)不能詳細(xì)說(shuō)铛漓,否則得好幾帖子,我們先搜dv=

切換到j(luò)avascript頁(yè)簽

我們可以搜一下dv_Input這個(gè)控件鲫构,它是沒(méi)有的浓恶,我就不展示了,然后應(yīng)該就是window.LG_DV_ARG了
這里有dvjsinput结笨,上圖我們也看到了這個(gè)包晰,切換到j(luò)avascript頁(yè)簽看一下

然后打開(kāi)瀏覽器,清空緩存炕吸,打開(kāi)隱身窗口伐憾,打開(kāi)開(kāi)發(fā)者工具,訪問(wèn)百度首頁(yè)

觀察一下dv值的特點(diǎn)赫模,可以找一些比較有特色的部分搜一下树肃,比如tk、@瀑罗,這樣盡量減少我們調(diào)試js的過(guò)程胸嘴,因?yàn)檎娴暮芡纯?div id="4ioygco" class="image-package">