1. 程式人生 > >pyhon3模擬登入百度(2)—— 使用IE11理清百度登入內部邏輯和分析請求傳送資料

pyhon3模擬登入百度(2)—— 使用IE11理清百度登入內部邏輯和分析請求傳送資料

依照思路來,第一步就是難點和重點,搞清楚了網頁登入的內部邏輯,才能進行下一步的模擬登入。

這裡,我的瀏覽器是IE11。因為已經看了一篇手把手教學分析登入邏輯的文章,所以這裡寫的要節省多了。

通過分析發現登入的網址是https://passport.baidu.com/v2/api/?login


檢視請求正文資訊,通過檢視該部分資訊可以知道向伺服器提交了什麼資料,然後分析查詢這些資料,最後構造出來這些資料,用程式模擬傳送,這樣就可以完成了模擬登入。

所以重點就集中了搞清楚要傳送那些資料,因為資料太多,有些資料可以不必傳送(比如預設值),有些資料雖然有值但是也不必發(比如登入時間等)但是有些資料的值需要順藤摸瓜查找出來(這些每次登入值都不同,但是這些值又必須要傳送才能登入成功),有些值看起來是固定不變的我們就設定成一樣的傳送就是了。

以下程式碼為某次登入百度的請求正文:

[python] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html&  
  2. charset=utf-8&  
  3. token=7df2c14c85ae5b4ac28e55671d91f835&  
  4. tpl=mn&  
  5. subpro=&  
  6. apiver=v3&  
  7. tt=1412564377876&  
  8. codestring=&  
  9. safeflg=0
    &  
  10. u=http%3A%2F%2Fwww.baidu.com%2F&  
  11. isPhone=false&  
  12. quick_user=0&  
  13. logintype=dialogLogin&  
  14. logLoginType=pc_loginDialog&  
  15. idc=&  
  16. loginmerge=true&  
  17. splogin=rate&  
  18. username=xxxxxxx&  
  19. password=eqCh%2BjZOsT7dfR%2FLeCrmaU95YOejUlifw5PM1Yt9i0ahYPbgMGHhW%2F3eeGbA3MZpKPVKS8ce9sFNKuStEJr8KTDnzH1zxEL9OyH655VBJ139Jip
    %2F2clofLPqVfsp1oTSfwFkCSpifCEN9t%2BeM2lAWqbfcoK5O7dbx1N6NjPo1%2FQ%3D&  
  20. verifycode=&  
  21. mem_pass=on&  
  22. rsakey=QNxGSHNrbmjoknFRAniMpPQDfCQaliA8&  
  23. crypttype=12&  
  24. ppui_logintime=448151&  
  25. callback=parent.bd__pcbs__md9bav  

分析資料:

staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html&

看上貌似亂碼後的URL,其實是編碼後的結果。在請求傳送資料時我們必須用到正規的URL,所以需要找到原先正確的URL,而Python已有相關的模組可以處理。

[python] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. import urllib.parse  
  2. encodeUrl = "http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html"
  3. decodeUrl = urllib.parse.unquote(encodeUrl)  
  4. 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?在CODE上檢視程式碼片派生到我的程式碼片
  1. postDict = {      
  2.     "staticpage"    :   "http://www.baidu.com/cache/user/html/v3Jump.html",  
  3.     "charset"       :   "utf-8",  
  4.     # "token"           :"7df2c14c85ae5b4ac28e55671d91f835",                    #暫時省略
  5.     "tpl"           :   "mn",  
  6.     #"subpro"       :   "",
  7.     "apiver"        :   "v3",  
  8.     # "tt"          :   "1412564377876",        #暫時省略
  9.     # "codestring"  :   "",
  10.     "safeflg"       :   "0",  
  11.     # "u"           :   "http%3A%2F%2Fwww.baidu.com%2F&",       #暫時省略
  12.     "isPhone"       :   "false",  
  13.     "quick_user"    :   "0",  
  14.     "logintype"     :   "dialogLogin",  
  15.     "logLoginType"  :   "pc_loginDialog",  
  16.     # "idc"         :   "",
  17.     "loginmerge"    :   "true",  
  18.     "splogin"       :   "rate",  
  19.     # "username"        :   username,   # 使用者名稱
  20.     # "password"        :   password,   # 使用者密碼
  21.     "verifycode"    :   "",  
  22.     "mem_pass"      :   "on",  
  23.     # "rsakey"      :   "QNxGSHNrbmjoknFRAniMpPQDfCQaliA8",     #暫時省略
  24.     "crypttype"     :   "12",  
  25.     # "ppui_logintime": "448151",
  26.     # "callback"        :   "parent.bd__pcbs__md9bav"           #暫時省略
  27. };  

綜上,剩下的就是找出那些拿不準的值了。其中密碼進行了加密,所以加密方法和另一個rsakey引數是急需解決的兩個東西。解決這兩個問題,留待下一篇闡述。