开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 8048|回复: 11
收起左侧

[讨论] WEBQQ协议详解

[复制链接]
结帖率:63% (5/8)
发表于 2013-7-23 17:14:24 | 显示全部楼层 |阅读模式   湖北省鄂州市
本帖最后由 花落忆流年╮ 于 2013-7-23 18:05 编辑

1. 检查是否需要验证码;
用Web登录QQ时需要先打开web2.qq.com,但我们用的是应用程序模拟浏览器登录,所以这一步是没有必要的,所以我们主要看看点击“登录”按钮时浏览器向服务器发送什么数据了。Web登录QQ输入帐号输入焦点离开时,有时会提示要输入验证码,那么第一步就是要看看什么样的QQ号需要输入验证码。

地址(GET):http://ptlogin2.qq.com/check?uin=********(QQ号码)&appid=1003903(固定)&r=0.2664082343145449(随机18位)

“*********”是我测试用的QQ号,r的值是个随机数,写成固定的也行。
请求头:
Accept: */*
Referer: http://ui.ptlogin2.qq.com/cgi-bi ... url=loginerroralert
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; TencentTraveler 4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Accept-Encoding: gzip, deflate
Host: ptlogin2.qq.com
Connection: Keep-Alive
Cookie: uikey=19ea2072338f7eb80f2573896d71465aeacae8d6122638c50ba8fcbb53ebb904; ptvfsession=eb95548fa394315edcf67e9cecd6e1ac09918361e8c08c3ab993faeaa0aa6ff333f89dfc4bb277c6a59ddebcdcbbd29d; ptuserinfo=e6b885; pgv_info=pgvReferrer=&ssid=s5705120712; ptui_width=370; ptui_height=198; ptisp=ctc; pgv_pvid=1361064104; pgv_flv=10.0

请求数据:
UIN=***********(QQ号码)
APPID=1003903(应用程序ID也就是WebQQ的版本,固定的)
R=0.2664082343145449(随机数18位)

返回数据:

返回数据(需要验证码):
ptui_checkVC('1'(1=需要验证码,0=不需要),'8a6143167c8ca486696cf01c3ea088d658b913d64b11289b'(验证码数据,这个数据在第一次获取验证码时作为参数来获取。));
返回数据(不需要验证码):
“ptui_checkVC('0','!OMD');”
括号里有两个被逗号隔开的单引号引着的数据,第一个值如果为0,则第二值为验证码,即不需要再从服务器获取验证码图片了,这个就是验证码了;第一个值如果不是1,则需要从服务器获取验证码图片,验证码需要根据图片人工输入。


2. 获取验证码;
如果第一步中返回的数据中,括号里第一个单引号引起来的数据为0,则不需要这步。
第一次获取验证码地址:http://captcha.qq.com/getimage?a ... 69804609544552&uin=********&vc_type=8A6143167C8CA486696CF01C3EA088D658B913D64B11289B
“*********”是我测试用的QQ号。“http://captcha.qq.com/getimage?”固定是不用怀疑的,aid=1003903是固定的(看web2.qq.com的页面数据就能找到了),r=0.6869804609544552是个随机数也毫无疑问,uin=********是QQ号,vc_type=...是js文件生成的,具体怎么回事就不知道了。
研究表明,“GET http://captcha.qq.com/getimage?&uin=********&aid=1002101&0.7581186622105849”这样就可以,后面那个随机数写成固定的就行了,服务器肯定不会每次都给你一样的验证码。
获取验证码图片的同时,还需要获取Cookie,verifysession的值,登录时要用
请求头:
Accept: */*
Referer: http://ui.ptlogin2.qq.com/cgi-bi ... url=loginerroralert
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; TencentTraveler 4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Accept-Encoding: gzip, deflate
Host: captcha.qq.com
Connection: Keep-Alive
Cookie: pgv_info=pgvReferrer=&ssid=s5705120712; ptui_width=370; ptui_height=314; ptisp=ctc; pgv_pvid=1361064104; pgv_flv=10.0
查询数据:
aid=1003903(版本号)
r=0.6869804609544552(随机18位)
uin=********(QQ号码)
vc_type=8a6143167c8ca486696cf01c3ea088d658b913d64b11289b(在检查是否需要验证码时返回的数据)

