WebQQ网页登陆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):
$uin = "QQ号";
$pwd = md5("QQ密码");
//登陆测试
$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&S=".$pwd."&M5=1&LC=9326B87B234E7235";
//注意:登陆测试不能同时进行,必须等到服务器认为QQ断开了,才能够测试,不然结果不可信
/*******
$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&S=".$pwd."&M5=0&LC=9326B87B234E7235";
$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&S=".$pwd."&M5=1&LC=9326B87B234E7235";
$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&S=".$pwd."&M5=2&LC=9326B87B234E7235";
$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&S=".$pwd."&M5=3&LC=9326B87B234E7235";
$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M6=1&LC=9326B87B234E7235";
$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M6=1&LC=1223423545756679";
*******/

//得到好友列表
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin;
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0";
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160";
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=0";
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=".rand(1,10);
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=0";
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160&UN=0";
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160&UN=0";
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
$poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=106814";
//得到在线列表
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin;
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0";
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160";
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=0";
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=".rand(1,10);
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=0";
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160&UN=0";
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160&UN=0";
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
$poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=106814";
//查看好友信息
$poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=0&UN=106814";
$poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=1&UN=106814";
$poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=2&UN=106814";
$poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=3&UN=106814";
$poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=4&UN=106814";
$poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=5&UN=106814";
//增加好友
$poststring[] = "VER=1.1&CMD=AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814";
//发送验证
$poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=0&RS=TEST";
$poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=1&RS=TEST";
$poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=2&RS=TEST";
$poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=3&RS=TEST";
$poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=4&RS=TEST";
$poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=5&RS=TEST";
//删除好友
$poststring[] = "VER=1.1&CMD=DelFromList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814";
//改变状态
for($i=0;$i<=60;$i=$i+5)
{
$poststring[] = "VER=1.1&CMD=Change_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&ST=".$i;
}
//获得消息
$poststring[] = "VER=1.1&CMD=GetMsgEx&SEQ=".rand(1000,9000)."&UIN=".$uin."";
//发送消息
$poststring[] = "VER=1.1&CMD=CLTMSG&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&MG=TEST";
//登出
$poststring[] = "VER=1.1&CMD=Logout&SEQ=".rand(1000,9000)."&UIN=".$uin."";
$file = fopen("p.txt","w");
foreach($poststring as $k=>$v)
{
ss_timing_start();
$fp = fsockopen(’tqq.tencent.com’, ’8000’, $errno, $errstr, $timeout = 10);  
if(!$fp){  
   //error tell us  
   $content = $k.chr(13).chr(10)."ERRORerrstr ($errno)";  
     
}else{  
    //send the server request  
    fputs($fp, "POST HTTP/1.1/r/n");  
//   fputs($fp, "Host: $host/r/n");  
//   fputs($fp, "Content-type: application/x-www-form-urlencoded/r/n");  
    fputs($fp, "Content-length: ".strlen($v)."/r/n");  
    fputs($fp, "Connection: close/r/n/r/n");  
    fputs($fp, $v . "/r/n/r/n");  
    //loop through the response from the server  
    $res = "";
    while(!feof($fp)) {  
     $res .= fgets($fp, 4096);  
    }  
    //close fp - we are done with it  
    fclose($fp);  
    $content = $v.chr(13).chr(10).$res;
}  
ss_timing_stop();  
$content .= chr(13).chr(10)."Time: ".ss_timing_current().chr(13).chr(10)."--------------------------------------".chr(13).chr(10);
fputs($file,$content);
}
fclose($file);
?>
function ss_timing_start ($name = "default") {  
global $ss_timing_start_times;  
$ss_timing_start_times[$name] = explode(’ ’, microtime());  
}  
function ss_timing_stop ($name = "default") {  
global $ss_timing_stop_times;  
$ss_timing_stop_times[$name] = explode(’ ’, microtime());  
}  
function ss_timing_current ($name = "default") {  
global $ss_timing_start_times, $ss_timing_stop_times;  
if (!isset($ss_timing_start_times[$name])) {  
return 0;  
}  
if (!isset($ss_timing_stop_times[$name])) {  
$stop_time = explode(’ ’, microtime());  
}  
else {  
$stop_time = $ss_timing_stop_times[$name];  
}  
$current   =   $stop_time[1]-$ss_timing_start_times[$name][1];  
$current += $stop_time[0]-$ss_timing_start_times[$name][0];  
return $current;  
}  
?>
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&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&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为字符)

