pyhon3模擬登入百度(2)—— 使用IE11理清百度登入內部邏輯和分析請求傳送資料
依照思路來,第一步就是難點和重點,搞清楚了網頁登入的內部邏輯,才能進行下一步的模擬登入。
這裡,我的瀏覽器是IE11。因為已經看了一篇手把手教學分析登入邏輯的文章,所以這裡寫的要節省多了。
通過分析發現登入的網址是https://passport.baidu.com/v2/api/?login
檢視請求正文資訊,通過檢視該部分資訊可以知道向伺服器提交了什麼資料,然後分析查詢這些資料,最後構造出來這些資料,用程式模擬傳送,這樣就可以完成了模擬登入。
所以重點就集中了搞清楚要傳送那些資料,因為資料太多,有些資料可以不必傳送(比如預設值),有些資料雖然有值但是也不必發(比如登入時間等)但是有些資料的值需要順藤摸瓜查找出來(這些每次登入值都不同,但是這些值又必須要傳送才能登入成功),有些值看起來是固定不變的我們就設定成一樣的傳送就是了。
以下程式碼為某次登入百度的請求正文:
[python] view plaincopyprint?- staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html&
- charset=utf-8&
- token=7df2c14c85ae5b4ac28e55671d91f835&
- tpl=mn&
- subpro=&
- apiver=v3&
- tt=1412564377876&
- codestring=&
-
safeflg=0
- u=http%3A%2F%2Fwww.baidu.com%2F&
- isPhone=false&
- quick_user=0&
- logintype=dialogLogin&
- logLoginType=pc_loginDialog&
- idc=&
- loginmerge=true&
- splogin=rate&
- username=xxxxxxx&
-
password=eqCh%2BjZOsT7dfR%2FLeCrmaU95YOejUlifw5PM1Yt9i0ahYPbgMGHhW%2F3eeGbA3MZpKPVKS8ce9sFNKuStEJr8KTDnzH1zxEL9OyH655VBJ139Jip
- verifycode=&
- mem_pass=on&
- rsakey=QNxGSHNrbmjoknFRAniMpPQDfCQaliA8&
- crypttype=12&
- ppui_logintime=448151&
- callback=parent.bd__pcbs__md9bav
分析資料:
staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html&
看上貌似亂碼後的URL,其實是編碼後的結果。在請求傳送資料時我們必須用到正規的URL,所以需要找到原先正確的URL,而Python已有相關的模組可以處理。
[python] view plaincopyprint?- import urllib.parse
- encodeUrl = "http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html"
- decodeUrl = urllib.parse.unquote(encodeUrl)
- print(decodeUrl)
輸出可以得到URL為:http://www.baidu.com/cache/user/html/v3Jump.html
charset=utf-8
擺明編碼的值,固定的。按此值傳送。
token=7df2c14c85ae5b4ac28e55671d91f835
這個token後面的值一看就不像固定的值,要與不要會不會影響傳送,後面才知道,暫時忽略。
tpl=mn
看似固定值,按此值傳送。
subpro=
省略。
apiver=v3
API版本號,固定值。按此值傳送。
tt=1412564377876
這個token後面的值一看就不像固定的值,要與不要會不會影響傳送,後面才知道,暫時忽略。
codestring=
省略。
safeflg=0
安全標誌?固定值,按此值傳送。
u=http%3A%2F%2Fwww.baidu.com%2F
一個固定URL,但是看似不重要。省略。
isPhone=false
是否手機登入,我用PC,當然False,按此值傳送。
quick_user=0
不明,看似固定值,按此值傳送。
logintype=dialogLogin
固定值,按此值傳送。
logLoginType=pc_loginDialog
固定值,按此值傳送。
idc=
省略。
loginmerge=true
不明,按此值傳送。
splogin=rate&
不明,按此值傳送。
username=xxxxxxxx
使用者名稱,這個就需要填寫你的使用者名稱。這裡可以用個變數來代替。
password=eqCh%2BjZOsT7dfR%2FLeCrmaU95YOejUlifw5PM1Yt9i0ahYPbgMGHhW%2F3eeGbA3MZpKPVKS8ce9sFNKuStEJr8KTDnzH1zxEL9OyH655VBJ139Jip%2F2clofLPqVfsp1oTSfwFkCSpifCEN9t%2BeM2lAWqbfcoK5O7dbx1N6NjPo1%2FQ%3D
一看密碼就是被處理過的,看來需要知道密碼如何被處理後,才能正確傳送密碼值。
verifycode=
省略。
mem_pass=on
是否記住下次登入。按此值傳送。
rsakey=QNxGSHNrbmjoknFRAniMpPQDfCQaliA8
RSA的值一想就不是固定的,看來也要想辦法得到這個值。
crypttype=12
不明,按此值傳送。
ppui_logintime=448151
貌似一個登陸時間的值,省略。
callback=parent.bd__pcbs__md9bav
呼叫函式,試了幾次登入,這個值也是隨機的?暫時忽略。
把這些要傳送的資料總結成一個清晰的Python程式碼中如下:
[python] view plaincopyprint?- postDict = {
- "staticpage" : "http://www.baidu.com/cache/user/html/v3Jump.html",
- "charset" : "utf-8",
- # "token" :"7df2c14c85ae5b4ac28e55671d91f835", #暫時省略
- "tpl" : "mn",
- #"subpro" : "",
- "apiver" : "v3",
- # "tt" : "1412564377876", #暫時省略
- # "codestring" : "",
- "safeflg" : "0",
- # "u" : "http%3A%2F%2Fwww.baidu.com%2F&", #暫時省略
- "isPhone" : "false",
- "quick_user" : "0",
- "logintype" : "dialogLogin",
- "logLoginType" : "pc_loginDialog",
- # "idc" : "",
- "loginmerge" : "true",
- "splogin" : "rate",
- # "username" : username, # 使用者名稱
- # "password" : password, # 使用者密碼
- "verifycode" : "",
- "mem_pass" : "on",
- # "rsakey" : "QNxGSHNrbmjoknFRAniMpPQDfCQaliA8", #暫時省略
- "crypttype" : "12",
- # "ppui_logintime": "448151",
- # "callback" : "parent.bd__pcbs__md9bav" #暫時省略
- };
綜上,剩下的就是找出那些拿不準的值了。其中密碼進行了加密,所以加密方法和另一個rsakey引數是急需解決的兩個東西。解決這兩個問題,留待下一篇闡述。