QQAPI接⼝
1、寻⽀持 QQ HTTP 协议服务器。⼤家也许会被⼀些假像所迷惑,也许会认为 QQ 的 HTTP 服务器是基于 80  ⼝进⾏通信的(如:218.17.209.23: 80),其实不然,正真基于 HTTP 的服务器应该是:http:  //t:8000,它是⼀个通过 8000 ⼝进⾏通讯的服务器。由于 QQ 的 HTTP 服务器并不⽀持 HTTP 协议中  GET ⽅法,它⽀持 POST ⽅法。所以我们要给 QQ 的 HTTP 协议传参数,那么就必需要⽤ POST ⽅式才⾏。
2、C#和 DELPHI  是实现 HTTP 的 POST ⽅法的通信。 C#: C#⾥ System.Web 空间下提供了⼀个叫做 WebClien t 的对象,使⽤此对象就可以使  C#直接对服务器发送 WE B 客户端的请求。那么我们要对服务器提交 POST ⽅法那么就必须使⽤其 UploadData()⽅法才⾏。⾸先把要请求的信息先转换为字节(因为 POST 提交的是字符的流数据),然后再做为 UploadData()的参数。使⽤ UploadD  ata()进⾏数据提交,最后返回,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#进⾏了⼀次 HTTP 的 POST ⽅法提交了。
值在传⼊、返回时,其是基于 UTF-8 进⾏的,C#显⽰中⽂是很常.
3、实现 QQ 的⽤户登录。在 QQ  通信中⽤户必需要登录后才可以进⾏互相发送信息等。QQ 的登录是很关键的,⼤家所看到的⽤户在线,并不是⽤户的 QQ ⼀直连接着服务器,⽽是定时发送消信给服务器,证明⾃⼰还连着线,如果超出时间 QQ 就认为⽤户已经掉线了。在登录协议中,的密码是⽤标准的 MD5 来进⾏加密, QQ ⽽  C#⾃已带有,但是直接⽤不了,必需进⾏处理后,才能使其变成标准的 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  是⼩写,把所有字符变⼩写 } 了解 QQ 是如何对⽤户密码加密后,那么我们就开始真正,解析 QQ 的 HTTP 登录协议了,我们把协议当传 PO ST  的参数传给服务器,⽽服务器则回馈相应的信息给客户端:传⼊协议:
VER=1.1&CMD=Login&SEQ=&UIN=&PS=&M5  =1&LC=9326B87B234E7235 VER 是⽤来说明 QQ 协议的版本,CMD 是说明协议的命令,Login 就是指 QQ  的登录了,SEQ 是他的为了防⽌重复发送⽽设定的⼀个标记,⼀般我们取当前时间数值的⼀段放⼊即可。(C#:DateTime.Now.Ticks.To  String().Substring(7,7) DELPHI:CopyStr(inttost r(GetTickCount()),1,5)),UIN  是说明你当前要登录
的⽤户 QQ 号,PS,是 MD5 加密过后的密码的值。返回协议:  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 表⽰登录失败,那么就会出现提⽰信息 RA 说明原因。
4、获得 QQ 名单。如果您加了您的好友,那么您的好友就会放⼊你的 QQ 的好友名单⾥⾯,那么我们要得到 QQ 名单就必需给 Q Q  服务器发送得到好友名单的协议(我就不从复已知的参数了):  VER=1.1&CMD=List&SEQ=&UIN=&TN=160&U N=0 服务器得到协议后如果成功则返回:  VER=1.1&CMD=LIST&SEQ=43661&UIN=2950  1213&RES=0&FN=1&SN=24&UN=561256,1943 497,....
UN 后⾯则是您好友的 QQ  号码,每个号码都由,进⾏分开。那么我们只需要得到 UN 后⾯的代码,把它列表化就 OK 了。C#可以⽤string.Split(',')把值放⼊列表进⾏处理,⽽ DELPHI 可以使⽤ Split()把数值放⼊ TStri ngs ⾥进⾏处理。
5、获得 QQ 好友在线名单获得 QQ  好友在线名单,跟获得好友名单差不多,唯⼀不同的是⽤的命令不同⽤的是 Query_Stat,协议如下:VER=1.1&CMD=Query_Stat&SEQ=&UIN=&TN =50&UN=0  服
务器得到协议后如果成功则返回: 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 ⽤户的状态,10 为上线,20 为离线,30 为忙碌。UN 为在线⽤户的 QQ
号,NK 为在线⽤户的 QQ 昵称。ST, UN,NK,每个逗号隔开的数据相互对应。
6、得到 QQ ⽤户的信息。如果要看到 QQ  ⽤户的真实名称,MAIL,年龄,个⼈说明等信息,那么我们必需要向服务器发送得到好友信息的信息:  VER=1.1&CMD=GetInfo&SEQ=&UIN=&LV=2& UN= UN 为要查看⽤户信息的 QQ 号。服务器得到协议后如果成功则返回:VER=1.1&CMD=GETINFO&SEQ=12707&UIN=4  15103947&RES=0&AD=云南昆明&AG=0&EM=Mi
croprogramer@hotmail&FC=270&HP=msg  er.org(建设中...)&JB=程序员&LV=2&PC=650000 & PH=0871-*******&PR=⽹络为
媒%252c 关系为本%252c 信息为财%252c 客户为主.%0d%0a&PV=  云南省&RN=刘 X&SC=社会⼤学&SX=0&UN=2425 9132&NK=微程AD ⽤户的联系地址,AG  为⽤户年龄,EM 为⽤户 MAI L,FC 为⽤户头像,HP 为⽤户⽹站,JB 为⽤户职业,P C 为⽤户邮编,PH 为⽤户,PR 为⽤户简介,P V  为⽤户所以的省,RN 为⽤户真实名称,SC 为⽤户毕业院校,SX 为⽤户性别,UN 为⽤户
QQ
号,NK 为⽤户 QQ 昵称。 7、增加 QQ 好友。想要新增好友,就要发送 AddToList 命令给服务器,具体命令如下:
VER=1.1&CMD=AddToList&SEQ=&UIN=&UN= UN 为我们要增加⽤户的 QQ 号。服务器得到协议后如果成功则返回:
VER=1.1&CMD=AddToList&SEQ=13666&UIN=4  15103947&RES=0&CD=0&UN=24259132 CD 为被加 QQ 的⾝份验证状态,CD 为 0 表⽰“允许任何⼈把我列为好友”,CD 为 1 表⽰“需要⾝份证认才能把我列为好友”,CD 为 3 表⽰“不允许任何⼈把我列为好友”。如果 CD 为0  那么信息回馈后,⽤户就直接加为好友了,如果 CD 为 1,那么还要发送⼀次回应加为好友的响应。
8、回应加为好友的响应。
好qq号回应加为好友响应是双⽅的:1、如果你发送了请求加对⽅为好友,如果对⽅需要验证,那么必需发送回应加为好友的响应。2、如果对⽅发送加为好友请求给你,那么你可以加应加为好友的响应,⼀是加为好友,⼀是通过验证,⼀是拒决加为好友。我们要向服务器发送命令:  VER=1.1&CMD=Ack_AddToList&SEQ=&UIN=&U N=&CD=&RS= CD 为响应状态,CD 为 0 表⽰“通过验证” 。CD 为 1 表⽰“拒决
加为对⽅为好友” CD 为 2 表⽰。 “为请求对⽅加为好友” 。 RS  为你要请求的理由. 服务器得到协议后如果成功则返回:
VER=1.1&CMD=Ack_AddToList&SEQ=1130&UI  N=415103947&RES=0&
9、删除好友。删除好友其实很容易,向服务器发送 DelFromList 命令则可以删除⽤户:  VER=1.1&CMD=DelFromList&SEQ=&UIN=&UN = UN 为要删除⽤户的 QQ 号。服务器得到协议后如果成功则返回: VER=1.1&CMD=DelFromList&SEQ=24514&UIN
=415103947&RES=0&
10、改变⽤户当前状态。可以把 QQ 设置为在线,隐⾝等状态,我们可以发送 Ch ange_Stat  给服务器以改变当前状态,具体命令如下:VER=1.1&CMD=Change_Stat&SEQ=&UIN=&ST =
ST  为要改变的状态,10 为上线,20 为离线,30 为忙碌。服务器得到协议后如果成功则返回:
VER=1.1&CMD=Change_Stat&SEQ=17512&UIN =415103947&RES=0&
11、退出登录要退出登录,要向服务器发送命令 Logout,具体命令如下: VER=1.1&CMD=Logout&SEQ=&UIN=  服务器得到协议后如果成功则返回: VER=1.1&CMD=LOGOUT&SEQ=15803&UIN=41  5103947&RES=0
12、获得好友 QQ 的消息如果要接收好友的消息,要向服务器发送命令 GetMsgE x,具体命令如下:
VER=1.1&CMD=GetMsgEx&SEQ=&UIN= 服务器得到协议后如果成功则返回:  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 表⽰系统消息,9 表⽰⽤户消息。 UN 表⽰消息发送来源⽤户,MG 表⽰发送的消息,MG 消息可以表⽰某些特定的系统含意,譬如: MT 为  99,当 MG 为 30,为 24259132 则表⽰⽤户 4259132 现 UN 在处于忙碌状态,可根据此消息进⾏好友列表的刷新,提⾼效率。
13、向好友 QQ 发送消息
要发送消息给好友,要向服务器发送命令 CLTMSG 命令,具体命令如下:  VER=1.1&CMD=CLTMSG&SEQ=&UIN=&UN=&M G= UN 为消息发送给的⽤户 QQ 号码, MG  为发送给该⽤户的消息。服务器得到协议后如果成功则返回: VER=1.1&CMD=CLTMSG&SEQ=15 803&UIN=415103947&RES=0 好了,以上就是 QQ 基于 HTTP 的⼀个不完全的协议分析,利⽤以上协议您就可以实现很多东西,如:QQ 机器⼈,QQ ⼴告系统,即时通讯的整合⼯具等等 QQ 协议⽹络协议--请求部份
//登录  VER=1.0&CMD=Login&SEQ=&UIN=&PS=&M5=  1&LC=9326B87B234E7235 //获取消息
VER=1.0&CMD=GetMsgEx&SEQ=&UIN=  //发送消息 VER=1.0&CMD=CLTMSG&SEQ=&UIN=&UN=&M G= //朋友列表
VER=1.0&CMD=List&SEQ=&UIN=&TN=160&UN =0 //获取好友状态  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= //回应对⽅请求加你为好友的响应  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= //改变⾃⼰状
态,ST  的代码应该和获取好友状态代码⼀致 VER=1.0&CMD=Change_Stat&SEQ=&UIN=&ST = //退出登录
VER=1.0&CMD=Logout&SEQ=&UIN=