pyhon3模擬登陸百度(2)—— 使用IE11理清百度登陸內部邏輯和分析請求發送數據

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

這裏,個人瀏覽器是IE11。由於已經看了一篇手把手教學分析登陸邏輯的文章,因此這裏寫的要節省多了。python


經過分析發現登陸的網址是https://passport.baidu.com/v2/api/?loginapi


查看請求正文信息,經過查看該部分信息能夠知道向服務器提交了什麼數據,而後分析查找這些數據,最後構造出來這些數據,用程序模擬發送,這樣就能夠完成了模擬登陸。瀏覽器

因此重點就集中了搞清楚要發送那些數據,由於數據太多,有些數據能夠沒必要發送(好比缺省值),有些數據雖然有值可是也沒必要發(好比登陸時間等)可是有些數據的值須要順藤摸瓜查找出來(這些每次登陸值都不一樣,可是這些值又必需要發送才能登陸成功),有些值看起來是固定不變的咱們就設置成同樣的發送就是了。安全


如下代碼爲某次登陸百度的請求正文:服務器

[python]  view plain copy print ? 在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&
post

看上貌似亂碼後的URL,實際上是編碼後的結果。在請求發送數據時咱們必須用到正規的URL,因此須要找到原先正確的URL,而Python已有相關的模塊能夠處理。ui

[python]  view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. import urllib.parse  
  2.   
  3. encodeUrl = "http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html"  
  4. decodeUrl = urllib.parse.unquote(encodeUrl)  
  5.   
  6. 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 plain copy print ? 在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參數是急需解決的兩個東西。解決這兩個問題,留待下一篇闡述。
相關文章
相關標籤/搜索