当前位置:首页 >> 信息与通信 >>

qqhttp1.1


大家说到 QQ 协议都觉得很神秘, 是因为 QQ 不像 MSN 或者 ICQ 协议都已经官方公布 了,而 QQ 的没有公布。研究 它的人也不是特别的多,虽然已经有了基于 QQ 协议所写成的第三方软件 foicq, qq plugins for gaim, LumaQQ,但是由于他们是基于二进制 Stream 的协议过于复杂,大家阅读代码也有一定的 难度,再加上网络 上解析 QQ

协议的文章也不是十分多,所以基于 QQ 网络协议的应用程序也是寥寥无几的。 现在我就把基于 HT TP 的 QQ 协议进行一个粗浅的剖析, 希望对大家有所帮助。 源码部分就用我喜欢的 DELPHI 和现在比较流行的 C#语言对 QQ 协议的实现进行具体分析。 1、找寻支持 QQ HTTP 协议的服务器。 大家也许会被一些假像所迷惑, 也许会认为 QQ 的 HTTP 服务器是基于 80 口进行通信的 (如: 218.17.209.23: 80) ,其实不然,正真基于 HTTP 的服务器应该是:http://tqq.tencent.com:8000,它是一个通 过 8000 口 进行通讯的服务器。 由于 QQ 的 HTTP 服务器并不支持 HTTP 协议中 GET 方法,它支持 POST 方法。所以我们 要给 QQ 的 HTTP 协议传参数 ,那么就必需要用 POST 方式才行。

2、C#和 DELPHI 是实现 HTTP 的 POST 方法的通信。 C#: C#里 System.Web 空间下提供了一个叫做 WebClient 的对象, 使用此对象就可以使 C#直接对 服务器发送 WEB 客户端的请求。那么我们要对服务器提交 POST 方法那么就必须使用其 UploadData()方法才 行。首先把要请 求的信息先转换为字节(因为 POST 提交的是字符的流数据) ,然后再做为 UploadData()的 参数。使用 Uplo adData()进行数据提交,最后返回,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 方法提交了。 DELPHI: Delphi 里我们利用一个比较流行的第三方 VCL,INDY HTTP(这个组件 D6,D7 里面自带) 进行 HTTP 通信。 使用其的 POST 方法便可以进行 HTTP 的 POST 通信,因为组件比较好用,我就不在其描述 具体的过程了。大家 可以参考以下代码: function PostWebPage(url,para:String;TimeOut:Integer):String;

