1、找尋支持 QQ HTTP 協(xié)議的服務(wù)器。 大家也許會(huì)被一些假像所迷惑,也許會(huì)認(rèn)為 QQ 的 HTTP 服務(wù)器是基于 80
口進(jìn)行通信的(如:218.17.209.23: 80) ,其實(shí)不然,正真基于 HTTP 的服務(wù)器應(yīng)該是:http:
//tqq.tencent.com:8000, 它是一個(gè)通過(guò) 8000 口進(jìn)行 通訊的服務(wù)器。 由于 QQ 的 HTTP 服務(wù)器并不支持 HTTP 協(xié)議中
GET 方 法, 它支持 POST 方法。 所以我們要給 QQ 的 HTTP 協(xié)議 傳參數(shù),那么就必需要用 POST 方式才行。 2、C#和 DELPHI
是實(shí)現(xiàn) HTTP 的 POST 方法的通信。 C#: C#里 System.Web 空間下提供了一個(gè)叫做 WebClien t 的對(duì)象, 使用此對(duì)象就可以使
C#直接對(duì)服務(wù)器發(fā)送 WE B 客戶端的請(qǐng)求。 那么我們要對(duì)服務(wù)器提交 POST 方法那 么就必須使用其 UploadData()方法才行。首先把要請(qǐng)求
的信息先轉(zhuǎn)換為字節(jié)(因?yàn)?POST 提交的是字符的流數(shù) 據(jù)) ,然后再做為 UploadData()的參數(shù)。使用 UploadD
ata()進(jìn)行數(shù)據(jù)提交,最后返回,POST 的回饋信息。如 下: WebClient _client = new WebClient(); string
postValues = "VER=1.0&CMD=Query_S
tat&SEQ=12321&UIN=29501213&TN=50&UN= 0"; Byte[] byteArray =
System.Text.Encoding.ASC II.GetBytes(postValues); Byte[] pageData =
_client.UploadData(Host,"P OST",byteArray); 這樣,我們就利用 C#進(jìn)行了一次 HTTP 的 POST 方法
提交了。 值在傳入、返回時(shí),其是基于 UTF-8 進(jìn)行的,C#顯示 中文是很常. 3、實(shí)現(xiàn) QQ 的用戶登錄。 在 QQ
通信中用戶必需要登錄后才可以進(jìn)行互相發(fā)送信 息等。QQ 的登錄是很關(guān)鍵的,大家所看到的用戶在線, 并不是用戶的 QQ 一直連接著服務(wù)器,而是定時(shí)發(fā)送消
信給服務(wù)器,證明自己還連著線,如果超出時(shí)間 QQ 就 認(rèn)為用戶已經(jīng)掉線了。 在登錄協(xié)議中, 的密碼是用標(biāo)準(zhǔn)的 MD5 來(lái)進(jìn)行加密, QQ 而
C#自已帶有,但是直接用不了,必需進(jìn)行處理后,才 能使其變成標(biāo)準(zhǔn)的 MD5,處理代碼如下: public static string MD5(string
toCryS tring) { MD5CryptoServiceProvider hashmd5; hashmd5 = new M
D5CryptoServiceProvider(); return BitConverter.ToString(hashmd5.ComputeH
ash(Encoding.Default.GetBytes(toCryString))).Re place("-","").ToLower();//asp
是小寫(xiě),把所有字符變 小寫(xiě) } 了解 QQ 是如何對(duì)用戶密碼加密后,那么我們就開(kāi)始真 正,解析 QQ 的 HTTP 登錄協(xié)議了,我們把協(xié)議當(dāng)傳 PO ST
的參數(shù)傳給服務(wù)器,而服務(wù)器則回饋相應(yīng)的信息給客 戶端:
傳入?yún)f(xié)議: VER=1.1&CMD=Login&SEQ=&UIN=&PS=&M5
=1&LC=9326B87B234E7235 VER 是用來(lái)說(shuō)明 QQ 協(xié)議的版本,CMD 是說(shuō)明協(xié)議的 命令,Login 就是指 QQ
的登錄了,SEQ 是他的為了防 止重復(fù)發(fā)送而設(shè)定的一個(gè)標(biāo)記,一般我們?nèi)‘?dāng)前時(shí)間數(shù) 值的一段放入即可。(C#:DateTime.Now.Ticks.To
String().Substring(7,7) DELPHI:CopyStr(inttost r(GetTickCount()),1,5)),UIN
是說(shuō)明你當(dāng)前要登錄 的用戶 QQ 號(hào),PS,是 MD5 加密過(guò)后的密碼的值。 返回協(xié)議:
VER=1.1&CMD=Login&SEQ=11281&UIN=&RE
S=0&RS=0&HI=60&LI=300(成功) RES 為 0 表示成功返回,RS 為 0 表示登錄成功。
VER=1.1&CMD=Login&SEQ=11422&UIN=315
103947&RES=0&RS=1&RA=登錄失敗 RS 為 1 表示登錄失敗, 那么就會(huì)出現(xiàn)提示信息 RA 說(shuō)明
原因。 4、獲得 QQ 名單。 如果您加了您的好友,那么您的好友就會(huì)放入你的 QQ 的好友名單里面,那么我們要得到 QQ 名單就必需給 Q Q
服務(wù)器發(fā)送得到好友名單的協(xié)議(我就不從復(fù)已知的 參數(shù)了):
VER=1.1&CMD=List&SEQ=&UIN=&TN=160&U N=0 服務(wù)器得到協(xié)議后如果成功則返回:
VER=1.1&CMD=LIST&SEQ=43661&UIN=2950
1213&RES=0&FN=1&SN=24&UN=561256,1943 497,.... UN 后面則是您好友的 QQ
號(hào)碼,每個(gè)號(hào)碼都由,進(jìn)行分 開(kāi)。那么我們只需要得到 UN 后面的代碼,把它列表化 就 OK 了。C#可以用 string.Split(',')把值放入列表進(jìn)
行處理,而 DELPHI 可以使用 Split()把數(shù)值放入 TStri ngs 里進(jìn)行處理。 5、獲得 QQ 好友在線名單 獲得 QQ
好友在線名單,跟獲得好友名單差不多,唯一 不同的是用的命令不同用的是 Query_Stat,協(xié)議如下:
VER=1.1&CMD=Query_Stat&SEQ=&UIN=&TN =50&UN=0
服務(wù)器得到協(xié)議后如果成功則返回: VER=1.1&CMD=QUERY_STAT&
SEQ=-1&UIN=29501213&RES=0&FC=141,270,2
70,&FN=1&SN=3&ST=10,10,10,&UN= FC 為 QQ 頭像的的 ID, 如的頭像 ID 為 270,
那么其頭 使用的圖片為 91.bmp,其算法為 ID/3+1。ST 為 QQ 用戶的狀態(tài),10 為上線,20 為離線,30 為忙碌。UN 為在線用戶的 QQ
號(hào),NK 為在線用戶的 QQ 昵稱。ST, UN,NK,每個(gè)逗號(hào)隔開(kāi)的數(shù)據(jù)相互對(duì)應(yīng)。 6、得到 QQ 用戶的信息。 如果要看到 QQ
用戶的真實(shí)名稱,MAIL,年齡,個(gè)人說(shuō) 明等信息,那么我們必需要向服務(wù)器發(fā)送得到好友信息 的信息:
VER=1.1&CMD=GetInfo&SEQ=&UIN=&LV=2& UN= UN 為要查看用戶信息的 QQ 號(hào)。
服務(wù)器得到協(xié)議后如果成功則返回: VER=1.1&CMD=GETINFO&SEQ=12707&UIN=4
15103947&RES=0&AD=云南昆明&AG=0&EM=Mi
croprogramer@hotmail.com&FC=270&HP=msg
er.org(建設(shè)中...)&JB=程序員&LV=2&PC=650000
&PH=0871-6466529&PR=網(wǎng)絡(luò)為媒%252c 關(guān)系為 本%252c 信息為財(cái)%252c 客戶為主.%0d%0a&PV=
云南省&RN=劉 X&SC=社會(huì)大學(xué)&SX=0&UN=2425 9132&NK=微程 AD 用戶的聯(lián)系地址,AG
為用戶年齡,EM 為用戶 MAI L,F(xiàn)C 為用戶頭像,HP 為用戶網(wǎng)站,JB 為用戶職業(yè),P C 為用戶郵編,PH 為用戶聯(lián)系電話,PR 為用戶簡(jiǎn)介,P V
為用戶所以的省,RN 為用戶真實(shí)名稱,SC 為用戶畢 業(yè)院校,SX 為用戶性別,UN 為用戶 QQ 號(hào),NK 為用 戶 QQ 昵稱。 7、增加 QQ 好友。
想要新增好友,就要發(fā)送 AddToList 命令給服務(wù)器,具 體命令如下:
VER=1.1&CMD=AddToList&SEQ=&UIN=&UN= UN 為我們要增加用戶的 QQ 號(hào)。
服務(wù)器得到協(xié)議后如果成功則返回: VER=1.1&CMD=AddToList&SEQ=13666&UIN=4
15103947&RES=0&CD=0&UN=24259132 CD 為被加 QQ 的身份驗(yàn)證狀態(tài),CD 為 0 表示“允許任
何人把我列為好友”,CD 為 1 表示“需要身份證認(rèn)才能 把我列為好友”,CD 為 3 表示“不允許任何人把我列為 好友”。如果 CD 為 0
那么信息回饋后,用戶就直接加 為好友了, 如果 CD 為 1, 那么還要發(fā)送一次回應(yīng)加為好 友的響應(yīng)。
8、回應(yīng)加為好友的響應(yīng)。 回應(yīng)加為好友響應(yīng)是雙方的:1、如果你發(fā)送了請(qǐng)求加對(duì) 方為好友,如果對(duì)方需要驗(yàn)證,那么必需發(fā)送回應(yīng)加為
好友的響應(yīng)。2、如果對(duì)方發(fā)送加為好友請(qǐng)求給你,那么 你可以加應(yīng)加為好友的響應(yīng),一是加為好友,一是通過(guò) 驗(yàn)證,一是拒決加為好友。我們要向服務(wù)器發(fā)送命令:
VER=1.1&CMD=Ack_AddToList&SEQ=&UIN=&U N=&CD=&RS= CD 為響
應(yīng)狀態(tài),CD 為 0 表示“通過(guò)驗(yàn)證” 。CD 為 1 表示“拒決 加為對(duì)方為好友” CD 為 2 表示 。 “為請(qǐng)求對(duì)方加為好友” 。 RS
為你要請(qǐng)求的理由. 服務(wù)器得到協(xié)議后如果成功則返回: VER=1.1&CMD=Ack_AddToList&SEQ=1130&UI
N=415103947&RES=0& 9、刪除好友。 刪除好友其實(shí)很容易,向服務(wù)器發(fā)送 DelFromList 命令 則可以刪除用戶:
VER=1.1&CMD=DelFromList&SEQ=&UIN=&UN = UN 為要?jiǎng)h除用戶的 QQ 號(hào)。
服務(wù)器得到協(xié)議后如果成功則返回: VER=1.1&CMD=DelFromList&SEQ=24514&UIN
=415103947&RES=0& 10、改變用戶當(dāng)前狀態(tài)。 可以把 QQ 設(shè)置為在線,隱身等狀態(tài),我們可以發(fā)送 Ch ange_Stat
給服務(wù)器以改變當(dāng)前狀態(tài),具體命令如下: VER=1.1&CMD=Change_Stat&SEQ=&UIN=&ST = ST
為要改變的狀態(tài),10 為上線,20 為離線,30 為忙 碌。 服務(wù)器得到協(xié)議后如果成功則返回:
VER=1.1&CMD=Change_Stat&SEQ=17512&UIN =415103947&RES=0&
11、退出登錄 要退出登錄,要向服務(wù)器發(fā)送命令 Logout,具體命令如 下: VER=1.1&CMD=Logout&SEQ=&UIN=
服務(wù)器得到協(xié)議后如果成功則返回: VER=1.1&CMD=LOGOUT&SEQ=15803&UIN=41
5103947&RES=0 12、獲得好友 QQ 的消息 如果要接收好友的消息, 要向服務(wù)器發(fā)送命令 GetMsgE x,具體命令如下:
VER=1.1&CMD=GetMsgEx&SEQ=&UIN= 服務(wù)器得到協(xié)議后如果成功則返回:
VER=1.1&CMD=GETMSGEX&SEQ=56661&UIN=
29501213&RES=0&MN=3&MT=99,9,9,&UN=24
259132,24259132,24259132,&MG=30 ,asdfasd fasdfasdf ,asdfasdfasdf ,& MT
表示消息類型,99 表示系統(tǒng)消息,9 表示用戶消息。 UN 表示消息發(fā)送來(lái)源用戶,MG 表示發(fā)送的消息,MG 消息可以表示某些特定的系統(tǒng)含意, 譬如: MT 為
99, 當(dāng) MG 為 30, 為 24259132 則表示用戶 4259132 現(xiàn) UN 在處于忙碌狀態(tài),可根據(jù)此消息進(jìn)行好友列表的刷新, 提高效率。
13、向好友 QQ 發(fā)送消息 要發(fā)送消息給好友,要向服務(wù)器發(fā)送命令 CLTMSG 命 令,具體命令如下:
VER=1.1&CMD=CLTMSG&SEQ=&UIN=&UN=&M G= UN 為消息發(fā)送給的用戶 QQ 號(hào)碼, MG
為發(fā)送給該用戶 的消息。 服務(wù)器得到協(xié)議后如果成功則返回: VER=1.1&CMD=CLTMSG&SEQ=15
803&UIN=415103947&RES=0 好了,以上就是 QQ 基于 HTTP 的一個(gè)不完全的協(xié)議分
析,利用以上協(xié)議您就可以實(shí)現(xiàn)很多東西,如:QQ 機(jī)器 人,QQ 廣告系統(tǒng),即時(shí)通訊的整合工具等等 QQ 協(xié)議網(wǎng)絡(luò)協(xié)議--請(qǐng)求部份 //登錄
VER=1.0&CMD=Login&SEQ=&UIN=&PS=&M5=
1&LC=9326B87B234E7235 //獲取消息 VER=1.0&CMD=GetMsgEx&SEQ=&UIN=
//發(fā)送消息 VER=1.0&CMD=CLTMSG&SEQ=&UIN=&UN=&M G= //朋友列表
VER=1.0&CMD=List&SEQ=&UIN=&TN=160&UN =0 //獲取好友狀態(tài)
VER=1.0&CMD=Query_Stat&SEQ=&UIN=&TN= 50&UN=0 //獲取好友信息
VER=1.0&CMD=GetInfo&SEQ=&UIN=&LV=2&U N= //增加好友
VER=1.0&CMD=AddToList&SEQ=&UIN=&UN= //回應(yīng)對(duì)方請(qǐng)求加你為好友的響應(yīng)
VER=1.0&CMD=Ack_AddToList&SEQ=&UIN=&U N=&CD=&RS= //刪除好友
VER=1.0&CMD=DelFromList&SEQ=&UIN=&UN = //搜索好友
VER=1.0&CMD=Finger&SEQ=&UIN=&AG=&SX =&PV= //改變自己狀態(tài),ST
的代碼應(yīng)該和獲取好友狀態(tài)代碼一 致 VER=1.0&CMD=Change_Stat&SEQ=&UIN=&ST = //退出登錄
VER=1.0&CMD=Logout&SEQ=&UIN=
|