QQ腾讯登录相关的HTTP协议

 

 

WebQQ协议分析(1)——登录

 

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位。下面我们先来抓包看看,

2010-11-28 00:25:17 上传
下载附件 (184.77 KB)




完整数据包内容如下:

  1. POST /cgi-bin/blognew/blog_quote HTTP/1.1
  2. Accept: */*
  3. Accept-Language: zh-cn
  4. Referer: http://b.qzone.qq.com/proxy.html
  5. If-Modified-Since: 0
  6. Content-Type: application/x-www-form-urlencoded
  7. Accept-Encoding: gzip, deflate
  8. User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)
  9. Host: b.qzone.qq.com
  10. Content-Length: 65
  11. Connection: Keep-Alive
  12. Cache-Control: no-cache
  13. Cookie: pt2gguin=o0138001655; ptcz=0b25a27219dd08bcfe38fc85365593dadb1a2a99cac9f1abfd5fb31a7052f89b; pvid=6724688319; flv=10.0; adid=138001655; adSP=GHTsOtSHTIJdDIr9+GXVoaFY59pet/LONpbU1rA0yPY=_837_326830_1290874683_; adVer=3121; ac=1,030,006; ptui_qstatus=2; uin=o0138001655; skey=@sZmfEEBdt; ptisp=ctc; ssid=s8226120880; login_time=B46BD5B3A93F9EC5226847DB4AE9A71589641475FCCEBBC9; __Q_w_s__appDataSeed=1; randomSeed=220115

  14. uin=138001655&fromuin=715746717&blogid=1286714133&g_tk=1423927145
复制代码


    我们可以看到,数据包主体部分最后一个参数就是g_tk值,一般是一串数字。那这个值到底怎么算出来的呢?
    因为我们在网页登录QQ的时候,腾讯都会通过cookies里的skey值来计算,用js来算。既然在运算的时候执行了js脚本,那么我们就可以在抓包中获得。那g_tk是通过什么算法算出来的?其实很简单,当我们得到skey后,循环取单字符的二进制并取左值.累加之后就得到后面的g_tk值了,这听上去很复杂,不过算法不用我们自己写,我们只需要执行在腾讯网页登录的时候所执行的那个js脚本就可以了。当然,js不能直接调用,不过既然我写了这篇文章,就已经是有备而来的,js算法我已经整理并写了一个最简单的,代码如下:

  1. function getGTK(str){
  2.     var hash = 5381;

  3.     for(var i = 0, len = str.length; i < len; ++i){
  4.         hash += (hash << 5) + str.charAt(i).charCodeAt();
  5.     }

  6.     return hash & 0x7fffffff;
  7. }
复制代码


    那么我们现在还有两个问题没有解决:
    1.如何获取登录后的cookies?
    2.如何在VB中执行js代码并得到返回值?

    上面两个问题其实到了你们手里,我相信也不会是问题了,下面我再通过代码以及讲解,来剖析并解决这两个所谓的问题。对于HTTP数据包POST/GET,相信看这篇文章的人应该都懂得吧,否则你看了也没用,那么我们可以设计一个登录程序,并在登录之后获取cookies中的skey值,并计算出g_tk。下面设计个登录界面:

你可能感兴趣的:(算法,.net,qq,腾讯,服务器,Cookies)