千呼萬喚屎出來呀,百度模擬登陸終於要呈如今你們眼前了,最近比較忙,晚上又得早點休息,這篇文章寫了好幾天才完成。這個成功之後,我打算試試百度網盤的其餘接口實現。看看能不能把服務器文件上傳到網盤,好歹也有幾T的空間。javascript
先清理瀏覽器緩存,打開Charles,登陸一次百度主頁,抓取到登陸過程。
原本是想改一下寫做的格式,美觀一些,可是想了想,仍是按照分析的順序來寫,這樣有利於你們瞭解一種分析的思路。看過上一篇新浪微博PC端模擬登錄的應該知道,首先要找到登陸的請求,通常爲post,地址中有login
java
請求找到了,參數......,太TM多了。先觀察一下參數,通常無序、隨機、沒有什麼規則的參數有多是變化參數,其餘的通常都是固定參數。固然,也能夠屢次登陸抓包,對比一下大概也能肯定。那麼咱們肯定一下變化的參數:token、tt(時間戳)、codestring、gid、password、verifycode(驗證碼)、rsakey、ppui_logintime、fp_uid、fp_info、dv、traceidpython
肯定了須要分析的參數,從哪一個開始分析呢?隨意吧
通常有些參數之間是有關係的,好比token的請求參數裏須要gid參數
這裏我就不一一去分析參數間的關係了,直接來了啊
api
一方面其餘參數須要它,另外就是這個參數是徹底由本地js生成的。先看一下這個參數
搜索一下這個值,沒有。那麼咱們再來搜一下這個name,就是gid,以前說過咱們通常是找xxx=這種,先來搜一下gid=
點擊loginv4_9f3632a.js,而後在JavaScript頁籤搜索gid=
有好幾個,我圈出了這個getqrcode?請求,爲啥捏?看圖,咱們找到這個請求
看到請求裏的gid值了嗎?跟咱們登陸的gid是同樣的,那就肯定是這個地方了,gid=e.guideRandom,而後在這個腳本里搜一下guideRandom
而後翻譯一下這個js,這......就本身去琢磨吧
瀏覽器
先搜索token的值
獲得請求地址: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,其餘的請求裏也須要callback這個
搜一下bd__cbs__,爲啥要搜這個?這個真的很痛苦,callback搜出來一大片,並且沒看出來什麼有效數據,值又搜不到,那就搜一半吧,你問我爲啥?第六感,無論你信不信,反正我是信了
服務器
其實呢,有好幾個請求都有這個參數callback,而後咱們觀察這些callback的規律,基本就是這個bd__cbs__沒變,因此能夠搜一下它試試,搜到兩個
分析一下這段代碼,基本就是c.getUniqueId這個函數了,搜一下這個函數
oj8k,找到了,代碼貼下面,爲何這麼寫?本身查js去,固然有更簡單了pyv8或者psexecjs微信
Token這裏我要再說一下,參數咱們分析完了,你覺得請求就成功了嗎?
Oh!yeah,以前咱們都是獲得全部請求參數就訪問成功了
就這裏卡了我好長時間。那麼碰到這種狀況要從那幾個點着手呢,首先我想到的是cookies
而後向上去找Set Cookie的地方
cookie
訪問首頁獲得四個cookie值,H_PS_PSSID、BIDUPSID、PSTM、BAIDUIDsession
這裏又找到一個BDORZ,首頁很簡單,沒有什麼參數,
注意看這幾個參數,就在上面四個cookies中,t是時間戳,參數都搞定了,那麼Token的cookies也都搞定了,終於能夠成功了,圖樣圖森破,仍是不行。MMP,cookies搞定都不行,我還有招,請求頭!!!瀏覽器裏直接拷過去,看你還想咋的
然鵝....,算你狠,不過我不會輕易認輸的
調試他孃的,一遍一遍又一遍,兩遍三遍四五遍,各類姿式都試了,終於高潮要來了,特麼的請求不同
先上圖
看到不同了吧,爲何呢?咱們在用requests庫的時候,get請求我比較習慣用.get(url, params=data),參數用params的方式傳入,再來看一下Token請求的參數
getapi是空,那很明顯
data = { "getapi":"", "tpl":"mn", .... } session.get(url, params=data)
而後發送的請求就是/v2/api/?getapi=&tpl=mn&....,實際上正常的請求是/v2/api/?getapi&tpl=mn&...,居然還有這種操做,我真的是第一次碰到,改一下
data = { "tpl":"mn", ... } url = ".../v2/api/?getapi&{}".format(urlencode(data)) session.get(url)
到這裏纔算OK了,最後總結了一下,請求的那個坑、請求頭中的Referer、cookies,終於能夠說一句OJ8K
爲何要先說這個dv,首先這個我沒徹底破解,另外就算你用固定值,也不影響結果,這個不能詳細說,不然得好幾帖子,咱們先搜dv=
切換到javascript頁籤
咱們能夠搜一下dv_Input這個控件,它是沒有的,我就不展現了,而後應該就是window.LG_DV_ARG了
這裏有dvjsinput,上圖咱們也看到了這個,切換到javascript頁籤看一下
而後打開瀏覽器,清空緩存,打開隱身窗口,打開開發者工具,訪問百度首頁
觀察一下dv值的特色,能夠找一些比較有特點的部分搜一下,好比tk、@,這樣儘可能減小咱們調試js的過程,由於真的很痛苦
在console裏面執行一下這個計算,跟咱們dv前面的值是否是相似,那就是它了,無論你是否是我都認爲是。而後再搜一下@
剛纔計算的Token+@+Ue(xx),這個確定就是dv了,至於Ue嘛,我沒搞定,不過發現沒啥意義,寫固定值也能夠,也就不用費心去找這個了。
---
---
太多了,因此這裏就分割一下,剩下的下一篇再繼續
若是你以爲個人文章還能夠,能夠關注個人微信公衆號:Python爬蟲實戰之路
也能夠掃描下面二維碼,添加個人微信號