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参数是急需解决的两个东西。解决这两个问题,留待下一篇阐述。
这里,我的浏览器是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参数是急需解决的两个东西。解决这两个问题,留待下一篇阐述。
相关文章推荐
- session失效,使用ajax请求数据被拦截,此时正常的处理逻辑是跳到登录界面,而不是界面没有变化(java推断是否是ajax请求)
- python中使用requests 模拟浏览器发送请求数据
- session失效,使用ajax请求数据被拦截,此时正常的处理逻辑是跳到登录界面,而不是界面没有变化(java判断是否是ajax请求)
- 手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
- python模拟浏览器登录人人网,并使用代理IP和发送表单数据
- 登录百度首页的HTTP请求过程具体分析,重点为包体数据
- 使用C#访问百度指数:模拟发送请求/得到响应数据(2)
- 使用java程序模拟页面发送http的post请求
- java中使用scoket模拟http post请求发送图片或文件
- ki4so 使用原始凭证(表单提交)登录成功后的加密和下次请求的解密 源码分析
- httpClient使用,1 发送post请求 2 发送get请求取得接口中的数据
- 使用java程序模拟页面发送http的post请求
- 使用HttpURLConnection发送XML请求数据
- HttpWebRequest模拟登陆,存储Cookie以便登录请求后使用
- 使用java程序模拟页面发送http的post请求
- Android开发使用POST方式向服务器请求和发送数据
- 使用firefox插件httperrequest,模拟发送及接收Json请求