基于http://web.
qq.
com的协议分析告一段落,现在把命令汇总一下作为结束.
1、获取验证码与登录2、获取登录令牌3、获取用户资料,命令5c4、获取好友个性签名,命令675、获取好友分组组名,命令3c6、获取好友QQ号(包括群ID),命令587、获取好友资料,命令268、获取好友备注,命令3e9、获取群信息列表,命令30,子命令7210、获取群成员昵称,命令012611、获取群成员名片,命令30,子命令0f12、服务器发来的好友或群的聊天消息,命令1713、给好友发送聊天消息,命令1614、给群发送聊天消息,命令30,子命令0a作者用MFC写的基于http://web.
qq.
com的WebQQ机器人源代码下载地址:http://download.
csdn.
net/source/27699821、WebQQ协议分析(1)——登录收藏绪:一直想弄个程序与QQ直接通信,再弄个聊天机器人什么的,困于无从下手:QQ太麻烦了,抓包来看看吧,全是乱码,没个能读通的,明显加过密,解密的难度也太大了.
好在出了个WebQQ,一切问题都解决了,因为浏览器要运行程序,得从服务器下载数据啊,也就是源代码了.
源代码都有了,还有什么不能解决的在此,推荐一款抓包工具,Fiddler,英文版的,但太好用了,不得不推荐一下.
本系列文章针对的是WebQQ的version:1.
1版本,网址:http://web.
qq.
com1、获取验证码用Web登录QQ时需要先打开web2.
qq.
com,但我们用的是应用程序模拟浏览器登录,所以这一步是没有必要的,所以我们主要看看点击"登录"按钮时浏览器向服务器发送什么数据了.
Web登录QQ输入帐号输入焦点离开时,有时会提示要输入验证码,那么第一步就是要看看什么样的QQ号需要输入验证码.
GEThttp://ptlogin2.
qq.
com/checkuin=1030196367&appid=1002101&r=0.
8849248"1030196367"是我测试用的QQ号,r的值是个随机数,写成固定的也行.
服务器返回"ptui_checkVC('0','!
OMD');"括号里有两个被逗号隔开的单引号引着的数据,第一个值如果为0,则第二值为验证码,即不需要再从服务器获取验证码图片了,这个就是验证码了;第一个值如果不是1,则需要从服务器获取验证码图片,验证码需要根据图片人工输入.
2、获取验证码图片如果第一步中返回的数据中,括号里第一个单引号引起来的数据为0,则不需要这步.
GEThttp://captcha.
qq.
com/getimageaid=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文件生成的,具体怎么回事就不知道了.
研究表明,"GEThttp://captcha.
qq.
com/getimage0.
7712672651606319"这样就可以,后面那个随机数写成固定的就行了,服务器肯定不会每次都给你一样的验证码.
获取验证码图片的同时,还需要获取Cookie,verifysession的值,登录时要用3、输入帐号、密码及验证码登录GEThttp://ptlogin2.
qq.
com/loginu=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.
shtmldirect__2','1');是登录成功的结果括号中的第一个值是登录结果参数,0:登录成功!
1:系统繁忙,请稍后重试.
2:已经过期的QQ号码.
3:您输入的密码有误,请重试.
4:您输入的验证码有误,请重试.
5:校验失败.
6:密码错误.
如果您刚修改过密码,请稍后再登录.
7:您的输入有误,请重试.
8:您的IP输入错误的次数过多,请稍后再试.
.
.
.
.
.
.
http://web.
qq.
com/main.
shtmldirect__2是登录成功后浏览器用的地址,应用程序用不着,固定这个地址就可以.
注意,登录成功的话要获取Cookie值,后面要用,尤其是skey,ptcz,ptwebqq.
另外还有一个参数verifysession,就是验证码的那个Cookie,也要用.
作者:yjh4866源地址:http://blog.
csdn.
net/yjh48662、WebQQ协议分析(2)——获取登录令牌现在已经有skey、ptcz、ptwebqq和verifysession四个参数了,下面获取传说中的登录令牌.
前面的四个参数,即verifysession、skey、ptcz和ptwebqq都要放到Cookie里(如果用WinInit则不用手动添加),用POST把"1030196367;22;0;00000000;skey;ptwebqq;0;"发送到http://web-proxy2.
qq.
com/conn_s,如果接收到空数据,可以试试http://web-proxy.
qq.
com/conn_s,如果仍然接收到空数据,可以试试http://web.
qq.
com/conn_s.
第一个是QQ号,第五个和第六个是前面获取到的其中两个参数.
返回数据如下:1030196367;22;0;00;5cb2aea5;0;1281769046;22;38369;第一个是QQ号;第二个是命令号,十六进制的数,与发送数据的第二个对应;第三个未知,系统没处理;如果没有第四个数,系统不处理该命令;第五个就是所谓的登录令牌了,叫web_session;第六个是登录状态,在线还是隐身,0表示在线;第七个是登录时间;第八个和第九个是服务器的端口号;第十个是clientKey,第十一个是wqqs.
再说一下第四个数,正常情况是"00";"02"表示连接错误;"04"表示授权错误;"05"表示密码错误;"06"表示登录状态解码错误;剩下的其他值表示未知错误.
3、WebQQ协议分析(3)——获取用户信息现在开始获取用户信息及用户签名开始获取前先说明一下,所需的Cookie以后就不提了,用WinInet时不用手动设置Cookie,直接用Socket通信时直接看抓包抓到的Cookie数据就行了.
1、获取用户信息获取用户信息使用的命令是5c用POST向http://web-proxy2.
qq.
com/conn_s(三个中的任何一个均可)发送以下数据,服务器就返回用户信息数据了.
1030196367;5c;0;fb0146dd;88;第一个是QQ号;第二个就是命令了,获取用户信息用的是5C;第三个是消息序号,是客户端向服务器发送的消息的编号(不少文章说前十个是固定的之类,其实是错误的,每次都发送0都能获取到正确的数据);第四个就是所谓的令牌了,官方叫web_session;第五个88是一个子命令,意思是获取自己的信息服务器返回如下数据:1030196367;5c;0;88;0;1;9;0;3;第一个是自己的QQ号;第二个是命令,意思是这条数据是用户信息;第三个是请求时的消息序号;第四个是88,就是发送的那个子命令;第五个是0,不是0就错了,只有是0才处理后面的数据;第六个是该帐号的等级,比如1级是一个星星,16级是一个太阳;第七个是在线天数;第八个是vip等级;第九个是剩余升级天数.
发送:1030196367;5c;0;5cb2aea5;89;2;XXXX;XXXX;第一个不必说了;第二个是命令号也不必说;第三个是系统用的消息编号;第四个是登录令牌(web_session);第五个为89,即为子命令,获取好友的信息;第六个为2表示后面要获取两个帐号的信息;第七第八即为两个帐号.
返回:1030196367;5c;0;89;0;XXXX;32;0;XXXX;33;0;第一个是自己的QQ号;第二个是命令号;第三个是消息编号;第四个是子命令号;第五个数为0才是正确的数据;XXXX为帐号,后两个数据是等级和vip等级.
2、获取好友的个性签名命令:67发送:1030196367;67;0;fb0146dd;03;3;XXXX;XXXX;XXXX;前四个就不讲了,第五个是子命令,可以是01、02、03,但01和02没什么意义;第六个是好友帐号数量;再往后就是相应的好友帐号了.
返回:1030196367;67;0;03;0;XXXX;XXXX;.
.
.
.
.
.
;XXXX;第四个即为相应的子命令号;第五个为0才是正确的数据;第六个数据没意义;第七个如果为0则第八个为空,处理完毕,第七个如果是好友帐号,则后面就是该好友的个性签名.
后面类似.
这种方法也能获取自己的个性签名,把自己的QQ号作为好友号加在后面就能获取到了.
4、WebQQ协议分析(4)——获取好友信息(1)1、获取好友分组组名列表命令:3c发送:1030196367;3c;0;4b2b432f;1;第五个参数只有1和2两个值,什么时候为2未知,用1即可获取到所需数据(可能表示从哪个编号的分组开始获取,最多两次就获取完了,我没创建那么多分组也没法测试啊.
~_~).
服务器返回:1030196367;3c;0;02;1;试试;2;看看;第四个是自定义分组的数量.
再往后就明白了,需要说明的是自定义分组序号是从1开始的,0是"我的好友"系统默认的分组,1000是"陌生人",1001是"黑名单",显然自定义分组上限是999,超不过999.
有没有想过这些数据由";"分开,那组名能不能有";"呢答案是肯定的,不信你试试.
加过分号后的数据如下1030196367;3c;0;02;1;试%3B试%3B;2;%3B2%3B;看到了吧分号变成%3B,具体哪些要特殊处理另外说明.
注意,分组序号不一定是连续的,可能没有某个或某几个序号.
这样好友分组组名列表就获取完了,下面开始获取好友吧.
2、获取好友QQ号命令:58发送:1030196367;58;0;4b2b432f;0;第五个表示从哪个好友QQ号开始获取,第一次请求自然是0了.
服务器返回如下数据(个人隐私,好友QQ号用XXXX代替)1030196367;58;0;0;XXXX;0;8;10;3;XXXX;0;4;20;3;XXXX;0;0;10;3;XXXX;1;0;20;3;第四个是下次从哪个QQ号开始获取(一次可能获取不完),例子中的数据显然是指这次就把所有数据都获取完了.
XXXX就是好友QQ号了,第二个值如果小于4表示服务器返回的这些好友数据每五项为一个好友数据,否则每四项为一个好友数据,0表示是好友QQ号,1表示是群ID(但不是群号).
第三个为所属分组编号(明显不对,呵呵,计算方法是(n&60)>>2,这个结果就是所属分组编号了);第四个是好友状态,10表示在线,20表示下线,30表示离线,其他当下线处理;有第五个,第五个表示terminationStat,自己上次退出登录时该好友的状态.
5、WebQQ协议分析(5)——获取好友信息(2)3、获取好友资料命令:26发送:1030196367;26;0;fb0146dd;XXXX;0;第一次请求时,第五个参数为0,以后的值跟返回的值就有;第六个参数固定为0返回:1030196367;26;0;202;XXXXXX;21;23;1;宁静;0;XXXXXX;93;28;0;石;第四个参数不为0,表示好友数据没获取完,下次继续请求好友资料时这个参数要放在第五个参数位置上;第五个参数就是好友QQ号了,第六个为好友头像编号;第七个为好友年龄;第八个为性别,1表示女;第九个是好友昵称;第十个是VIP等级;第十一个又是好友QQ号.
.
.
.
.
.
4、获取好友备注命令:3e发送:1030196367;3e;0;fb0146dd;4;0;第五个参数固定为4;第六个参数为计数值,第一次请求为0,第二次请求就为1了返回:1030196367;3e;0;4;1;XXXXXX;0;赵老师;XXXXXX;0;张经理;第四个参数固定为4;第五个参数为1表示好友备注信息未获取完毕,为0表示获取完毕;第六个为好友QQ号;第七个无意义;第八个就是自己给该好友设置的备注;第九个为另一个好友的QQ号.
.
.
.
.
.
6、WebQQ协议分析(6)——获取群信息(1)1、获取群信息列表前面的58命令获取好友QQ号时也获取到了群ID,现在用这个ID来获取真实的群号及群信息.
命令:30发送:1030196367;30;0;4b2b432f;72;XXXXXX;0;第五个参数72为子命令;第六个为指定群的ID,58命令获取到的那个;第七个为群信息的起点,第一次获取自然为0,第一次未获取完数据,以后该值由返回的值指定.
服务器返回:1030196367;30;0;72;群ID;真实群号;1;0;群主QQ号;WebQQ协议分析;公告;简介;0;1030196367;XXXXXX;10;0;0;3;XXXXXX;20;0;1;3;553865069;10;0;1;3;第四个是子命令72;第五个为发送的群ID;第七个数为1时,第六个为对应的群号,第八个无意义,第九个为群主QQ号,第十个为群名称,第十一个为群公告,第十二个为群简介,从第十五个开始为群成员信息.
如果第十八个数是QQ号,则每四个数据为一个成员信息,否则每五个数据为一个成员信息.
成员信息中,第一个为成员QQ号;第二个为成员在线情况;第四个为管理员标志,为1表示该成员为管理员(注意,群主不是管理员);其他一个或两个无意义.
2、获取群成员昵称命令:0126发送:1030196367;0126;0;4b2b432f;0;1;XXXXXX;第五个固定为0;第六个欲获取的群成员数量;第七个以后为相应的群成员QQ号.
返回:1030196367;0126;0;0;XXXXXX;168;成员昵称;0;第四个是没有信息的成员数量,比如发送了十个成员的QQ号,这个数为2,表示本条信息只包括8个成员的信息,还差2个;第五个就是成员QQ号了;第六个为头像编号;第七个为成员昵称;第八个成员VIP等级.
7、WebQQ协议分析(7)——获取群信息(2)3、获取群成员名片昵称命令:30发送:1030196367;30;0;4b2b432f;0f;XXXXXX;0;0;第五个为子命令0f标识;第六个为群ID(不是群号);第七个固定为0;第一次获取时第八个参数为0,以后获取时第八个参数为前一次返回的值.
服务器返回:1030196367;30;0;0f;0;XXXXXX;4;0;XXXXXX;成员1;XXXXXX;成员2;第四个为子命令0f;第五个为0才是正确的;第六个即为群ID;第七个为成员QQ号及群名片昵称的数据长度;第八个数如果为0即所有数据获取完毕,不为0则需要用这个数再次获取群成员名片昵称;第九个第十个分别为群成员QQ号及群名片昵称.
.
.
.
.
.
8、WebQQ协议分析(8)——聊天(1)基本信息已经获取完成,下面就可以聊天了.
有必要说明一下,由于WebQQ是基础HTTP协议的,所以服务器有了新信息需要客户端更新时不会主动给客户端发送信息,需要客户端定时去服务器查询.
WebQQ的定时查询命令是00,格式如下:1030196367;00;消息编号;4b2b432f;WebQQ是每隔大约1秒向服务器发送一次消息的.
1、得到群聊天内容服务器返回的命令:17格式如下:1030196367;17;28656;XXXXXX;54028;2b;0b;聊天内容;0c40808010新宋体;1;86540289;XXXXXX;128783;374;1281709924;3305670154;第二个值为命令号17;第三个值可以理解为聊天内容编号;第四个为群ID号,注意不是群号;第五个也是聊天内容编号;第六个为子命令号,2b表示群消息;第七未知;第八个为聊天内容,聊天内容有些复杂,比如图片和QQ表情是不同的,现在只处理最简单的文本;第九个为字体,前两个字符"0c"组成一个字节的十六进制数,该字节的第一位为下划线位,第二位斜体位,第三位为加粗位,后五位为字体大小位,"408080"为文本颜色,"10"无意义,再往后就是字体了;第十二个为发言人的QQ号;第十五个为发言时间.
接收到聊天消息后须告诉服务器接收成功,格式如下:1030196367;17;28656;4b2b432f;XXXXXX;1030196367;54028;2;3305670154;显然,服务器接收到的第三个、第五个、第十六个数是需要用的,数据比较容易分析,这里不再多说明.
如果不回复这条消息,服务器会以为客户端没有收到该条聊天内容,会再次发送;当然即使回复了也可能重复接收,所以需要记录聊天内容编号以处理是否已经接收过.
10、WebQQ协议分析(10)——聊天(3)3、给好友发送消息命令:16格式如下:1030196367;16;消息号;4b2b432f;XXXXXX;0b;0;消息内容;0900000010宋体;第五个为接收消息的好友QQ号;第六个0b固定;第七个0固定;第八个为给好友的聊天内容;第九个为字体信息.
4、给群发送消息命令:30格式如下:%s;30;消息号;4b2b432f;0a;XXXXXX;消息内容;0900000010宋体;第五个固定为0a;第六个为群ID(不是群号);第七个为聊天内容;第八个为字体信息.
注:1、多个消息之间有一个字节,值为0x1d.
2、鉴于腾讯不再研发http://web.
qq.
com而研发http://web2.
qq.
com,故本博客不再发表基于http://web.
qq.
com的"WebQQ协议分析"的文章.
捷锐数据官网商家介绍捷锐数据怎么样?捷锐数据好不好?捷锐数据是成立于2018年一家国人IDC商家,早期其主营虚拟主机CDN,现在主要有香港云服、国内物理机、腾讯轻量云代理、阿里轻量云代理,自营香港为CN2+BGP线路,采用KVM虚拟化而且单IP提供10G流量清洗并且免费配备天机盾可达到屏蔽UDP以及无视CC效果。这次捷锐数据给大家带来的活动是香港云促销,总共放量40台点击进入捷锐数据官网优惠活动内...
VoLLcloud LLC是一家成立于2020年12月互联网服务提供商企业,于2021年1月份投入云计算应用服务,为广大用户群体提供云服务平台,已经多个数据中心部署云计算中心,其中包括亚洲、美国、欧洲等地区,拥有自己的研发和技术服务团队。现七夕将至,VoLLcloud LLC 推出亚洲地区(香港)所有产品7折优惠,该产品为CMI线路,去程三网163,回程三网CMI线路,默认赠送 2G DDoS/C...
云基yunbase怎么样?云基成立于2020年,目前主要提供高防海内外独立服务器,欢迎各类追求稳定和高防优质线路的用户。业务可选:洛杉矶CN2-GIA+高防(默认500G高防)、洛杉矶CN2-GIA(默认带50Gbps防御)、香港CN2-GIA高防(双向CN2GIA专线,突发带宽支持,15G-20G DDoS防御,无视CC)。目前,美国洛杉矶CN2-GIA高防独立服务器,8核16G,最高500G ...