登录验证码错误后再获取验证码的地址:
http://captcha.qq.com/getimage?&uin=********(QQ号码)&aid=null&0.2710155929371449(随机18位)
请求头:
Accept: */*
Referer: http://ui.ptlogin2.qq.com/cgi-bi ... url=loginerroralert
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; TencentTraveler 4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Accept-Encoding: gzip, deflate
Host: captcha.qq.com
Connection: Keep-Alive
Cookie: pgv_info=pgvReferrer=&ssid=s5705120712; ptui_width=370; ptui_height=336; ptisp=ctc; pgv_pvid=1361064104; pgv_flv=10.0; verifysession=h0085e1faa63ddb7b0a43e4b04a215c06b44c70e8f5a74446cf760bc553121135e8c7807bc56dac6e614c096f1ef92c9ff2
请求数据:
uin=********(QQ号吗)
aid=null(为空)
0.2710155929371449=(随机18位)

3. 登录;
登录地址:
http://ptlogin2.qq.com/login?u=8630662(QQ号)&p=793E7DF74F8D87021F79A69F0DBF8287(md5(md5(密码)+验证码))&verifycode=hgjj(验证码)&remember_uin=1&aid=1003903&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Flogin_level%3D3&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&mibao_css=
http://ptlogin2.qq.com/login ”不必讨论,u=********是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的值
请求头:
Accept: */*
Referer: http://ui.ptlogin2.qq.com/cgi-bi ... url=loginerroralert
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; TencentTraveler 4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Accept-Encoding: gzip, deflate
Host: ptlogin2.qq.com
Connection: Keep-Alive
Cookie: uikey=19ea2072338f7eb80f2573896d71465aeacae8d6122638c50ba8fcbb53ebb904; ptvfsession=eb95548fa394315edcf67e9cecd6e1ac09918361e8c08c3ab993faeaa0aa6ff333f89dfc4bb277c6a59ddebcdcbbd29d; ptuserinfo=e6b885; pgv_info=pgvReferrer=&ssid=s5705120712; ptui_width=370; ptui_height=314; ptisp=ctc; pgv_pvid=1361064104; pgv_flv=10.0; verifysession=h0085e1faa63ddb7b0a43e4b04a215c06b44c70e8f5a74446cf760bc553121135e8c7807bc56dac6e614c096f1ef92c9ff2
登录前需设置Cookie-:verifysession (这个值在获取验证码时得到)

登录结果;

ptuiCB('0','0','http://web2.qq.com/loginproxy.html?login_level=3','0','登录成功!');是登录成功的结果

括号中的第一个值是登录结果参数,

0:登录成功!
1:系统繁忙,请稍后重试。
2:已经过期的QQ号码。
3:您输入的密码有误,请重试。
4:您输入的验证码有误,请重试。
5:校验失败。
6:密码错误。如果您刚修改过密码, 请稍后再登录.
7:您的输入有误, 请重试。
8:您的IP输入错误的次数过多,请稍后再试。

http://web2.qq.com/loginproxy.html?login_level=3 是登录成功后浏览器用的地址,应用程序用不着,固定这个地址就可以。

注意,登录成功的话要获取Cookie值,后面要用,尤其是skey,ptcz,ptwebqq。

另外还有一个参数verifysession,就是验证码的那个Cookie,也要用。


4. 获取登录后参数;
地址:http://d.web2.qq.com/channel/login2
返回数据:
{"retcode":0,"result":{"uin":********,"cip":3071582136,"index":1078,"port":53985,"status":"hidden","vfwebqq":"5ab2ce0743496ffa257aa4119f35e44324171aa08d3e14a4c506b7e392ca80b73e34551cef71a248","psessionid":"8368046764001e636f6e6e7365727665725f7765627171403137322e32372e3138312e3835000062450000079e03620524ef666d0000000a406e4e53734a517a33556d000000285ab2ce0743496ffa257aa4119f35e44324171aa08d3e14a4c506b7e392ca80b73e34551cef71a248"}}
第一个是QQ号;第三个是索引、第二个和第四个是服务器的端口号;第五个是登录状态,在线还是隐身;第六个未知,第7个就是所谓的登录令牌了,叫web_session;
再说一下最前面的数,正常情况是“0”;“2”表示连接错误;“4”表示授权错误;“5”表示密码错误;“6”表示登录状态解码错误;剩下的其他值表示未知错误。