var tmpWeb:TIdHTTP; retrun:String; Proxy:String; i:Integer; paralist:TStrings; begin retrun:=''; try paralist:=TStringList.Create; paralist.Text:=_Replacing(para,'&',#13#10); tmpWeb:=TIdHTTP.Create(nil); tmpWeb.ReadTimeout:=TimeOut; for i:=1 to 3 do begin try retrun:=tmpWeb.Post(url,paralist); except end; if retrun<>'' then break; end; finally tmpWeb.Disconnect; FreeAndNil(tmpWeb); FreeAndNil(paralist); end; Result:=retrun; end; 值在传入、 返回时, 其是基于 UTF-8 进行的, C#显示中文是很常, DELPHI 就要进行 UTF-8 而 的转换了。大家 可通过 Utf8ToAnsi()、AnsiToUtf8()进行转换。 (编码转换是 C#的优越性之一)

3、实现 QQ 的用户登录。 在 QQ 通信中用户必需要登录后才可以进行互相发送信息等。QQ 的登录是很关键的,大家 所看到的用户在线 ,并不是用户的 QQ 一直连接着服务器,而是定时发送消信给服务器,证明自己还连着线, 如果超出时间 QQ 就认为用户已经掉线了。 在登录协议中,QQ 的密码是用标准的 MD5 来进行加密,DELPHI 的用户只需要下个 MD5 加密模块就可以了,而

C#自已带有,但是直接用不了,必需进行处理后,才能使其变成标准的 MD5,处理代码如 下: public static string MD5(string toCryString) { MD5CryptoServiceProvider hashmd5; hashmd5 = new MD5CryptoServiceProvider(); return BitConverter.ToString(hashmd5.ComputeHash(Encoding.Default.GetBytes(toCryString))).Replac e(" -","").ToLower();//asp 是小写,把所有字符变小写 } 了解 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.ToStr ing().Substring(7,7) DELPHI:CopyStr(inttostr(GetTickCount()),1,5)) ,UIN 是说明你当前要登 录 的用户 QQ 号,PS,是 MD5 加密过后的密码的值。 返回协议: 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 说明原因。? RES=3 表示重复登录。

4、获得 QQ 名单。 如果您加了您的好友,那么您的好友就会放入你的 QQ 的好友名单里面,那么我们要得到 QQ 名单就必需给 QQ 服务器发送得到好友名单的协议(我就不从复已知的参数了) : VER=1.1&CMD=List&SEQ=&UIN=&TN=160&UN=0 服务器得到协议后如果成功则返回: VER=1.1&CMD=LIST&SEQ=43661&UIN=29501213&RES=0&FN=1&SN=24&UN=561256,1

943497,.... UN 后面则是您好友的 QQ 号码,每个号码都由,进行分开。那么我们只需要得到 UN 后面的 代码,把它列表化 就 OK 了。C#可以用 string.Split(',')把值放入列表进行处理,而 DELPHI 可以使用 Split()把数 值放入 TStr ings 里进行处理。

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,270,&FN=1 &SN=3&ST=10,10,10,&UN=1 2327207,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() 进行转换,不然 会出现乱码。

6、得到 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=网络为媒%252 c 关系为本%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 语言,那么要用 Ut f8ToAnsi()进行转换,不然会出现乱码。

7、增加 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 的身份验证状态, 为 0 表示“允许任何人把我列为好友”, 为 1 表示“需 CD CD 要身份证认才能把 我列为好友”,CD 为 3 表示“不允许任何人把我列为好友”。如果 CD 为 0 那么信息回馈后, 用户就直接加为 好友了,如果 CD 为 1,那么还要发送一次回应加为好友的响应。

8、回应加为好友的响应。

回应加为好友响应是双方的: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&

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 设置为在线, 隐身等状态, 我们可以发送 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&

11、退出登录 要退出登录,要向服务器发送命令 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,24259 132,&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 在发送之间要用 An siToUtf8()进行转换,不然发送过后,消息会变成“?”。 服务器得到协议后如果成功则返回: VER=1.1&CMD=CLTMSG&SEQ=15803&UIN=415103947&RES=0 好了, 以上就是 QQ 基于 HTTP 的一个不完全的协议分析, 在无源码前提下, 在下能力有限, 只能够分析这么 多了。利用以上协议您就可以实现很多东西,如:QQ 机器人,QQ 广告系统,即时通讯的 整合工具等等。


相关文章:
qqhttp1.1
qqhttp1.1_信息与通信_工程科技_专业资料。大家说到 QQ 协议都觉得很神秘, 是因为 QQ 不像 MSN 或者 ICQ 协议都已经官方公布 了,而 QQ 的没有公布。研究 ...
HTTP1.0和HTTP1.1区别
HTTP 1.1 与 HTTP 1.0 的比较 一.HTTP 1.0 一个 WEB 站点每天可能要接收到上百万的用户请求,为了提高系统的效 率,HTTP 1.0 规定浏览器与服务器只保持...
HTTP1.0和HTTP1.1区别
HTTP 1.1 与 HTTP 1.0 的比较 一.HTTP 1.0 一个 WEB 站点每天可能要接收到上百万的用户请求,为了提高系统的效 率,HTTP 1.0 规定浏览器与服务器只保持...
HTTP1.0和HTTP1.1区别
HTTP 1.1 与 HTTP 1.0 的比较 一.HTTP 1.0 一个 WEB 站点每天可能要接收到上百万的用户请求,为了提高系统的效 率,HTTP 1.0 规定浏览器与服务器只保持...
腾讯QQ的HTTP接口[C#.NET版]
服务器得到协议后如果成功则返回: VER=1.1&CMD=CLTMSG&SEQ=15803&UIN=415103947&RES=0 好了,以上就是 QQ 基于 HTTP 的一个不完全的协议分析, 利用以上协议...
QQ的接口api
(如:218.17. 209.23:80) ,其实不然,正真基于 HTTP 的服务器 是:http:/...=1.1&CMD=GetInfo&SEQ=&UIN=&LV=2& UN= UN 为要查看用户信息的 QQ 号...
QQ的HTTP接口探究
目前我研究的是 1.1 版本的 HTTP QQ 协议,研究是微程在的成果上进行的,不敢说有什么超越,只不 过更为详细和准确。 2、接口说明: 接口位置:tqq.tencent....
C#模拟手机QQ 发送QQ消息(QQhttp1.4协议)
C#模拟手机 QQ 发送 QQ 消息(QQhttp1.4 协议) 详细代码如下(代码参考网上他人代码修改的,不完全相同) : private void button1_Click(object sender, EventArgs ...
QQ http协议
QQ http协议_计算机软件及应用_IT/计算机_专业资料。QQ http 协议协议说明: ...VER=1.0&CMD=Change_Stat&SEQ=&UIN=&ST= //退出登录 VER=1.0&CMD=...
QQ自动登录
org.apache.http.util.EntityUtils; import java.io.*; public class QQcar ...(Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.20) Gecko/20081217 ...
更多相关标签:
http dldir1.qq.com | http qq1.hu818.us | http wx.qq.com | http weixin.qq.com | http qt.qq.com | http mail.qq.com | http aq.qq.com 007 | http aq.qq.com |