您的位置:首页 > 其它

pyhon3模拟登录百度(2)—— 使用IE11理清百度登录内部逻辑和分析请求发送数据

2014-10-12 08:19 781 查看
依照思路来,第一步就是难点和重点,搞清楚了网页登录的内部逻辑,才能进行下一步的模拟登录。

这里,我的浏览器是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%2F2clofLPqVfsp1oTSfwFkCSpifCEN9t%2BeM2lAWqbfcoK5O7dbx1N6NjPo1%2FQ%3D&

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参数是急需解决的两个东西。解决这两个问题,留待下一篇阐述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