1、获取验证码
用Web登录QQ时需要先打开web.qq.com,但我们用的是应用程序模拟浏览器登录,所以这一步是没有必要的,所以我们主要看看点击“登录”按钮时浏览器向服务器发送什么数据了。Web登录QQ输入帐号输入焦点离开时,有时会提示要输入验证码,那么第一步就是要看看什么样的QQ号需要输入验证码。
GET http://ptlogin2.qq.com/check?uin=1030196367&appid=1002101&r=0.8849248
“1030196367”是我测试用的QQ号,r的值是个随机数,写成固定的也行。
服务器返回“ptui_checkVC('0','!OMD');”
括号里有两个被逗号隔开的单引号引着的数据,第一个值如果为0,则第二值为验证码,即不需要再从服务器获取验证码图片了,这个就是验证码了;第一个值如果不是1,则需要从服务器获取验证码图片,验证码需要根据图片人工输入。
2、获取验证码图片
如果第一步中返回的数据中,括号里第一个单引号引起来的数据为0,则不需要这步。
GET http://captcha.qq.com/getimage?aid=1002101&r=0.7712672651606319&uin=1030196367&vc_type=……
“http://captcha.qq.com/getimage ”固定是不用怀疑的,aid=100210是固定的(看web.qq.com的页面数据就能找到了),r=0.7712672651606319是个随机数也毫无疑问,uin=1030196367是QQ号,vc_type=...是js文件生成的,具体怎么回事就不知道了。
研究表明,“GET http://captcha.qq.com/getimage?0.7712672651606319 ”这样就可以,后面那个随机数写成固定的就行了,服务器肯定不会每次都给你一样的验证码。
获取验证码图片的同时,还需要获取Cookie,verifysession的值,登录时要用
3、输入帐号、密码及验证码登录
GET http://ptlogin2.qq.com/login?u=1030196367&p=……&verifycode=afbc&remember_uin=1&aid=1002101&u1=http%3A%2F%2Fweb.qq.com%2Fmain.shtml%3Fdirect__2&h=1&ptredirect=1&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert
“http://ptlogin2.qq.com/login ”不必讨论,u=1030196367是QQ号,p=...是密码,这密码并不是原始密码很正常,不然盗个QQ号也太容易了(插一句,其实服务器也不知道你密码是什么,但它知道你密码经过处理以后长什么样,所以你密码丢了,它只会给你新密码,而不会告诉你旧密码,因为它也不知道啊,^_^),这个密码好像是用MD5对原始密码加密,用输入的验证码处理一下再用MD5加密得到的,具体可以到js文件里研究一下。verifycode=afbc就是你输入的验证码,remember_uin=1是记住帐号,aid=1002101同上,u1=http%3A%2F%2Fweb.qq.com%2Fmain.shtml%3Fdirect__2固定,本来%3A%2F%2F表示“://”,%3F表示“?”,但这里不能代替,是个转义字符。webqq_type是隐身标志,后面其他都固定。
注意要设置Cookie,verifysession的值
4、登录结果
ptuiCB('0','0','http://web.qq.com/main.shtml?direct__2','1');是登录成功的结果
括号中的第一个值是登录结果参数,
0:登录成功!
1:系统繁忙,请稍后重试。
2:已经过期的QQ号码。
3:您输入的密码有误,请重试。
4:您输入的验证码有误,请重试。
5:校验失败。
6:密码错误。如果您刚修改过密码, 请稍后再登录.
7:您的输入有误, 请重试。
8:您的IP输入错误的次数过多,请稍后再试。
......
http://web.qq.com/main.shtml?direct__2 是登录成功后浏览器用的地址,应用程序用不着,固定这个地址就可以。
注意,登录成功的话要获取Cookie值,后面要用,尤其是skey,ptcz,ptwebqq。
另外还有一个参数verifysession,就是验证码的那个Cookie,也要用。
腾讯QQ空间g_tk算法
在百度搜索g_tk,只得到几个可怜而且不完整的答案,易语言的也有人写了个模块,却一直不愿意公开算法。其实g_tk只是QQ空间对日志进行操作的时候,所采取的一套安全机制,如果g_tk字符串的值不对的话,请求是没有办法提交的,因此,很多刚刚涉及HTTP协议技术的人想对QQ空间这尊大佛动手脚的话,只能望而却步。下面我以VB为例,在这里详解一下g_tk的计算方法。
其实g_tk校验是通过skey值来算出来的,弄过QQ登录的人可能都知道,在登录成功之后,cookies里都会返回skey值,通常是以@开头,并且带有一串看似无规则的大小写字母混合,总共10位。下面我们先来抓包看看,
完整数据包内容如下:
我们可以看到,数据包主体部分最后一个参数就是g_tk值,一般是一串数字。那这个值到底怎么算出来的呢?
因为我们在网页登录QQ的时候,腾讯都会通过cookies里的skey值来计算,用js来算。既然在运算的时候执行了js脚本,那么我们就可以在抓包中获得。那g_tk是通过什么算法算出来的?其实很简单,当我们得到skey后,循环取单字符的二进制并取左值.累加之后就得到后面的g_tk值了,这听上去很复杂,不过算法不用我们自己写,我们只需要执行在腾讯网页登录的时候所执行的那个js脚本就可以了。当然,js不能直接调用,不过既然我写了这篇文章,就已经是有备而来的,js算法我已经整理并写了一个最简单的,代码如下:
那么我们现在还有两个问题没有解决:
1.如何获取登录后的cookies?
2.如何在VB中执行js代码并得到返回值?
上面两个问题其实到了你们手里,我相信也不会是问题了,下面我再通过代码以及讲解,来剖析并解决这两个所谓的问题。对于HTTP数据包POST/GET,相信看这篇文章的人应该都懂得吧,否则你看了也没用,那么我们可以设计一个登录程序,并在登录之后获取cookies中的skey值,并计算出g_tk。下面设计个登录界面: