zoukankan      html  css  js  c++  java
  • C#实现QQ接口软件QQ的HTTP接口协议探究

     

    1、研究说明
    Tencent在tqq.tencent.com的8000有一个使用HTTP的QQ接口,通过这个接口,可以进行一些基本的操作,如:登陆、登出、改变登陆状态(上线、忙碌、离线、隐身)、添加删除好友、查看好友信息、发送验证信息(接受被加为好友、申请加对方为好友、拒绝被加为好友)、收发用户消息、系统信息。
    目前我研究的是1.1版本的HTTP QQ协议,研究是微程在的成果上进行的,不敢说有什么超越,只不过更为详细和准确。
    2、接口说明:
    接口位置:tqq.tencent.com:8000
    通信协议:HTTP
    数据传输方法:POST
    HTTP请求格式:
    POST HTTP/1.1
    Host: tqq.tencent.com:8000
    Content-Type: text/plain; charset=UTF-8
    Content-length: 长度
    Connection: close
    数据
    其中长度为 数据 的长度,数据的格式:
    VER=1.1&CMD=命令&SEQ=标记&UIN=QQ号&....
    以上4个参数是每个请求都必有的。其中,VER表示协议的版本,目前为1.1,据说1.2已经出来了,这个乱写的话,服务器返回NULL;CMD为操作的指令,有Login、List、Query_Stat、GetInfo、AddToList、Ack_AddToList、DelFromList、Change_Stat、GetMsgEx、CLTMSG、Logout;SEQ为当前请求的标记,防止重复发送,可以用当前时间,也可以用随机数;UIN是当前执行操作的QQ号。不过不同的CMD还需要不同的参数,下面我就公布我的研究成果。
    3、研究成果:
    (1).登陆
    说明:在你做任何其他操作以前,你必须登陆。只有在登陆以后,你的其他指令才有可能被正确执行(返回RES=0),不然服务器会返回RES=20,不过有个例外,就是logout。当你成功登陆以后,服务器就会根据你的IP*和参数中的UIN来验证身份。一台电脑可以同时登陆多个QQ,互不影响,就是因为有参数UIN。
    *至于我能够确定服务器是通过IP来验证的,是因为服务器不可能通过我的请求获得其他信息了^_^
    提交数据:VER=1.1&CMD=Login&SEQ=标记&UIN=QQ号&PS=QQ密码&M5=1&LC=9326B87B234E7235
    说明:QQ密码是通过md5加密的字符串,在PHP中可以直接用md5()进行加密;
    M5这个参数的作用还不清楚,但最好为1。
    LC这个参数有点神秘,不能有丝毫改动,不然服务器就没有响应(没有响应就是返回NULL)。
    返回:VER=1.1&CMD=LOGIN&SEQ=标记&UIN=QQ号&RES=0&RS=0&HI=60&LI=300(成功)
    VER=1.1&CMD=LOGIN&SEQ=标记&UIN=QQ号&RES=0&RS=1&RA=密码错误(密码错误)
    VER=1.1&CMD=LOGIN&SEQ=标记&UIN=QQ号&RES=5(QQ号非法,如100)
    NULL(UIN为字符、PS为空、LC错误)
    (2).得到好友列表
    提交数据:VER=1.1&CMD=List&SEQ=标记&UIN=QQ号&TN=160&UN=0
    说明:TN、UN还不清楚具体表示什么,但是TN的值会影响返回的结果,有没有UN对结果没有影响
    返回:VER=1.1&CMD=LIST&SEQ=标记&UIN=QQ号&RES=0&FN=9(当TN=0或没有TN参数时,FN表示好友数)
    VER=1.1&CMD=LIST&SEQ=标记&UIN=QQ号&RES=0&FN=1&SN=9&UN=3814526,...,(当TN存在且非0时,FN=1,SN表示好友数,UN为好友列表,用","分割)
    VER=1.1&CMD=LIST&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
    NULL(UIN、TN、UN为字符)
    (3).得到在线好友列表
    提交数据:VER=1.1&CMD=Query_Stat&SEQ=标记&UIN=QQ号&TN=50&UN=0
    说明:TN、UN还不清楚具体表示什么,但是TN的值会影响返回的结果,有没有UN对结果没有影响
    返回:VER=1.1&CMD=QUERY_STAT&SEQ=标记&UIN=QQ号&RES=0&FC=0,&FN=1&SN=1&ST=10,&UN=106814,&NK=Hackfan 好,(当TN存在且非0时,FN=1,SN表示在线好友数,FC、ST、UN、NK的值用‘,‘分割,分别表示头像、状态、号码、昵称)
    VER=1.1&CMD=QUERY_STAT&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
    NULL(UIN、TN、UN为字符)
    说明:FC为QQ头像的的ID,如的头像ID为270,那么其头使用的图片为91.bmp,其算法为ID/3+1;
    ST为QQ用户的状态,10为上线,20为离线(或隐身),30为忙碌;
    特别说明:当参数TN=0或不存在时,服务器返回:
    VER=1.1&CMD=Query_Stat&SEQ=标记&UIN=QQ号
    HTTP/1.1 200 OK
    Server: tencent imserver/1.0.0
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 56
    VER=1.1&CMD=QUERY_STAT&SEQ=标记&UIN=QQ号&RES=0&FN=1
    HTTP/1.1 200 OK
    Server: tencent imserver/1.0.0
    Content-Type: text/plain; charset=UTF-8
    Content-Length: 77
    VER=1.1&CMD=QUERY_STAT&SEQ=标记&UIN=QQ号&RES=0&FC=&FN=1&SN=0&ST=&UN=&NK=
    返回了2次,第一次的结果中,FN为在线好友数,第二次返回的数据基本没用。
    (4).查看好友信息
    提交数据:VER=1.1&CMD=GetInfo&SEQ=标记&UIN=QQ号&LV=查询类型&UN=被查询QQ号码
    说明:LV=0,1为精简查询,LV=2为普通查询,LV>=3为详细查询
    返回:VER=1.1&CMD=GETINFO&SEQ=标记&UIN=QQ号&RES=0&LV=0&UN=106814&NK=Hackfan 好(精简查询)
    VER=1.1&CMD=GETINFO&SEQ=标记&UIN=QQ号&RES=0&AD=地址&AG=19&EM=hackfan@qq.com&FC=0&HP=http://blog.hackfan.net&JB=学生
    &LV=2&PC=邮编&PH=电话&PR=The guy is updating to .NET Frameword......&PV=江苏&RN=胡吉阳&SC=毕业院校&SX=0&UN=106814&NK=Hackfan 
    好(普通查询)
    VER=1.1&CMD=GETINFO&SEQ=标记&UIN=QQ号&RES=0&AD=地址&AG=19&BT=2&CO=6&CT=苏州&CV=%01&CY=中华人民共和国
    &EM=hackfan@qq.com&FC=0&HP=http://blog.hackfan.net&ID=-&JB=学生&LV=3&MO=136********&MT=0&MV=&PC=邮编&PH=电话&PR=The guy is 
    updating to .NET Frameword......&PV=江苏&RN=胡吉阳&SC=毕业院校&SH=3&SX=0&UN=106814&NK=Hackfan 好(详细查询)
    VER=1.1&CMD=GETINFO&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
    NULL(UIN、LV、UN为字符)
    说明:AD为联系地址
    AG为年龄
    BT为血型
    CO为星座
    CT为城市
    CV为未知*
    CY为国家
    EM为Email
    FC为头像
    HP为网站
    ID为未知
    JB为职业
    LV为查询代码(就是发送的LV)
    MO为移动电话
    MT为未知
    MV为未知
    PC为邮编
    PH为联系电话
    PR为简介
    PV为省
    RN为真实姓名
    SC为毕业院校
    SH为生肖
    SX为性别
    UN为QQ号
    NK为昵称
    血型:0 => ‘‘,
    1 => ‘A型‘,
    2 => ‘B型‘,
    3 => ‘O型‘,
    4 => ‘AB型‘,
    5 => ‘其他‘
    星座:0 => ‘‘,
    1 => ‘水瓶座‘,
    2 => ‘双鱼座‘,
    3 => ‘牡羊座‘,
    4 => ‘金牛座‘,
    5 => ‘双子座‘,
    6 => ‘巨蟹座‘,
    7 => ‘狮子座‘,
    8 => ‘处女座‘,
    9 => ‘天秤座‘,
    10 => ‘天蝎座‘,
    11 => ‘射手座‘,
    12 => ‘摩羯座‘
    生肖:0 => ‘‘,
    1 => ‘鼠‘,
    2 => ‘牛‘,
    3 => ‘虎‘,
    4 => ‘兔‘,
    5 => ‘龙‘,
    6 => ‘蛇‘,
    7 => ‘马‘,
    8 => ‘羊‘,
    9 => ‘猴‘,
    10 => ‘鸡‘,
    11 => ‘狗‘,
    12 => ‘猪‘
    性别:0 => ‘男‘,
    1 => ‘女‘
    (5).增加好友
    提交数据:VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&UN=对方QQ号
    返回:VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&RES=0&CD=0&UN=对方QQ号(允许被加为好友,此时他已经是你的好友)
    VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&RES=0&CD=1&UN=对方QQ号(需要验证)
    VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&RES=0&CD=2&UN=对方QQ号(决绝被加为好友)
    VER=1.1&CMD=AddToList&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
    NULL(UIN、UN为字符)
    (5).发送验证
    说明:1、如果你加对方为好友,你需要发送验证
    2、对方加你为好友,发送了验证,你要通过或者拒绝
    这2种情况需要发送验证消息
    提交数据:VER=1.1&CMD=Ack_AddToList&SEQ=标记&UIN=QQ号&UN=对方QQ号&CD=验证类型&RS=理由
    说明:CD为0表示“通过验证”,CD为1表示“拒决加为对方为好友”,CD为2表示“为请求对方加为好友”。
    返回:VER=1.1&CMD=Ack_AddToList&SEQ=标记&UIN=QQ号&RES=0(成功)
    VER=1.1&CMD=Ack_AddToList&SEQ=标记&UIN=QQ号&RES=3(*)
    VER=1.1&CMD=Ack_AddToList&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
    NULL(UIN、UN、CD为字符,RS为非UTF-8字符)
    *如果服务器返回RES=3,那么这次对话的响应时间在20s。当发送验证请求的时候,必须连发2次(请求内容不必一样),其中一条RES=3,对方收不到,一条RES=0,对方能够收到。当CD>=3时,RES=3,响应时间20s。
    (6).删除好友
    提交数据:VER=1.1&CMD=DelFromList&SEQ=标记&UIN=QQ号&UN=删除的QQ号
    返回:VER=1.1&CMD=DelFromList&SEQ=标记&UIN=QQ号&RES=0&(成功)
    VER=1.1&CMD=DelFromList&SEQ=标记&UIN=QQ号&RES=3(响应时间30s,重复发送的后果)
    VER=1.1&CMD=DelFromList&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
    NULL(UIN、UN为字符)
    (7).改变状态
    提交数据:VER=1.1&CMD=Change_Stat&SEQ=标记&UIN=QQ号&ST=状态代码
    说明:状态代码:10为上线,20为离线,30为忙碌,40为隐身,其他视为非法
    返回:VER=1.1&CMD=Change_Stat&SEQ=标记&UIN=QQ号&RES=0&(成功)
    VER=1.1&CMD=Change_Stat&SEQ=标记&UIN=QQ号&RES=3(失败,原因不明,响应时间20s,可能是过于频繁的改变状态引起的)
    VER=1.1&CMD=Change_Stat&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
    NULL(UIN为字符,ST非法)
    特别说明:如果你改变好友,将会给所有好友发送一条系统信息,内容就是状态代码;如果隐身,发送的状态代码为20,表示离线。
    同理,当你的好友改变状态,你也会收到一条系统信息。
    (9).获得消息
    提交数据:VER=1.1&CMD=GetMsgEx&SEQ=标记&UIN=QQ号
    返回:VER=1.1&CMD=GETMSGEX&SEQ=标记&UIN=QQ号&RES=0&MN=4&MT=99,99,99,9,&UN=36791785,99833581,99833581,106814,&MG=20,30,10,hi ,(MN表示信息数量,MT、UN、MG的值用","分割,分别表示消息类型、发送人号码、消息内容)
    VER=1.1&CMD=GETMSGEX&SEQ=标记&UIN=QQ号&RES=0&MN=0&MT=&UN=&MG=(表示没有信息)
    VER=1.1&CMD=GETMSGEX&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
    NULL(UIN为字符)
    说明:关于MT:
    9为用户消息,99为系统消息,2为请求信息,3为通过验证,4为拒绝被加好友
    关于MG:
    当MT=9时,MG为用户发送的消息内容
    当MT=99时,
    MG=10(QQ_STATUS_ONLINE)表示对方上线
    MG=20(QQ_STATUS_OFFLINE)表示对方下线
    MG=30(QQ_STATUS_BUSY)表示对方进入忙碌状态
    当MT=2时,MG为对方请求你验证的信息
    当MT=3时,表示对方通过你的验证
    当MT=4时,MG为对方拒绝你理由
    (10).发送消息
    提交数据:VER=1.1&CMD=CLTMSG&SEQ=标记&UIN=QQ号&UN=对方QQ号&MG=发送内容
    返回:VER=1.1&CMD=CLTMSG&SEQ=标记&UIN=QQ号&RES=0&(成功发送,对方不一定能收到哦)
    VER=1.1&CMD=CLTMSG&SEQ=标记&UIN=QQ号&RES=3(发送过快)
    VER=1.1&CMD=CLTMSG&SEQ=标记&UIN=QQ号&RES=20(没有正确登陆)
    NULL(UIN、UN为字符,MG含非UTF-8字符)
    说明:1、当你发消息时,以下情形对方可能看不到(其实是收到了,QQ不提示)你发送的消息:
    你俩互为陌生人,且对方没有和你说过话
    你在他的陌生人列表里,并且他没有和你说过话(没有验证)
    2、当你过快发送消息时,系统会给你一个惩罚,RES=3,相应时间20s
    3、当我发送含有小写字母h的信息时,服务器有可能返回NULL
    (11).登出
    提交数据:VER=1.1&CMD=Logout&SEQ=标记&UIN=QQ号
    返回:VER=1.1&CMD=LOGOUT&SEQ=标记&UIN=QQ号&RES=0(成功,好像永远成功的,不管你是否登陆)
    NULL(UIN为字符

  • 相关阅读:
    从 0 → 1,学习Linux该这么开始!
    Web和移动开发的未来
    css-div中文字过多(内容超出div宽度)后自动换行
    js+css--单选按钮,自定义选中的颜色???(性别按钮,男女)
    css-按钮中有图片和文字,怎么才能让文字和图片都中??
    js-点出弹框后(除了点击窗口上的叉子),点其他地方能够关闭窗口???
    css-外面元素的高度,由里面的元素进行撑开(由内部的高度决定)
    js-将传来的数据排序,让(全部)这个小按钮小圈圈,始终排列在最前面
    echart--如何在折线图上添加矩形背景(可以借用bar柱状图的实现效果)
    echart-如何将x轴和y轴的原点进行重合???
  • 原文地址:https://www.cnblogs.com/hsapphire/p/1938932.html
Copyright © 2011-2022 走看看