从返回的数据里获取index、port、vfwebqq和 psessionid四个参数。前面的四个参数,即index、port、vfwebqq和 psessionid 都要放到Cookie里。

把数据r={"status":"","ptwebqq":"6614fcd374795a30247ee39ee5db415b0a1e55f06d7a9e13a958b06b2e181b83","passwd_sig":"","clientid":"61222593","psessionid":null} clientid=61222593 psessionid=null 转换成utf-8 “r=%7B%22status%22%3A%22%22%2C%22ptwebqq%22%3A%226614fcd374795a30247ee39ee5db415b0a1e55f06d7a9e13a958b06b2e181b83%22%2C%22passwd_sig%22%3A%22%22%2C%22clientid%22%3A%2261222593%22%2C%22psessionid%22%3Anull%7D&clientid=61222593&psessionid=null”后POST 到 http://d.web2.qq.com/channel/login2 来获取数据。

5、登录流程图:

20120511214343618.png
20120511214402549.png


6、获取好友列表:
地址(POST):http://web2-b.qq.com/api/get_user_friends
请求头:
Accept: */*
Accept-Language: zh-cn
Referer: http://s.web2.qq.com/proxy.html?v=20110331002&callback=1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; TencentTraveler 4.0; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Host: s.web2.qq.com
Content-Length: 134
Connection: Keep-Alive
Cache-Control: no-cache
将数据:r={"h":"hello","vfwebqq":"5ab2ce0743496ffa257aa4119f35e44324171aa08d3e14a4c506b7e392ca80b73e34551cef71a248"} 转换为 utf 8 r=%7B%22h%22%3A%22hello%22%2C%22vfwebqq%22%3A%225ab2ce0743496ffa257aa4119f35e44324171aa08d3e14a4c506b7e392ca80b73e34551cef71a248%22%7D 后 POST 到http://web2-b.qq.com/api/get_user_friends
返回数据:
返回的是JSON格式的数据包,{"retcode":0,"result":{"gnamelist":[{"gid":******,"code":*****,"flag":1041,"name":"\**\u**\u**\u**\u**"},{"gid":*******,"code":*******,

第一位是返回错误代码;第二位是集合,gid 是好友的代号;code 好友代码;flag 好友标记;name 好友名称

评分

参与人数 3精币 +4 收起 理由
SourceCode + 2 楼主码字辛苦了,精易有你更精彩
PC狂人 + 1 唯恐天下不乱
小虎崽 + 1 哥们,你还发qq关键词啊?

查看全部评分

结帖率:0% (0/1)
发表于 2017-5-15 23:03:32 | 显示全部楼层   辽宁省葫芦岛市
学习一下学习一下
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2016-5-7 21:53:57 | 显示全部楼层   浙江省嘉兴市
学习一下
回复 支持 反对

使用道具 举报

发表于 2014-4-19 19:04:49 | 显示全部楼层   安徽省宣城市
实在不容易,不管怎么样看不懂
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2013-10-27 00:31:18 | 显示全部楼层   江苏省扬州市
我看这个看的晕了,这个是什么协议?貌似就是用"网页_访问()"就OK了吧?对协议咱不了解,所以正在找资料
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2013-10-26 22:38:05 | 显示全部楼层   安徽省滁州市
新手路过学习学习
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2013-10-8 14:51:33 | 显示全部楼层   福建省福州市
呵呵 路过的                              
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2013-10-8 11:25:39 | 显示全部楼层   江苏省扬州市
谢谢楼主的细心讲解。。。
回复 支持 反对

使用道具 举报

发表于 2013-7-23 21:49:59 | 显示全部楼层   江苏省苏州市
谢谢分享
回复 支持 反对

使用道具 举报

结帖率:63% (5/8)
 楼主| 发表于 2013-7-23 17:20:34 | 显示全部楼层   湖北省鄂州市
旺仔小馒头ジ 发表于 2013-7-23 17:16
不容易啊,我怀疑你是转载的

有没说原创
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表