依照思路来,第一步就是难点和重点,搞清楚了网页登录的内部逻辑,才能进行下一步的模拟登录。
这里,我的浏览器是IE11。因为已经看了一篇手把手教学分析登录逻辑的文章,所以这里写的要节省多了。
通过分析发现登录的网址是https://passport.baidu.com/v2/api/?login
查看请求正文信息,通过查看该部分信息可以知道向服务器提交了什么数据,然后分析查找这些数据,最后构造出来这些数据,用程序模拟发送,这样就可以完成了模拟登录。
所以重点就集中了搞清楚要发送那些数据,因为数据太多,有些数据可以不必发送(比如缺省值),有些数据虽然有值但是也不必发(比如登录时间等)但是有些数据的值需要顺藤摸瓜查找出来(这些每次登录值都不同,但是这些值又必须要发送才能登录成功),有些值看起来是固定不变的我们就设置成一样的发送就是了。
以下代码为某次登录百度的请求正文:
分析数据:
staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html&
看上貌似乱码后的URL,其实是编码后的结果。在请求发送数据时我们必须用到正规的URL,所以需要找到原先正确的URL,而Python已有相关的模块可以处理。
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代码中如下: