本帖最后由 hhh5460 于 2012-11-17 14:58 编辑
接下来,就是分析,如何获得所需的信息。
先分析上述的post data中的值: ppui_logintime=6852
charset=utf-8
codestring=
token=5ab690978812b0e7fbbe1bfc267b90b3
isPhone=false
index=0
u=
safeflg=0
staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html
loginType=1
tpl=mn
callback=parent.bdPass.api.login._postCallback
username=crifan
password=xxxxxx
verifycode=
mem_pass=on |
都是怎么来的。 分析值是如何来的,以及顺带说说,写代码时,如何设置这些值。 在此之前,先解释一下,在代码中关于如何设置这些参数的值的规律和经验: (1)对于有参数,但是值为空的哪些参数,一般来说,都是可以省略的。 即写代码时,是可以去掉,忽略掉,这些参数的; 当然,如果你抓取出来的参数是有值的,则需要考虑其值是怎么得到的,是否有意义,否则随便忽略掉某些参数,可能会导致模拟登陆失败的。 (2)对于,看不太懂的参数的值的情况下,不妨先使用抓取出来的数据 尤其是一些参数,看不太懂,而且其值又明显不是那种,很可能会变化的数字之类的值,则一般情况下,也都是固定的值,所以,即使对于参数和值本身不太了解,也无所谓,也都可以直接在代码中,直接使用抓取出来的数据即可。 即使会导致出错,一般来说,也可以通过后续的多次抓取和分析,看出来该值真正的规律。
在上面那一堆参数和值中: (1)一些很明显,是固定的值,不需要考虑太多的值有: charset=utf-8 -> 表示当前网页的编码是utf-8,我们写代码照着写即可,不需要改; codestring= ->此处为空,所以也可以不理会;
isPhone=false -> 很明显,此处是通过PC登陆百度的,不是通过手机类的移动设备登陆的,所以是false。所以写代码时,也设置为false即可; 细心的读者,也很容易回想起,此处是对应着之前的登陆界面中的“手机登陆”: 如果是我们是通过“手机登陆”百度时,不出意外的话,肯定参数是isPhone=true
index=0 -> 未知,但是也没看出来是什么含义,所以也直接设置为0即可; u=-> 空值,同样设置空值即可; safeflg=0 -> 未知,所以也可以暂且不管,同样设置为0即可。 username=crifan -> 很明显,是我们的账号,不多解释;
password=xxxxxx -> 同理,是对应的密码;
verifycode= ->此处为空,所以也可以不管;
mem_pass=on -> 很明显,是memory password的所写,即记住密码,对应的页面是,我们已经勾选的”记住我的登陆状态”:
(2)另外一些就是不太容易一眼就看出来的值,需要简单解释一下的: staticpage=http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html -> 此处,等有了一定的调试经验,和本身具有一定的url的encode,decode基础的话,可以直接看出来,这个值 http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html 是原先某个url地址,编码之后的值。 而对应的原始的值,可以在代码中去解码而获得; 此处先直接给出原始值: http://www.baidu.com/cache/user/html/jump.html 等写具体代码时,再解释如何操作。
loginType=1 -> 未知,但是一般不知道的值,都可以先按照原先的值去设置即可; tpl=mn -> 未知,也还是同样设置即可; callback=parent.bdPass.api.login._postCallback -> 未知,也同样设置即可;
(3)再剩下的,就是需要去分析调查,才知道为何是这样值的了: ppui_logintime=6852 此值6852,看起来就像是会变化的。但是到底如何得到的,则需要去分析分析了。 所以就去搜索6852: 经过搜索,发现结果只能搜到此单独一处的6852,貌似没办法找到此数据如何得到的。 但是,我们可以再去搜其参数ppui_logintime,然后另外在别的文件中也可以找到2处,其中一处是: 很明显,此处是javascript脚本: https://passport.baidu.com/js/pass_api_login.js?v=20121018 在其中根据实际情况计算出来的。
【小提示:对于参数的处理策略】 对于涉及的很多参数,总的说,有两种策略: 一是,直接忽略此值,暂时不管。因为很多时候,有些参数,至少是这样看起来,不是那么重要的参数(重要的参数,相信我不说你自己也能看出来,是那些username,password之类的参数)。 然后就去写程序去模拟了。而真的等到程序运行出错,服务器没有返回你所期望的信息的时候,再回来分析此参数,看看是不是这个参数所导致的。 然后再试图去分析其真正的值; 二是,继续分析,甚至调试javascript代码,以便找到此值到底是如何一点点计算出来的。此过程可能会极其繁琐,也可能相对简单。要取决于此值被计算出来所经历的过程的复杂度。
此处,在表面看起来,这个参数ppui_logintime,大概意思是登陆的时间,所以推测是服务器为了记录你本地登陆百度的时间,和能否登陆百度这个过程本身,应该不会产生根本的影响,所以此处就可以采用策略一,暂时忽略不管。 万一真的有影响,再回来继续分析也不迟。
token=5ab690978812b0e7fbbe1bfc267b90b3 -> 此值5ab690978812b0e7fbbe1bfc267b90b3,很明显,是需要从别的地方找到的。所以就去分析此值是如何来的。 同理,继续去搜5ab690978812b0e7fbbe1bfc267b90b3,然后是可以搜到的,然后通过点击搜索框中的向前和向后的按钮,是可以找到这个 2/68 条记录,对应url是: https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true 的这处的: https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true 然后会获得Response Body,即(服务器所返回的)html源码,其中包括了: [backcolor=white !important][backcolor=rgb(108, 226, 108) !important][backcolor=initial !important]https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true 发送GET请求,获得对应的html代码,然后从中分析出token的值5ab690978812b0e7fbbe1bfc267b90b3;
而写到此,基本逻辑过程,也相对清楚了。 但是有人很快会想到,即使上述代码写出来了,又如何能确保的确已经模拟登陆成功了,即如何验证此处模拟登陆百度首页成功了呢? 此处,根据经验,主要通过两方面来验证:
【小提示:如何验证模拟登陆网站已成功】 一是返回的html代码 返回的html代码,即对应着F12中的Response Body,此处为截图如下: ?
[backcolor=white !important]1
[backcolor=white !important]2
[backcolor=white !important]3
[backcolor=white !important]4
[backcolor=white !important]5
[backcolor=white !important]6
| [backcolor=initial !important][backcolor=white !important][backcolor=initial !important][size=1em]Direction Key Value Expires Domain Path Secure HTTP only
[backcolor=white !important][backcolor=initial !important][size=1em]Received BDUSS WpNYWFNSGFub0t6YU9PMW1tVzNIUGRya35TQk5pM0JnflI2fndrT3UtQmdESVpSQVFBQUFBJCQAAAAAAAAAAAoavCuy1YMAY3JpZmFuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAYIArMAAAALDmT5YqAAAA6p5DAAAAAAAxMC4yNi4xOWC-mFBgvphQM Sat, 23-Jan-2021 07:38:08 GMT baidu.com / No No
[backcolor=white !important][backcolor=initial !important][size=1em]Received PTOKEN b42a396ff9c7efb80c08beecd040f032 Sat, 23-Jan-2021 07:38:08 GMT passport.baidu.com / No No
[backcolor=white !important][backcolor=initial !important][size=1em]Received STOKEN f38612b7866cfb0357877b8ca3c4faa6 Sat, 23-Jan-2021 07:38:08 GMT passport.baidu.com / No No
[backcolor=white !important][backcolor=initial !important][size=1em]Received PTOKEN deleted Mon, 07-Nov-2011 07:38:07 GMT baidu.com / No No
[backcolor=white !important][backcolor=initial !important][size=1em]Received SAVEUSERID 345baf769053e0ed4234 Sat, 23-Jan-2021 07:38:08 GMT passport.baidu.com / No No
|
而当代码模拟登陆成功后,则也肯定会收到类似的cookie的。
|