一、找寻支持 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 方式才行。程序员
二、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#显示 中文是很常. 算法
三、实现 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 说明 缘由。
四、得到 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 里进行处理。服务器
五、得到 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,每一个逗号隔开的数据相互对应。网络
六、获得 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.com&FC=270&HP=msg er.org(建设中...)&JB=程序员&LV=2&PC=650000 & PH=0871-6466529&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 昵称。 七、增长 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, 那么还要发送一次回应加为好 友的响应。ide
八、回应加为好友的响应。
回应加为好友响应是双方的:一、若是你发送了请求加对 方为好友,若是对方须要验证,那么必需发送回应加为 好友的响应。二、若是对方发送加为好友请求给你,那么 你能够加应加为好友的响应,一是加为好友,一是经过 验证,一是拒决加为好友。咱们要向服务器发送命令: 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& 工具
九、删除好友。 删除好友其实很容易,向服务器发送 DelFromList 命令 则能够删除用户: VER=1.1&CMD=DelFromList&SEQ=&UIN=&UN = UN 为要删除用户的 QQ 号。 服务器获得协议后若是成功则返回: VER=1.1&CMD=DelFromList&SEQ=24514&UIN =415103947&RES=0&post
十、改变用户当前状态。 能够把 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& 网站
十一、退出登陆 要退出登陆,要向服务器发送命令 Logout,具体命令如 下: VER=1.1&CMD=Logout&SEQ=&UIN= 服务器获得协议后若是成功则返回: VER=1.1&CMD=LOGOUT&SEQ=15803&UIN=41 5103947&RES=0 加密
十二、得到好友 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 在处于忙碌状态,可根据此消息进行好友列表的刷新, 提升效率。 对象
1三、向好友 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=