webqq2协议分析和qq聊天机器人简单实现
通过webqq接口,可以实现发送qq消息接收qq消息等,这样,想实现一个qq聊天机器人,就不是什么难事情了了,下面开始一步步做。
1。首先调用http://ptlogin2.qq.com/check?appid=1003903&uin=qq号码,来获取该qq号码验证码之类的信息。看返回结果决定是不是要输入验证码登陆。
如果返回:ptui_checkVC('1','95ab7db15e5ab17f50f25d33
如果返回:ptui_checkVC('0','!MPG');不需要输入验证码,验证码值用!MPG代替。可能为其他字符串,但是以感叹号开头
如果需要输入验证码:则调用
http://captcha.qq.com/getimage?aid=1003903&&uin=qq号码&vc_type=95ab7db15e5ab17f50f25d33
获取验证码图片。。。
2。开始登陆,在登陆之前,需要将密码加密,tx的加密方法很复杂,不过还好,弄到了他的js文件,然后通过java的ScriptEnginee来执行这个js来获取加密后的字符串。。。
代码:
现在调用登陆接口,以获得相关的cookie。注意Referer。这个一定得加上,否则不成功:Referer : http://web2-b.qq.com/proxy.html
http://ptlogin2.qq.com/login?u=qq号码&p=密码和验证码加密后的字符串&verifycode=验证码&remember_uin=1&aid=1003903&u1=http://web2.qq.com/loginproxy.html?strong%
3Dtrue&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert
登陆成功后,要记住返回的cookie值。
如其中ptwebqq,skey等。
3。这还没有完成,还需要再次登录,这个好像就是qq聊天接口登陆了(刚才的登陆可以理解为登陆qq网站),只有这次登陆,才算真正登陆qq,这个时候,如果你qq已经登陆,会把你的qq踢下线,而且此次登陆才算上线时间。
地址:http://web2-b.qq.com/channel/login,把一个数据结构post给它就够了
r={"status":"","ptwebqq":"{1}","passwd_sig":"","clientid":"{2}"}
其中{1}是ptwebqq,在第2步登陆后cookie返回的,{2}clientId,自己随便定义一个数字吧。
如果成功:
会返回一个json数据结构:
{"retcode":0,"result":
{"uin":qq号码,"mode":"master","index":1055,"port":38138,"status":"online","vfwebqq":"f72a8722c988252aef4e0268
8368046764001D636F6E6E73
FF353A5C6CDAAA49ABB2FCDF
记住其中的psessionid。后面在发送消息和获取qq消息都需要这个参数。
4。发送一个qq消息给好友
地址:http://web2-b.qq.com/channel/send_msg
同样是post:r={"to":qq号码,"face":0,"content":"["23",["font",{"name":"宋体","size":"10","style":
[0,0,0],"color":"000000
"}]]","msg_id":7780001,"clientid":"15778909","psessionid":"8368046764001D636F6E6E73
34574676716D00000028E7D8
{"retcode":0,"result":"ok"}
需要把这个json UrlEncode一下再发送,否则会返回错误。
发送成功返回:{"retcode":0,"result":"ok"}
5。循环获取消息接口:
通过这个接口你可以实时的不间断的获取最新的消息。
http://web2-b.qq.com/channel/poll?
clientid=15778909&psessionid=8368046764001D636F6E6E73
36B0C17365E824FD3817ED2E
返回格式:
{"retcode":0,"result":[{"poll_type":"message","value":{"msg_id":9712,"from_uin":qq号码,"to_uin":qq号码,"msg_id2":217523,"msg_type":9,"reply_ip":2887452740,"time":1288591740,"content":[["font",{"size":9,"color":"000000","style":
[0,0,0],"name":"\u5B8B\u4F53"}],"hello world"],"raw_content":"hello world"}}]}
其中的poll_type表示消息格式,message就是普通的qq消息,可以看到发送人,发送时间,以及消息的内容等。
此接口很特殊,在实现时,需要循环不间断调用,如果没有消息返回,该接口会一直等待到,有消息,读取完后要立即再调用该接口。
6.其他接口
获取头像
http://face7.qun.qq.com/cgi/svr/face/getface?cache=0&type=1&fid=0&uin=号码
获取个人信息
http://web2-b.qq.com/api/get_single_info?tuin=qq号码
获取签名
http://web2-b.qq.com/api/get_single_long_nick?tuin=qq号码&t=1288751545148
获取好友列表
http://web2-b.qq.com/api/get_user_friends
r
获取在线的qq好友
http://web2-b.qq.com/channel/get_online_buddies?clientid=9547083&psessionid=8368046764001D636F6E6E73
获取最近联系人
http://web2-b.qq.com/api/get_recent_contact
r