本文作者
作者:星星在線, 簡書地址:https://www.jianshu.com/u/680e0e38ddc9
千呼萬喚shi出來呀,百度模擬登錄終於要呈現在大家眼前了,最近比較忙,晚上又得早點休息,這篇文章寫了好幾天才完成。這個成功以後,我打算試試百度網盤的其他接口實現。看看能不能把伺服器文件上傳到網盤,好歹也有幾T的空間。
先清理瀏覽器緩存,打開Charles,登錄一次百度主頁,抓取到登錄過程。
本來是想改一下寫作的格式,美觀一些,但是想了想,還是按照分析的順序來寫,這樣有利於大家了解一種分析的思路。看過上一篇新浪微博PC端模擬登陸的應該知道,首先要找到登錄的請求,一般為post,地址中有login
請求找到了,參數.,太TM多了。先觀察一下參數,一般無序、隨機、沒有什麼規則的參數有可能是變化參數,其他的一般都是固定參數。當然,也可以多次登錄抓包,對比一下大概也能確定。那麼我們確定一下變化的參數:token、tt(時間戳)、codestring、gid、password、verifycode(驗證碼)、rsakey、ppui_logintime、fp_uid、fp_info、dv、traceid
確定了需要分析的參數,從哪個開始分析呢?隨意吧
一般有些參數之間是有關係的,比如token的請求參數裡需要gid參數
這裡我就不一一去分析參數間的關係了,直接來了啊
一方面其他參數需要它,另外就是這個參數是完全由本地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值,H_PS_PSSID、BIDUPSID、PSTM、BAIDUID
這裡又找到一個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嘛,我沒搞定,不過發現沒啥意義,寫固定值也可以,也就不用費心去找這個了。
夏天來了,推薦一款潮爆的T恤!
點擊下方閱讀原文,加入編程互助學習社群