html5-img
1 / 13

QQ 协议分析

QQ 协议分析. 很多人认为 QQ 的 HTTP 服务器是基于 80 口进行通信的(如: 218.17.209.23:80 ),其实不是这样的,真正基于 HTTP 的服务器应该是: http://tqq.tencent.com:8000 ,它是一个通过 8000 口进行通讯的服务器。 QQ 的 HTTP 服务器并不支持 HTTP 协议中 GET 方法,它支持 POST 方法。所以我们要给 QQ 的 HTTP 协议传参数,那么就必需要用 POST 方式才行。 下面我们来介绍实现 HTTP 的 POST 方法的通信。 <1> C# :

susane
Download Presentation

QQ 协议分析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. QQ协议分析 很多人认为QQ的HTTP服务器是基于80口进行通信的(如:218.17.209.23:80),其实不是这样的,真正基于HTTP的服务器应该是:http://tqq.tencent.com:8000,它是一个通过8000口进行通讯的服务器。QQ的HTTP服务器并不支持HTTP协议中GET方法,它支持POST方法。所以我们要给QQ的HTTP协议传参数,那么就必需要用POST方式才行。 下面我们来介绍实现HTTP的POST方法的通信。 <1> C#: C#里System.Web空间下提供了一个叫做WebClient的对象,使用此对象就可以使C#直接对服务器发送WEB客户端的请求。

  2. 那么我们要对服务器提交POST方法那么就必须使用其UploadData()方法才行。首先把要请求的信息先转换为字节(因为POST提交的是字符的流数据),然后再做为UploadData()的参数。使用UploadData()进行数据提交,最后返回,POST的回馈信息。如下:那么我们要对服务器提交POST方法那么就必须使用其UploadData()方法才行。首先把要请求的信息先转换为字节(因为POST提交的是字符的流数据),然后再做为UploadData()的参数。使用UploadData()进行数据提交,最后返回,POST的回馈信息。如下: WebClient _client = new WebClient(); string postValues = "VER=1.0&CMD=Query_Stat&SEQ=12321&UIN=29501213&TN=50&UN=0"; Byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(postValues); Byte[] pageData = _client.UploadData(Host,"POST",byteArray); 这样,我们就利用C#进行了一次HTTP的POST方法提交了。

  3. <2>DELPHI: Delphi里我们利用一个比较流行的第三方VCL,INDY HTTP(这个组件D6,D7里面自带)进行HTTP通信。使用其的POST方法便可以进行HTTP的POST通信,值在传入、返回时,其是基于UTF-8进行的,C#显示中文是很常,而DELPHI就要进行UTF-8的转换了。 实现QQ的用户登录 在QQ通信中用户必需要登录后才可以进行互相发送信息等。QQ的登录是很关键的,大家所看到的用户在线,并不是用户的QQ一直连接着服务器,而是定时发送消信给服务器,证明自己还连着线,如果超出时间QQ就认为用户已经掉线了。 在登录协议中,QQ的密码是用标准的MD5来进行加密,DELPHI的用户只需要下个MD5加密模块就可以了,而C#自已带有,但是直接用不了,必需进行处理后,才能使其变成标准的MD5,

  4. 了解QQ是如何对用户密码加密后,那么我们就开始真正,解析QQ的HTTP登录协议了,我们把协议当传POST的参数传给服务器,而服务器则回馈相应的信息给客户端:了解QQ是如何对用户密码加密后,那么我们就开始真正,解析QQ的HTTP登录协议了,我们把协议当传POST的参数传给服务器,而服务器则回馈相应的信息给客户端: 传入协议: VER=1.1&CMD=Login&SEQ=&UIN=&PS=&M5=1&LC=9326B87B234E7235 VER是用来说明QQ协议的版本,CMD是说明协议的命令,Login就是指QQ的登录了,SEQ是他的为了防止重复发送而设定的一个标记,一般我们取当前时间数值的一段放入即可。(C#:DateTime.Now.Ticks.ToString().Substring(7,7) DELPHI:CopyStr(inttostr(GetTickCount()),1,5)),UIN是说明你当前要登录的用户QQ号,PS,是MD5加密过后的密码的值。

  5. 返回协议: VER=1.1&CMD=Login&SEQ=11281&UIN=&RES=0&RS=0&HI=60&LI=300(成功) RES为0表示成功返回,RS为0表示登录成功。 VER=1.1&CMD=Login&SEQ=11422&UIN=315103947&RES=0&RS=1&RA=登录失败 RS为1表示登录失败,那么就会出现提示信息RA说明原因。 获得QQ名单: 如果您加了您的好友,那么您的好友就会放入你的QQ的好友名单里面,那么我们要得到QQ名单就必需给QQ服务器发送得到好友名单的协议. VER=1.1&CMD=List&SEQ=&UIN=&TN=160&UN=0 服务器得到协议后如果成功则返回:

  6. VER=1.1&CMD=LIST&SEQ=43661&UIN=29501213&RES=0&FN=1&SN=24&UN=561256,1943497,....VER=1.1&CMD=LIST&SEQ=43661&UIN=29501213&RES=0&FN=1&SN=24&UN=561256,1943497,.... UN后面则是您好友的QQ号码,每个号码都由,进行分开。那么我们只需要得到UN后面的代码,把它列表化就OK了。C#可以用string.Split(‘,’)把值放入列表进行处理,而DELPHI可以使用Split()把数值放入TStrings里进行处理。 获得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,270,&FN=1&SN=3&ST=10,10,10,&UN=12327207,24259132,29501213,&NK= □,微程,鶹鸑,& FC为QQ头像的的ID,如的头像ID为270,那么其头使用的图片为91.bmp,其算法为ID/3+1。ST为QQ用户的状态,10为上线,20为离线,30为忙碌。UN为在线用户的QQ号,NK为在线用户的QQ昵称。ST,UN,NK,每个逗号隔开的数据相互对应。在得到消息后如果用的是DELPHI语言,那么要用Utf8ToAnsi()进行转换,不然会出现乱码。

  7. 得到QQ用户的信息 如果要看到QQ用户的真实名称,MAIL,年龄,个人说明等信息,那么我们必需要向服务器发送得到好友信息的信息: VER=1.1&CMD=GetInfo&SEQ=&UIN=&LV=2&UN= UN为要查看用户信息的QQ号。 服务器得到协议后如果成功则返回: VER=1.1&CMD=GETINFO&SEQ=12707&UIN=415103947&RES=0&AD=云南昆明&AG=0&EM=Microprogramer@hotmail.com&FC=270&HP=msger.org(建设中...)&JB=程序员&LV=2&PC=650000&PH=0871-6466529&PR=网络为媒%252c关系为本%252c信息为财%252c客户为主.%0d%0a&PV=云南省&RN=刘X&SC=社会大学&SX=0&UN=24259132&NK=微程如 AD用户的联系地址,AG为用户年龄,EM为用户MAIL,FC为用户头像,HP为用户网站,JB为用户职业,PC为用户邮编,PH为用户联系电话,PR为用户简介,PV为用户所以的省,RN为用户真实名称,SC为用户毕业院校,SX为用户性别,UN为用户QQ号,NK为用户QQ昵称。在得到消息后如果用的是DELPHI语言,那么要用Utf8ToAnsi()进行转换,不然会出现乱码。

  8. 增加QQ好友 想要新增好友,就要发送AddToList命令给服务器,具体命令如下: VER=1.1&CMD=AddToList&SEQ=&UIN=&UN= UN为我们要增加用户的QQ号。 服务器得到协议后如果成功则返回: VER=1.1&CMD=AddToList&SEQ=13666&UIN=415103947&RES=0&CD=0&UN=24259132 CD为被加QQ的身份验证状态,CD为0表示“允许任何人把我列为好友”,CD为1表示“需要身份证认才能把我列为好友”,CD为3表示“不允许任何人把我列为好友”。如果CD为0那么信息回馈后,用户就直接加为好友了,如果CD为1,那么还要发送一次回应加为好友的响应。

  9. 回应加为好友的响应 回应加为好友响应是双方的:1、如果你发送了请求加对方为好友,如果对方需要验证,那么必需发送回应加为好友的响应。2、如果对方发送加为好友请求给你,那么你可以加应加为好友的响应,一是加为好友,一是通过验证,一是拒决加为好友。我们要向服务器发送命令: VER=1.1&CMD=Ack_AddToList&SEQ=&UIN=&UN=&CD=&RS= CD为响应状态,CD为0表示“通过验证”。CD为1表示“拒决加为对方为好友”。CD为2表示“为请求对方加为好友”。RS为你要请求的理由,如果您用的是DELPHI那么RS在发送之间要用AnsiToUtf8()进行转换,不然发送过后,请求理由会变成“?”。 服务器得到协议后如果成功则返回: VER=1.1&CMD=Ack_AddToList&SEQ=1130&UIN=415103947&RES=0&

  10. 删除好友 删除好友其实很容易,向服务器发送DelFromList命令则可以删除用户: VER=1.1&CMD=DelFromList&SEQ=&UIN=&UN= UN为要删除用户的QQ号。 服务器得到协议后如果成功则返回: VER=1.1&CMD=DelFromList&SEQ=24514&UIN=415103947&RES=0&

  11. 改变用户当前状态 可以把QQ设置为在线,隐身等状态,我们可以发送Change_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& 退出登录 要退出登录,要向服务器发送命令Logout,具体命令如下: VER=1.1&CMD=Logout&SEQ=&UIN= 服务器得到协议后如果成功则返回: VER=1.1&CMD=LOGOUT&SEQ=15803&UIN=415103947&RES=0

  12. 获得好友QQ的消息 如果要接收好友的消息,要向服务器发送命令GetMsgEx,具体命令如下: 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=24259132,24259132,24259132,&MG=30 ,asdfasdfasdfasdf ,asdfasdfasdf ,& MT表示消息类型,99表示系统消息,9表示用户消息。UN表示消息发送来源用户,MG表示发送的消息,MG消息可以表示某些特定的系统含意,譬如:当MT为99,MG为30,UN为24259132则表示用户4259132现在处于忙碌状态,可根据此消息进行好友列表的刷新,提高效率。在得到消息后如果用的是DELPHI语言,那么要用Utf8ToAnsi()进行转换,不然会出现乱码。

  13. 向好友QQ发送消息 要发送消息给好友,要向服务器发送命令CLTMSG命令,具体命令如下: VER=1.1&CMD=CLTMSG&SEQ=&UIN=&UN=&MG= UN为消息发送给的用户QQ号码,MG为发送给该用户的消息。如果您用的是DELPHI那么MG在发送之间要用AnsiToUtf8()进行转换,不然发送过后,消息会变成“?”。 服务器得到协议后如果成功则返回: VER=1.1&CMD=CLTMSG&SEQ=15803&UIN=415103947&RES=0 结束,谢谢大家!

More Related