基于WebQQ3.0协议写一个QQ机器人

一个偶然的机会,在某群看到一个类似QQ机器人的玩意在骚动,问那哥们回答说是JAVA写的,原来QQ还能这样玩儿。于是乎,我也就开始骚动了。Let’s go

1.WEBQQ3.0登陆协议

进入WEBQQ, http://web.qq.com/

通过工具分析,可以知道,用户在输入密码之前(也就是输入帐号后),会首先GET一个请求过去

https://ssl.ptlogin2.qq.com/check?uin=58237991&appid=1003903&r=0.5534069868735969

我们只详细分析下这一个请求,看看,这个请求到底携带了什么样的数据

这个GET请求返回ptui_checkVC(’0′,’!TMX’,’\x00\x00\x00\x00\x0e\xe9\x41\xc1′);这样的字符串,其中第一个字符串,’0′代表不需要验证码,’!TMX’这个数据,是等会登陆需要的,第三个字符串加密密码的时候会用到。

附PHP代码如下:

密码登陆后,监控到这样一个请求

http://ptlogin2.qq.com/login?u={$uid}&p={$passwd}&verifycode={$verify}&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%2Fweb.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=8-38-447467&mibao_css=m_webqq&t=3&g=1

其中有三个参数需要解释一下

u:QQ号

p:加密后的密码

verifycode:验证码

附PHP版登录函数以及加密函数代码如下:

登录成功后返回值类似:

ptuiCB(’0′,’0′,’http://web.qq.com/loginproxy.html?login2qq=1&webqq_type=10′,’0′,’登录成功!’, ‘秋风’);

还有一组COOKIE,COOKIE值全都保存起来,待会儿会用到。

到这一步其实还没有真正的登录QQ的聊天接口,继续往下看。

第一次登录成功后,紧接着发送一个POST到http://d.web2.qq.com/channel/login2

POST值(请把参数值用urlencode函数编码)如下:

r={“status”:”online”,”ptwebqq”:”{$ptwebqq}”,”passwd_sig”:””,”clientid”:”{$clientid}”,”psessionid”:null}&clientid={$clientid}&psessionid=null

其中ptwebqq的值来自第一次登录时候的COOKIE值ptwebqq

clientid是个随机数,自己定义就行了

请求后的返回值是一个JSON格式的值,保存起来,后边收发信息时会用到:

到此为止,登陆就完成了。

附PHP版解析Cookie File函数以及登录函数代码如下:

2.传说中的心跳包

顾名思义,心跳包,就是维持一个长连接,让WEBQQ保持在线的一种机制,.这个心跳包非常简单,只需要每隔几秒,或者写一个死循环发起请求就好(长时间不触发此步骤,会导致QQ掉线)

POST地址:http://d.web2.qq.com/channel/poll2

POST值(请把参数值用urlencode函数编码)如下:

r={“clientid”:”{$clientid}”,”psessionid”:”{$psessionid}”,”key”:0,”ids”:[]}&clientid={$clientid}&psessionid={$psessionid}

其中psessionid的值,在第二次登录返回的JSON信息里边能找到

clientid与第二次登录时候的clientid相同

附PHP版心跳请求函数代码如下:

3.获取QQ群列表

POST地址:http://s.web2.qq.com/api/get_group_name_list_mask2

POST值(请把参数值用urlencode函数编码)如下:

r={“vfwebqq”:”{$vfwebqq}”}

只有一个参数,很爽对吧?这个值在第二次登录的时候可得到,回头去找找看吧

附PHP版获取群列表函数代码如下:

4.获取好友列表

POST地址:http://s.web2.qq.com/api/get_user_friends2

POST值(请把参数值用urlencode函数编码)如下:

r={“h”:”hello”,”vfwebqq”:”{$vfwebqq}”}

vfwebqq的值在第二次登录的时候可得到,回头去找找看吧

(ps:在编辑本文时,发现这个请求链接的POST值已经加了一个参数hash,分析出来源后尽快补上,这对全局影响并不大)

附PHP版获取好友列表函数代码如下:

5.发送QQ消息

POST地址:http://d.web2.qq.com/channel/send_buddy_msg2

POST值(请把参数值用urlencode函数编码)如下:

r={“to”:{$from_uin},”face”:606,”content”:”[\”{$msg}\\n\”,[\”font\”,{\”name\”:\”宋体\”,\”size\”:\”10\”,\”style\”:[0,0,0],\”color\”:\”000000\”}]]”,”msg_id”:{$msg_id},”clientid”:”{$clientid}”,”psessionid”:”{$psessionid}”}&clientid={$clientid}&psessionid={$psessionid}

部分参数解释:

to:好友的uin(非QQ号)

content:发送的消息内容

psessionid:在第二次登录返回的JSON信息里边能找到

clientid:与第二次登录时候的clientid相同

附PHP版发送QQ消息函数代码如下:

6.发送QQ群消息

POST地址:http://d.web2.qq.com/channel/send_qun_msg2

POST值(请把参数值用urlencode函数编码)如下:

r={“group_uin”:{$group_id},”content”:”[\”{$msg}\\n\”,[\”font\”,{\”name\”:\”宋体\”,\”size\”:\”10\”,\”style\”:[0,0,0],\”color\”:\”000000\”}]]”,”msg_id”:{$msg_id},”clientid”:”{$clientid}”,”psessionid”:”{$psessionid}”}&clientid={$clientid}&psessionid={$psessionid}

部分参数解释:

group_uin:群的uin(非QQ群号)

content:发送的消息内容

psessionid:在第二次登录返回的JSON信息里边能找到

clientid:与第二次登录时候的clientid相同

附PHP版发送QQ群消息函数代码如下:

事实上,做到心跳包的时候,再往下已经没有技术含量了,已经属于体力活了。

最后附一个基于WebQQ3.0写的一个开源的WebQQ机器人,有兴趣的朋友可以研究研究。

参考资料

http://www.cnblogs.com/gitdnn/archive/2013/01/13/2858408.html

http://www.meesii.in/71.html

关于稚子

你们眼中的草根
此条目发表在应用工具软件分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注