`
xiexd
  • 浏览: 248598 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

WEB QQ 网页登陆QQ QQ的HTTP接口探究

阅读更多


1、研究说明

  Tencent在tqq.tencent.com的8000有一个使用HTTP的QQ接口,通过这个接口,可以进行一些基本的操作,如:登陆、 登出、改变登陆状态(上线、忙碌、离线、隐身)、添加删除好友、查看好友信息、发送验证信息(接受被加为好友、申请加对方为好友、拒绝被加为好友)、收发 用户消息、系统信息。

  目前我研究的是1.1版本的HTTP QQ协议,研究是微程在的成果上进行的,不敢说有什么超越,只不过更为详细和准确。

2、接口说明:

  接口位置:tqq.tencent.com:8000
通信协议:HTTP
数据传输方法:POST
HTTP请求格式:

POST HTTP/1.1
Host: tqq.tencent.com:8000
Content-Type: text/plain; charset=UTF-8
Content-length: 长度
Connection: close

数据

  其中长度为 数据 的长度,数据的格式:
VER=1.1&CMD=命令&SEQ=标记&UIN=QQ号&....

  以上4个参数是每个请求都必有的。其中,VER表示协议的版本,目前为1.1,据说1.2已经出来了,这个乱写的话,服务器返回 NULL;CMD为操作的指令,有Login、List、Query_Stat、GetInfo、AddToList、Ack_AddToList、 DelFromList、Change_Stat、GetMsgEx、CLTMSG、Logout;SEQ为当前请求的标记,防止重复发送,可以用当前时 间,也可以用随机数;UIN是当前执行操作的QQ号。不过不同的CMD还需要不同的参数,下面我就公布我的研究成果。

3、研究方法:

  我对目前网上的资料不够满意,就自己写程序,发送多条相同CMD不同参数的请求,根据服务器的返回,来做判断。感兴趣的朋友可以参考一下,此处可以跳过。
下面我公布我探测的代码(php ):

  1. $uin  =  "QQ号" ;  
  2. $pwd  = md5( "QQ密码" );  
  3.   
  4. //登陆测试   
  5. $poststring [] =  "VER=1.1&CMD=Login&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&PS=" . $pwd . "&M5=1&LC=9326B87B234E7235" ;  
  6. //注意:登陆测试不能同时进行,必须等到服务器认为QQ断开了,才能够测试,不然结果不可信   
  7. /*******  
  8. $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=0&LC=9326B87B234E7235";  
  9. $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=1&LC=9326B87B234E7235";  
  10. $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=2&LC=9326B87B234E7235";  
  11. $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=3&LC=9326B87B234E7235";  
  12. $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M6=1&LC=9326B87B234E7235";  
  13. $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M6=1&LC=1223423545756679";  
  14. *******/   
  15.   
  16.   
  17. //得到好友列表   
  18. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin ;  
  19. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0" ;  
  20. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=160" ;  
  21. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=0" ;  
  22. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=" .rand(1,10);  
  23. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=0" ;  
  24. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=160&UN=0" ;  
  25. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=160&UN=0" ;  
  26. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=" .rand(1,200). "&UN=0" ;  
  27. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=" .rand(1,200). "&UN=0" ;  
  28. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=" .rand(1,200). "&UN=0" ;  
  29. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=" .rand(1,10);  
  30. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=" .rand(1,10);  
  31. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=" .rand(1,10);  
  32. $poststring [] =  "VER=1.1&CMD=List&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=106814" ;  
  33.   
  34. //得到在线列表   
  35. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin ;  
  36. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0" ;  
  37. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=160" ;  
  38. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=0" ;  
  39. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=" .rand(1,10);  
  40. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=0" ;  
  41. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=160&UN=0" ;  
  42. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=160&UN=0" ;  
  43. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=" .rand(1,200). "&UN=0" ;  
  44. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=" .rand(1,200). "&UN=0" ;  
  45. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=" .rand(1,200). "&UN=0" ;  
  46. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=" .rand(1,10);  
  47. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=" .rand(1,10);  
  48. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=" .rand(1,10);  
  49. $poststring [] =  "VER=1.1&CMD=Query_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&TN=0&UN=106814" ;  
  50.   
  51. //查看好友信息   
  52. $poststring [] =  "VER=1.1&CMD=GetInfo&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&LV=0&UN=106814" ;  
  53. $poststring [] =  "VER=1.1&CMD=GetInfo&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&LV=1&UN=106814" ;  
  54. $poststring [] =  "VER=1.1&CMD=GetInfo&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&LV=2&UN=106814" ;  
  55. $poststring [] =  "VER=1.1&CMD=GetInfo&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&LV=3&UN=106814" ;  
  56. $poststring [] =  "VER=1.1&CMD=GetInfo&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&LV=4&UN=106814" ;  
  57. $poststring [] =  "VER=1.1&CMD=GetInfo&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&LV=5&UN=106814" ;  
  58.   
  59. //增加好友   
  60. $poststring [] =  "VER=1.1&CMD=AddToList&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=106814" ;  
  61.   
  62. //发送验证   
  63. $poststring [] =  "VER=1.1&CMD=Ack_AddToList&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=106814&CD=0&RS=TEST" ;  
  64. $poststring [] =  "VER=1.1&CMD=Ack_AddToList&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=106814&CD=1&RS=TEST" ;  
  65. $poststring [] =  "VER=1.1&CMD=Ack_AddToList&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=106814&CD=2&RS=TEST" ;  
  66. $poststring [] =  "VER=1.1&CMD=Ack_AddToList&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=106814&CD=3&RS=TEST" ;  
  67. $poststring [] =  "VER=1.1&CMD=Ack_AddToList&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=106814&CD=4&RS=TEST" ;  
  68. $poststring [] =  "VER=1.1&CMD=Ack_AddToList&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=106814&CD=5&RS=TEST" ;  
  69.   
  70. //删除好友   
  71. $poststring [] =  "VER=1.1&CMD=DelFromList&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=106814" ;  
  72.   
  73. //改变状态   
  74. for ( $i =0; $i <=60; $i = $i +5)  
  75. {  
  76. $poststring [] =  "VER=1.1&CMD=Change_Stat&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&ST=" . $i ;  
  77. }  
  78.   
  79. //获得消息   
  80. $poststring [] =  "VER=1.1&CMD=GetMsgEx&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "" ;  
  81.   
  82. //发送消息   
  83. $poststring [] =  "VER=1.1&CMD=CLTMSG&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "&UN=106814&MG=TEST" ;  
  84.   
  85. //登出   
  86. $poststring [] =  "VER=1.1&CMD=Logout&SEQ=" .rand(1000,9000). "&UIN=" . $uin . "" ;  
  87.   
  88. $file  =  fopen ( "p.txt" , "w" );  
  89.   
  90. foreach ( $poststring   as   $k => $v )  
  91. {  
  92.  ss_timing_start();  
  93.  $fp  =  fsockopen ( 'tqq.tencent.com' '8000' $errno $errstr $timeout  = 10);  
  94.   
  95.  if (! $fp ){  
  96.   //error tell us   
  97.   $content  =  $k . chr (13). chr (10). "ERROR:$errstr ($errno)" ;  
  98.      
  99.  }else {  
  100.   
  101.    //send the server request   
  102.    fputs ( $fp "POST HTTP/1.1" );  
  103.  //  fputs($fp, "Host: $host");   
  104.  //  fputs($fp, "Content-type: application/x-www-form-urlencoded");   
  105.    fputs ( $fp "Content-length: " . strlen ( $v ). "" );  
  106.    fputs ( $fp "Connection: close" );  
  107.    fputs ( $fp $v  .  "" );  
  108.   
  109.    //loop through the response from the server   
  110.    $res  =  "" ;  
  111.    while (! feof ( $fp )) {  
  112.     $res  .=  fgets ( $fp , 4096);  
  113.    }  
  114.    //close fp - we are done with it   
  115.    fclose($fp );  
  116.   
  117.    $content  =  $v . chr (13). chr (10). $res ;  
  118.  }  
  119.  ss_timing_stop();  
  120.  $content  .=  chr (13). chr (10). "Time: " .ss_timing_current(). chr (13). chr (10). "--------------------------------------" . chr (13). chr (10);  
  121.  fputs ( $file , $content );  
  122. }  
  123. fclose($file );  
  124. ?>  
  125. function  ss_timing_start ( $name  =  "default" ) {  
  126. global   $ss_timing_start_times ;  
  127. $ss_timing_start_times [ $name ] =  explode ( ' ' , microtime());  
  128. }  
  129. function  ss_timing_stop ( $name  =  "default" ) {  
  130. global   $ss_timing_stop_times ;  
  131. $ss_timing_stop_times [ $name ] =  explode ( ' ' , microtime());  
  132. }  
  133. function  ss_timing_current ( $name  =  "default" ) {  
  134. global   $ss_timing_start_times $ss_timing_stop_times ;  
  135. if  (!isset( $ss_timing_start_times [ $name ])) {  
  136. return  0;  
  137. }  
  138. if  (!isset( $ss_timing_stop_times [ $name ])) {  
  139. $stop_time  =  explode ( ' ' , microtime());  
  140. }  
  141. else  {  
  142. $stop_time  =  $ss_timing_stop_times [ $name ];  
  143. }  
  144. $current   =   $stop_time [1]- $ss_timing_start_times [ $name ][1];  
  145. $current  +=  $stop_time [0]- $ss_timing_start_times [ $name ][0];  
  146. return   $current ;  
  147. }  
  148. ?>

4、研究成果: 

(1).登陆
说明:在你做任何其他操作以前,你必须登陆。只有在登陆以后,你的其他指令才有可能被正确执行(返回RES=0),不然服务器会返回RES=20,不过有 个例外,就是logout。当你成功登陆以后,服务器就会根据你的IP*和参数中的UIN来验证身份。一台电脑可以同时登陆多个QQ,互不影响,就是因为 有参数UIN。
*至于我能够确定服务器是通过IP来验证的,是因为服务器不可能通过我的请求获得其他信息了^_^

  提交数据:VER=1.1&CMD=Login&SEQ=标记&UIN=QQ号&PS=QQ密码&M5=1&LC=9326B87B234E7235
说明:QQ密码是通过md5加密的字符串,在php 中可以直接用md5()进行加密;
M5这个参数的作用还不清楚,但最好为1。
LC这个参数有点神秘,不能有丝毫改动,不然服务器就没有响应(没有响应就是返回NULL)。

  返回:VER=1.1&CMD=LOGIN&SEQ=标记&UIN=QQ号&RES=0&RS=0&HI=60&LI=300(成功)
VER=1.1&CMD=LOGIN&SEQ=标记&UIN=QQ号&RES=0&RS=1&RA=密码错误(密码错误)
VER=1.1&CMD=LOGIN&SEQ=标记&UIN=QQ号&RES=5(QQ号非法,如100)
NULL(UIN为字符、PS为空、LC错误)

(2).得到好友列表
提交数据:VER=1.1&CMD=List&SEQ=标记&UIN=QQ号&TN=160&UN=0
说明:TN、UN还不清楚具体表示什么,但是TN的值会影响返回的结果,有没有UN对结果没有影响

  返回:VER=1.1&CMD=LIST&SEQ=标记&UIN=QQ号&RES=0&FN=9(当TN=0或没有TN参数时,FN表示好友数)
VER=1.1&CMD=LIST&SEQ=标记&UIN=QQ号&RES=0&FN=1&SN=9& amp;UN=3814526,...,(当TN存在且非0时,FN=1,SN表示好友数,UN为好友列表,用","分割)
VER=1.1&CMD=LIST&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
NULL(UIN、TN、UN为字符)

(3).得到在线好友列表
提交数据:VER=1.1&CMD=Query_Stat&SEQ=标记&UIN=QQ号&TN=50&UN=0
说明:TN、UN还不清楚具体表示什么,但是TN的值会影响返回的结果,有没有UN对结果没有影响

  返回:VER=1.1&CMD=QUERY_STAT&SEQ=标记&UIN=QQ号&RES=0& FC=0,&FN=1&SN=1&ST=10,&UN=106814,&NK=Hackfan 好,(当TN存在且非0时,FN=1,SN表示在线好友数,FC、ST、UN、NK的值用','分割,分别表示头像、状态、号码、昵称)
VER=1.1&CMD=QUERY_STAT&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
NULL(UIN、TN、UN为字符)
说明:FC为QQ头像的的ID,如的头像ID为270,那么其头使用的图片为91.bmp,其算法为ID/3+1;
ST为QQ用户的状态,10为上线,20为离线(或隐身),30为忙碌;

  特别说明:当参数TN=0或不存在时,服务器返回:
VER=1.1&CMD=Query_Stat&SEQ=标记&UIN=QQ号
HTTP/1.1 200 OK
Server: tencent imserver/1.0.0
Content-Type: text/plain; charset=UTF-8
Content-Length: 56

VER=1.1&CMD=QUERY_STAT&SEQ=标记&UIN=QQ号&RES=0&FN=1
HTTP/1.1 200 OK
Server: tencent imserver/1.0.0
Content-Type: text/plain; charset=UTF-8
Content-Length: 77

VER=1.1&CMD=QUERY_STAT&SEQ=标记&UIN=QQ号&RES=0&FC=&FN=1&SN=0&ST=&UN=&NK=
返回了2次,第一次的结果中,FN为在线好友数,第二次返回的数据基本没用。

(4).查看好友信息
提交数据:VER=1.1&CMD=GetInfo&SEQ=标记&UIN=QQ号&LV=查询类型&UN=被查询QQ号码
说明:LV=0,1为精简查询,LV=2为普通查询,LV>=3为详细查询

  返回:VER=1.1&CMD=GETINFO&SEQ=标记&UIN=QQ号&RES=0&LV=0&UN=106814&NK=Hackfan 好(精简查询)
VER=1.1&CMD=GETINFO&SEQ=标记&UIN=QQ号&RES=0&AD=地址&AG=19&EM=hackfan@qq.com&FC=0&HP=http://blog.hackfan.net&JB =学生
&LV=2&PC=邮编&PH=电话&PR=The guy is updating to .NET Frameword......&PV=江苏&RN=胡吉阳&SC=毕业院校&SX=0&UN=106814& amp;NK=Hackfan
好(普通查询)
VER=1.1&CMD=GETINFO&SEQ=标记&UIN=QQ号&RES=0&AD=地址& AG=19&BT=2&CO=6&CT=苏州&CV=%01&CY=中华人民共和国
&EM=hackfan@qq.com&FC=0&HP=http://blog.hackfan.net&ID=-&JB =学生&LV=3&MO=136********&MT=0&MV=&PC=邮编&PH=电话&PR=The guy is
updating to .NET Frameword......&PV=江苏&RN=胡吉阳&SC=毕业院校&SH=3&SX=0&UN=106814&NK=Hackfan 好(详细查询)
VER=1.1&CMD=GETINFO&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
NULL(UIN、LV、UN为字符)

  说明:AD为联系地址
AG为年龄
BT为血型
CO为星座
CT为城市
CV为未知*
CY为国家
EM为Email
FC为头像
HP为网站
ID为未知
JB为职业
LV为查询代码(就是发送的LV)
MO为移动电话
MT为未知
MV为未知
PC为邮编
PH为联系电话
PR为简介
PV为省
RN为真实姓名
SC为毕业院校
SH为生肖
SX为性别
UN为QQ号
NK为昵称

     血型:0 => '',
1 => 'A型',
2 => 'B型',
3 => 'O型',
4 => 'AB型',
5 => '其他'


星座:0 => '',
1 => '水瓶座',
2 => '双鱼座',
3 => '牡羊座',
4 => '金牛座',
5 => '双子座',
6 => '巨蟹座',
7 => '狮子座',
8 => '处女座',
9 => '天秤座',
10 => '天蝎座',
11 => '射手座',
12 => '摩羯座'

     生肖:0 => '',
1 => '鼠',
2 => '牛',
3 => '虎',
4 => '兔',
5 => '龙',
6 => '蛇',
7 => '马',
8 => '羊',
9 => '猴',
10 => '鸡',
11 => '狗',
12 => '猪'

     性别:0 => '男',
1 => '女'

(5).增加好友
提交数据:VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&UN=对方QQ号

  返回:VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&RES=0&CD=0&UN=对方QQ号(允许被加为好友,此时他已经是你的好友)
VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&RES=0&CD=1&UN=对方QQ号(需要验证)
VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&RES=0&CD=2&UN=对方QQ号(决绝被加为好友)
VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
NULL(UIN、UN为字符)

(6).发送验证
说明:1、如果你加对方为好友,你需要发送验证
2、对方加你为好友,发送了验证,你要通过或者拒绝
这2种情况需要发送验证消息

  提交数据:VER=1.1&CMD=Ack_AddToList&SEQ=标记&UIN=QQ号&UN=对方QQ号&CD=验证类型&RS=理由
说明:CD为0表示“通过验证”,CD为1表示“拒决加为对方为好友”,CD为2表示“为请求对方加为好友”。

  返回:VER=1.1&CMD=Ack_AddToList&SEQ=标记&UIN=QQ号&RES=0(成功)
VER=1.1&CMD=Ack_AddToList&SEQ=标记&UIN=QQ号&RES=3(*)
VER=1.1&CMD=Ack_AddToList&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
NULL(UIN、UN、CD为字符,RS为非UTF-8字符)
*如果服务器返回RES=3,那么这次对话的响应时间在20s。当发送验证请求的时候,必须连发2次(请求内容不必一样),其中一条RES=3,对方收不到,一条RES=0,对方能够收到。当CD>=3时,RES=3,响应时间20s。

(7).删除好友
提交数据:VER=1.1&CMD=DelFromList&SEQ=标记&UIN=QQ号&UN=删除的QQ号

  返回:VER=1.1&CMD=DelFromList&SEQ=标记&UIN=QQ号&RES=0&(成功)
VER=1.1&CMD=DelFromList&SEQ=标记&UIN=QQ号&RES=3(响应时间30s,重复发送的后果)
VER=1.1&CMD=DelFromList&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
NULL(UIN、UN为字符)

(8).改变状态
提交数据:VER=1.1&CMD=Change_Stat&SEQ=标记&UIN=QQ号&ST=状态代码
说明:状态代码:10为上线,20为离线,30为忙碌,40为隐身,其他视为非法

  返回:VER=1.1&CMD=Change_Stat&SEQ=标记&UIN=QQ号&RES=0&(成功)
VER=1.1&CMD=Change_Stat&SEQ=标记&UIN=QQ号&RES=3(失败,原因不明,响应时间20s,可能是过于频繁的改变状态引起的)
VER=1.1&CMD=Change_Stat&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
NULL(UIN为字符,ST非法)

  特别说明:如果你改变好友,将会给所有好友发送一条系统信息,内容就是状态代码;如果隐身,发送的状态代码为20,表示离线。
同理,当你的好友改变状态,你也会收到一条系统信息。

(9).获得消息
提交数据:VER=1.1&CMD=GetMsgEx&SEQ=标记&UIN=QQ号

  返回:VER=1.1&CMD=GETMSGEX&SEQ=标记&UIN=QQ号&RES=0& MN=4&MT=99,99,99,9,&UN=36791785,99833581,99833581,106814,&MG=20,30,10,hi ,(MN表示信息数量,MT、UN、MG的值用","分割,分别表示消息类型、发送人号码、消息内容)
VER=1.1&CMD=GETMSGEX&SEQ=标记&UIN=QQ号&RES=0&MN=0&MT=&UN=&MG=(表示没有信息)
VER=1.1&CMD=GETMSGEX&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
NULL(UIN为字符)
说明:关于MT:
9为用户消息,99为系统消息,2为请求信息,3为通过验证,4为拒绝被加好友
关于MG:
当MT=9时,MG为用户发送的消息内容
当MT=99时,
MG=10(QQ_STATUS_ONLINE)表示对方上线
MG=20(QQ_STATUS_OFFLINE)表示对方下线
MG=30(QQ_STATUS_BUSY)表示对方进入忙碌状态
当MT=2时,MG为对方请求你验证的信息
当MT=3时,表示对方通过你的验证
当MT=4时,MG为对方拒绝你理由
当对方发送的消息过长时,服务器会自动截成几段,每段最多400个字节。完整的信息最后将有一个空格。
比如,我发送401个'A'的信息,接受的时候,服务器返回:
VER=1.1&CMD=GETMSGEX&SEQ=标记&UIN=QQ号&RES=0&MN=2& MT=9,9,&UN=106814,106814,&MG=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,A ,

       比如,我发送400个'A'的信息,接受的时候,服务器返回:
VER=1.1&CMD=GETMSGEX&SEQ=标记&UIN=QQ号&RES=0&MN=2& MT=9,9,&UN=106814,106814,&MG=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,A ,

       比如,我发送399个'A'的信息,接受的时候,服务器返回:
VER=1.1&CMD=GETMSGEX&SEQ=标记&UIN=QQ号&RES=0&MN=1& MT=9,9,&UN=106814,&MG=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ,

(10).发送消息
提交数据:VER=1.1&CMD=CLTMSG&SEQ=标记&UIN=QQ号&UN=对方QQ号&MG=发送内容
说明:发送内容的长度应小于400字节

  返回:VER=1.1&CMD=CLTMSG&SEQ=标记&UIN=QQ号&RES=0&(成功发送,对方不一定能收到哦)
VER=1.1&CMD=CLTMSG&SEQ=标记&UIN=QQ号&RES=3(发送过快或者内容超长>400个字节)
VER=1.1&CMD=CLTMSG&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
NULL(UIN、UN为字符,MG含非UTF-8字符)
说明:1、当你发消息时,以下情形对方可能看不到(其实是收到了,QQ不提示)你发送的消息:
你俩互为陌生人,且对方没有和你说过话
你在他的陌生人列表里,并且他没有和你说过话(没有验证)
2、当你过快发送消息时,系统会给你一个惩罚,RES=3,相应时间20s
3、当我发送含有小写字母h的信息时,服务器有可能返回NULL
4、过长的消息需要分段发送,当消息长度超过400字节的时候,服务器返回RES=3

(11).登出
提交数据:VER=1.1&CMD=Logout&SEQ=标记&UIN=QQ号

  返回:VER=1.1&CMD=LOGOUT&SEQ=标记&UIN=QQ号&RES=0(成功,好像永远成功的,不管你是否登陆)
NULL(UIN为字符)

5、总结

  通过对照以上的接口说明,我开发出了能够实现基本QQ功能的PHP类,它整合了以上所有的接口,使用更方便,可以开发QQ机器人、群发广告程序等。
本文撰写时间仓促,难免有误,希望各位不吝赐教!

QQ的HTTP接口探究
Submitted by Hackfan on 2006, August 10, 11:51 AM
QQ的HTTP接口探究

作者:Hackfan
日期:2005.8.21凌晨
联系:QQ:106814 Email:hackfan@vip.sina.com
Blog:http://blog.hackfan.net

Update:
2005.8.22凌晨:
补充了SendMsg和CltMsg对信息长度的限制和处理说明。

分享到:
评论

相关推荐

    qq农场源码

    6. **社交功能**:QQ农场的社交元素如好友互动、偷菜、送礼等功能,涉及到好友系统的实现,可能利用OAuth或OpenID进行身份验证,并通过API接口与其他腾讯社交产品进行整合。 7. **服务器架构**:对于大量并发用户,...

    WebQQ协议源码

    【标题】"WebQQ协议源码"涉及到的是QQ的网络通信协议,主要关注的是WebQQ这一部分,即QQ在Web端的实现方式。WebQQ协议是腾讯为了在浏览器上实现QQ聊天功能而设计的一种通信协议,它使得用户无需下载安装客户端,通过...

    QQ群聊天数据分析.zip

    QQ群聊天数据分析是一个涵盖Python编程、数据处理与分析的实践案例。在这个项目中,我们将探讨如何利用Python框架来解析和挖掘QQ群的聊天记录,从而提取有价值的信息。Python以其丰富的库资源和简洁的语法,成为了...

    Web报表示例代码

    "Web报表示例代码"这个标题暗示我们将探讨如何在网页中创建和展示报表的相关技术。以下是一些关键知识点,涵盖了Web报表的基础概念、实现方式、常见技术和最佳实践。 1. **基础概念**: - **Web报表**:是通过Web...

    ASP实例开发源码-天人QQ技术网站系统(带手机版).zip

    ASP(Active Server Pages)是一种由微软开发的服务器端脚本环境,用于创建动态网页或Web应用程序。这个实例开发源码——“天人QQ技术网站系统”是一个基于ASP技术构建的网站平台,它不仅包含了传统的PC版网站,还...

    纵横四海文字游戏源码

    1. **编程语言**:由于未明确指出使用哪种编程语言,我们可以推测,考虑到WAP技术,可能使用的是早期的Java或Python,因为这些语言在移动设备上具有较好的跨平台性,并且适合开发Web服务。 2. **WAP技术**:WAP...

    hbuilder 源码 HBuilder登入注册界面.rar

    HBuilder是一款广受欢迎的Web开发工具,由DCloud(数字天堂)公司开发,它提供了丰富的功能,如HTML5编辑、CSS3编辑、JavaScript调试、Vue.js等前端框架的支持,极大地提高了开发者的工作效率。HBuilder的源码对于...

    WebQQ3.0协议分析(更新中)

    WebQQ3.0协议分析是针对腾讯公司推出的WebQQ3.0版本的一种技术解析,它主要探讨了在浏览器环境中如何实现QQ即时通讯的功能。这个协议分析涵盖了登录过程、消息传输、用户状态同步等多个核心环节,对于理解Web应用的...

    基于SQL的学生网络安全教学平台开发.pdf

    3. **IIS服务**:Internet Information Services是微软提供的互联网基础服务,用于托管Web应用程序。在平台开发中,IIS作为服务器端运行环境,配置好主目录后,可以接收并处理来自学生端的HTTP请求,如登录邮箱的...

    spring-boot+webSocket实现向日葵远程控制

    今天带大家通过一个简单的项目来探究一下,并实现一个简单的远程操控软件 具体实现逻辑可以参考我的博客 https://blog.csdn.net/qq_34577234/article/details/125337613 里面详细讲解了实现原理与思路 有问题可以在...

    教育网站后台管理系统源代码

    5. **API接口设计**:为了与其他服务或应用集成,系统可能提供了RESTful API接口,遵循HTTP协议,用JSON格式传输数据,实现数据的交换和功能的扩展。 6. **安全防护**:考虑到用户隐私和数据安全,系统可能实现了...

    星痕帝国2moons网页游戏源码.zip

    这款源码涵盖了游戏的服务器端、客户端、数据库交互等多个方面,是探究网页游戏开发的绝佳实例。 1. **游戏架构** - 《星痕帝国2Moons》的源码结构通常包含多个模块,如游戏逻辑层、用户界面(UI)系统、网络通信...

    网上下载软件教学设计.doc

    - 使用QQ软件和游戏软件作为导入,激发学生兴趣,通过"试一试"和"比一比"的环节,促进学生团队合作,提高他们的技能和自信心。 5. **教学方法**: - 任务驱动:设定具体任务,引导学生主动学习。 - 自主探究:...

    实训网络社区、即时通信活动体验任务单.doc

    此外,艾瑞咨询的WEB2.0和网络服务频道,以及博星卓越学习室等网站提供了最新的行业报告和学习资料。 通过这个实训任务,学生不仅可以了解到我国网络社区和即时通信的发展现状,还可以预测其未来趋势。例如,随着...

    网络环境下体验式导学平台的构建.pdf

    新课程改革倡导学生主动参与和探究,体验式导学平台则通过FTP、Web2.0技术和在线交流工具(如校园聊天室和QQ)提供支持。FTP服务允许教师上传教学资源,帮助学生明确学习目标并自主学习。Web2.0技术则为学生创建内容...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

    QQ:349721489 第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识。  第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的...

    合欢树信息化教学设计.doc

    考虑到学生可能对亲情的理解较浅,教学需借助信息化手段,如Web教室、校园网和互联网,以及多媒体资源库,提供课件和扩展学习资源,以适应学生喜欢直观、感性学习方式的需求。 教学情境创设采用问题性、创设性和...

    带语音的Js代码

    这主要通过Web Speech API的`SpeechSynthesis`接口实现。该接口允许开发者将文本转换为可听见的声音。以下是一段简单的示例代码: ```javascript let synth = window.speechSynthesis; let utterance = new ...

    《合欢树》信息化教学设计.pdf

    2. 教学资源:课前发布相关资源到QQ空间,包含课堂所需及课后扩展学习资料,学生可借助WiFi自行查找和学习。 【教学情境创设】 1. 教学情境类型:创设性、问题性和互动性情境。通过多媒体设备和问题引导,激发学生...

Global site tag (gtag.js) - Google Analytics