因为弄了个挂论坛的东西,想再弄个挂QQ的,这样论坛有消息的话自动转发到我的QQ上来,就不用担心漏掉论坛PM了。动机是十分的明确了哦。直接上主题了吧。
首先当然是QQ登陆了。说到QQ协议,实在太烂了,已经很多牛人去研究过了。我就直接拿别人的成果过来好了。主要是参考了libqq的代码
http://code.google.com/p/libqq-pidgin/wiki/QQ2010Protocol
登陆过程就是一系列的命令,0x91, 0xba, 0xdd,0xe5, 0xe3, 0x30, 0xe9, 0xea, 0xeb, 0xec, 0xed。好了按照协议发完这一大堆的命令之后,就处于在线状态了。通过修改0x30的参数,可以实现隐身登陆。同时0x30命令也是最重要的,因为这条命令会返回session_key,以后的通讯都是用这个来加密的了。不过如果长时间不操作的话,还需要保持在线,方法是发送心跳包。心跳包是0x58命令,libqq上有这样的代码了,只是文档上没有文字说明,直接看源代码吧,获得源代码方式一般都是svn的啦。
svn checkout
在源码的qq_base.c文件的qq_request_keep_alive函数中有注释文字说明,这里就不废话了。
不用qq的话记得要注销啊,否则次数多了,你的帐号就可能异常了,需要登陆网站解除异常状态,那个网站是:
http://aq.qq.com/xz
注销的命令是0x62,就是加密15bytes的0发送到服务器就可以了,据说要发送4次,who care?
以上说的就是挂Q需要的基本功能了。不过要转发消息的话,还需要有发送消息的命令。发送消息的命令是0xcd,因为网上的资料有点凌乱,看libqq的又觉得有问题,使用QQAnalyzer分析如下:(注释后面那个数字是对应的偏移量)
02 1E 07 00 CD 3B 20 1B D1 B8 D2 02 00 00 00 01
01 01 00 00 64 1A 05 0E 3B 48 B5 56 18 2D AB 87
49 45 2E E5 B6 75 01 4D BB F9 20 01 5D 36 44 3E
90 0A 7C 2B 48 FD CC A9 EB 1F C2 B6 18 43 DD 75
7F DB 32 5A 80 AE 33 8C 06 1D B2 D4 73 3D BD 50
6C 6B 43 65 0E 29 78 87 25 3E 72 86 BE C9 FE 2B
29 2B D7 93 CF A4 6B 91 35 51 95 1B 6A 4F FA 46
FA 34 B2 08 7E 67 48 48 45 2A 53 AA DA FE 15 56
36 BD 6A EE A0 3C FA 0D 11 20 FC C4 00 F7 F9 7A
9C 16 41 0A 10 C3 78 7E F2 96 DB 34 C3 3C CC 71
CC A3 3F 0D CA 3B E3 4B 57 6E 34 5B A2 1B
[
1B D1 B8 D2 //发送者的QQ号码+0
02 2B F6 11 //接收者的QQ号码+4
00 00 00 08 00 01 00 04 00 00 00 00 // fixed version depended +8
1E 07 //发送者的QQ版本号 +20
1B D1 B8 D2 //发送者的QQ号码+22
02 2B F6 11 //接收者的QQ号码+26
AE F7 0E 44 A8 78 AD 98 01 A2 32 8E 99 3E 0F E9//md5(接收者的QQ号码+ session_key) + 30
00 0B //消息类型. 0x000B for normal text message + 46
4A 0C //序列号 + 48
4D 85 90 6C //发送时间 + 50
00 00 //发送图标 + 54
00 00 00 //fixed + 56
01 //是否带有字体 + 59
01 //分片数 + 60
00 //分片索引 + 61
00 00 //消息id,从0开始 + 62
01 //发送的类型。01 for normal message ; 02 for auto reply message + 64
4D 53 47 00 00 00 00 00 //fixed + 65
4D 85 90 6C //发送时间 + 73
C3 81 99 67 //随机数 + 77
00 //fixed + 81
00 00 00 //字体红绿蓝三个分量值 + 82
09 //字体显示大小 + 85
00 //是否还有其他字体属性 + 86
86 00//字符集; 86 for utf8 + 87
00 06 //字体名称长度 + 89
E5 AE 8B E4 BD 93 //字体名称:宋体(按照字符集的编码) + 91
00 00 01 //fixed + 97
00 26 //total message block size//所有消息块的大小 + 100
01 //the first message block//消息块编号 + 102
00 23 //size of the first message block//消息块大小 + 103
49 20 61 6D 20 69 6E 20 42 31 38 34 30 35 2E E8 // 消息: (按照字符集的编码) + 105
BF 99 E6 98 AF E4 B8 AD E6 96 87 E3 80 82 31 30
30 38 36
]
03
这个是服务器对0xcd命令的回复,用session_key解密之后是一个字节的0,表示服务器接收到了我们发送出去的消息。
[NO.795 2011-03-20 13:28:06 450 RECEIVE]
02 1E 07 00 CD 3B 20 1B D1 B8 D2 00 00 00 AA E4
06 9F 91 4B 78 93 B9 23 4D FE 43 DD 76 A9
[
00
]
03
好了,至于接收消息的,那是后话了,有需要再考虑吧。写下此文,以备不时之需。又至于开头提到的挂论坛的程序,等有时间,心情好的时候再发出来和大家交流吧。对于想研究QQ协议的朋友来说,再提供多一个开源的目前可用的QQ项目给大家吧:
http://code.google.com/p/myqq3/
QQ2010协议(发送消息)
发表评论