web qq协议分析相关推荐

  1. Web QQ API 分析

    Web QQ协议分析 本文信息 站在前人的肩膀上 . 本文信息 不定期更新 前言 对Web QQ协议的一些看法 整个鉴权模块Cookie.Session.Token全都用上了 加密函数压缩混淆后放在J ...

  2. QQ协议分析及其还原(二)

    http://www.iprotocolsec.com/2012/02/28/qq%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90%E5%8F%8A%E5%85%B6%E8%B ...

  3. QQ协议分析及其还原(一)

    原文网址 QQ协议分析及其还原(一) 2012-02-26 QQ,一个通信工具,号称6亿的用户量,现在每天的活跃账户在1亿以上.在中国,只要是一个经常上网的网民,手中必须得有一个,当然也可以没有,但是 ...

  4. QQ协议分析之TCPF包数据分析

    2019独角兽企业重金招聘Python工程师标准>>> QQ协议分析之TCPF包数据分析 博客分类: 抓包 说明: 本文档说明的是解密以后的TCPF数据包的字段内容.有关如何解密,请 ...

  5. android qq协议分析工具,QQ协议分析

    QQ协议说明: 协议由报文头(T)+发送者(T)+接收者(T)+报文类型(T)+报文长度(L)+报文内容组成 发送者和接收者是系统内的程序种类,OICQ服务器0x01,传真服务器0x02,WEB服务器 ...

  6. 基于HTTP的QQ协议分析

    1.研究说明 Tencent在tqq.tencent.com的8000有一个使用HTTP的QQ接口,通过这个接口,可以进行一些基本的操作,如:登陆.登出.改变登陆状态(上线.忙碌.离线.隐身).添加删 ...

  7. QQ协议分析的一些思路

    首先,根据网友们的软文,可以知道qq的协议主要是基于tea加密算法的变种,tea算法网上代码很多,随便找一份贴在这里,以方便od调试的时候,知道重点关注那些东西.这是c代码,tea算法是每8个字节为一 ...

  8. android协议分析,【安卓QQ协议分析 】分析带说明

    发送好友消息 数据包 ------------抓包原数据---->> 00 00 01 0C 00 00 00 03 01 00 00 00 2C DD 19 4C 37 98 F8 AD ...

  9. android qq协议分析工具,分析Androidqq协议之收到qq群消息

    16进制 83 02 0A 70 08 FE C0 AC CB 02 10 9E E6 82 11 18 52 20 00 28 B2 F5 0C 30 F6 E3 C6 DD 05 38 D2 80 ...

最新文章

  1. 一篇文章助你了解机器学习
  2. Codeforces Round #703 (Div. 2) 题解
  3. php7 获取数据流,stream_socket_accept()
  4. Qt持久性对象进行序列化
  5. 算法精解:C语言描述
  6. 腾讯云轻量服务器搭建,腾讯云轻量服务器配置系统镜像自定义建站及安全组配置...
  7. 大数据架构师是做什么的?
  8. MapXtrem + Asp.net 地图随窗体改变大小
  9. 在d盘创建文件夹,里面有aaa.txt/bbb.txt/ccc.txt,然后遍历出aaa文件夹下的文件(新手用于记录每天的作业)...
  10. 10岁自闭症小孩,妈妈带她几次粪菌移植治疗后,自闭行为有所改善
  11. CentOS 7提供的ISO镜像文件
  12. 孙子兵法——三十六计
  13. OA系统的一些学习心得(更新中)
  14. msata、mini pcie 、pcie x4接口引脚定义及原理图方案设计
  15. MATLAB机器人工具箱(四)动力学
  16. 网络嗅探器的设计与实现 python实现 计算机网络课程设计
  17. 选择恐惧症应对方法——以终为始来做选择
  18. 计算机组成原理指令系统例题,计算机组成原理作业题5
  19. 一个好的学术资源论坛~~~确实很好 ,一起分享~~
  20. java通用触屏导航_自己动手更换导航触摸屏

热门文章

  1. 怎样免费在电脑上将WPS转换成PDF格式
  2. Perfmon-Windows 自带检测工具(性能测试)
  3. 有趣大会 · EMNLP2022 (Findings CL篇)
  4. 反弹shell bash -i命令
  5. 属牛带宸温柔体贴的女孩名字,念起来朗朗上口
  6. vue中怎么点击修改文字_vue中如何实时修改输入的值
  7. Google软件工程:什么是软件工程
  8. 如何用 Python 了解女伴的情绪变化?
  9. java 达梦数据库结构 转为word文档
  10. java定义全局变量_在java中怎么定义一个全局变量