模拟登陆webqq总结(二)

来源:互联网 发布:淘宝信用管理在哪里 编辑:程序博客网 时间:2024/05/29 05:55

上一篇已经做完了模拟登陆的第一步,此时我们已经获得了一个如下的反馈结果(由getmethod.getResponsebodyAsStream()获得的)

ptuiCB('0','0','http://ptlogin4.web2.qq.com/check_sig?pttype=1&uin=*****&service=login&nodirect=0&ptsig=EcdwAqGL*9dYTHWCkkffQAQcr-2nO81*FSRjkPOVRi4_&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&f_url=&ptlang=2052&ptredirect=100&aid=1003903&daid=164&j_later=0&low_login_hour=0&regmaster=0&pt_login_type=1&pt_aid=0&pt_aaid=0&pt_light=0','0','登录成功!', '*****);

同时,我们也收到了服务器反馈的cookie。

接下来我们就要看看在第一次登陆成功之后浏览器又做了哪些事情,才完成第二次登陆。



由图可以看出,浏览器在第一次登陆后又访问了一个地址,不难发现,这个地址就是第一次登陆反馈结果中的第三个参数。

既然这样,那么我们再写一个get请求,请求一下这个地址就可以了。我当时也是这么想的,没太当回事,但是当我写了一个get进行请求的时候,却总是给我返回一些乱七八糟的内容,正常情况下访问这个地址得到的内容是空的(如图)



同时我们还将得到另外三个重要的cookie,如下图。


多次尝试仍未得到正确结果之后,我把链接直接复制到浏览器,访问后发现是如下图的结果



然后我用重新写了个测试程序直接请求这个地址,也得到了上图的反馈,但是用原来的程序就是一些乱七八糟的信息,经过一番对比才发现,原来程序中,我为了偷懒,不想重复设置getmethod的请求头,直接利用getmethod.setURI(new URI(url))的方法重新设置getmethod的地址,而不是从新new一个getmethod,这个过程中可能导致了请求地址的问题,把我链到了别的地址上。

这个问题解决之后,新的问题又出来了,虽然访问到了正确的页面,但是我并没接收到那三个重要的cookie。

这下就让我头大了,正确的模拟得到了正确的结果但是却没有得到需要的cookie。

再次分析httpwatch抓到的包,我又有了新的发现



可以看出,我在访问第一个地址的时候,浏览器收到了一个302,进行了跳转,跳转之前,服务器给浏览器发了cookie,浏览器将cookie保存了下来,然后进行了跳转。

这时我想到了我的程序可能是因为httpclient自动处理了这个跳转指令,我所获得的cookie是跳转之后的cookie,并不是那个含有重要参数的cookie,如果是这样的话,就可以说得通了。浏览器虽然也跳转了,但是它把跳转前收到的cookie存了下来。我所用的httpclient也自动跳转了,但是跳转前的cookie并没有被记录下来。

于是,我带着这种猜测,看了看httpclient的源码





可以看到,httpclient确实自动做了重定向的处理,并且在做处理时,并没有保留跳转前页面的信息。于是我便尝试着把请求时自动处理重定向的选项设置成false

getMethod.setFollowRedirects(false);

再次尝试,果然得到了想要的cookie值。

得到了p_skey、p_uin、pt4_token的值之后,把他们加到cookie中,再用post方法访问http://d.web2.qq.com/channel/login2


其中clientid是随机的,可以直接用抓取到的数,ptwebqq的值可以在第一步登录时获取到的cookie中得到,知道post包结构之后,就可以自己组装一个包,发给服务器了

PostMethod method = new PostMethod("http://d.web2.qq.com/channel/login2");NameValuePair nvp[] = new NameValuePair[] {new NameValuePair("clientid", "85687680"),new NameValuePair("psessionid", ""),new NameValuePair("r","{\"status\":\"online\",\"ptwebqq\":\""+ ptwebqq+ "\",\"passwd_sig\":\"\",\"clientid\":\"85687680\",\"psessionid\":null}"), };method.setRequestBody(nvp);

如果成功了,服务器会返回vfwebqq和psessionid两个cookie值


把这两个值存好,以后做抓取信息时用得到。这时,你正在登陆的qq客户端就会被顶下线,这就代表这我们大功告成了!

0 0
原创粉丝点击