程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 實現基本QQ功能的PHP類:QQ機器人

實現基本QQ功能的PHP類:QQ機器人

編輯:PHP綜合

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."&PS=".$pwd."&M5=1&LC=9326B87B234E7235";

//注意:登陸測試不能同時進行,必須等到服務器認為QQ斷開了,才能夠測試,不然結果不可信

/*******

$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=0&LC=9326B87B234E7235";

$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=1&LC=9326B87B234E7235";

$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=2&LC=9326B87B234E7235";

$poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$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)."ERROR:$errstr ($errno)";

}else{

//send the server request

fputs($fp, "POST HTTP/1.1 ");

// fputs($fp, "Host: $host ");

// fputs($fp, "Content-type: application/x-www-form-urlencoded ");

fputs($fp, "Content-length: ".strlen($v)." ");

fputs($fp, "Connection: close ");

fputs($fp, $v . " ");

//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&[email protected]&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=中華人民共和國

&[email protected]&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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved