Web QQ API 分析

来源:互联网 发布:八爪鱼采集app数据 编辑:程序博客网 时间:2024/05/07 03:59

Web QQ协议分析

本文信息 站在前人的肩膀上
本文信息 不定期更新

前言

对Web QQ协议的一些看法

  1. 整个鉴权模块Cookie、Session、Token全都用上了
  2. 加密函数压缩混淆后放在JS还是会被找出来,不过只要偶尔换换也很折腾人
  3. 整个登录流程分了5步,偶尔加一步、减一步或者改一步同样折腾人
  4. 返回数据只提供了返回码而没有描述,因为什么失败了自己猜去吧
  5. 大部分请求都同时检查了Cookie、Referer、User-Agent和Origin(只有Post请求有)
  6. 对一些不合理的情况进行了判断,比如登录后却没有发起接收消息的
  7. 请求 对访问频率进行了控制,太频繁的请求也会被拒绝

版本

2015年12月版本的Web QQ协议

Api 数据来源

基本上都是通过Chrome控制台对Smart QQ进行抓包得到的

公共约定:

  1. 保证请求头中包含正常的User-Agent、Referer、Cookie等信息,如果是Post请求需要额外加上Origin
  2. 在大部分情况下(除了获取二维码和确认二维码状态),返回内容均为JSON,其中retcode为请求结果(0为成功),response为返回数据
  3. 不过还有个特例是发送消息的接口,成功时返回的字段是errCode,失败时才是retcode
  4. 请求失败后,返回的错误码如果是1000000或1000001,几乎可以认为是缺少了第一条中的某个数据
  5. 如果请求参数中有t,当前版本不会检验它的值,所以我统一设为0.1,但是实际上它的值一般情况下均为当前时间的unix timestamp
  6. 如果返回的返回的错误码为1000003,很有可能是你的请求频率过于频繁

登录

获取cookie,用户登录逻辑的模拟。

目标参数

  • ptwebqq:保存在Cookie中的鉴权信息
  • vfwebqq:类似于Token的鉴权信息
  • psessionid:类似于SessionId的鉴权信息
  • clientid:设备id,为固定值53999199
  • uin: 登录用户id(其实就是当前登录的QQ号)

登陆流程

  1. 获取二维码
  2. 确认二维码已被扫描
  3. 获取鉴权参数ptwebqq
  4. 获取鉴权参数vfwebqq
  5. 获取鉴权参数uin和psessionid

流程 1 获取二维码

method: Get
url: https://ssl.ptlogin2.qq.com/ptqrshow?appid=501004106&e=0&l=M&s=5&d=72&v=4&t=0.1
return: 二维码图片 (PNG)

流程 2 获取二维码扫描状态

method: Get
url: https://ssl.ptlogin2.qq.com/ptqrlogin?webqq_type=10&remember_uin=1&login2qq=1&aid=501004106 &u1=http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10 &ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert &action=0-0-157510&mibao_css=m_webqq&t=1&g=1&js_type=0&js_ver=10143&login_sig=&pt_randsalt=0
referer: https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=16&mibao_css=m_webqq&appid=501004106&enable_qlogin=0&no_verifyimg=1 &s_url=http%3A%2F%2Fw.qq.com%2Fproxy.html&f_url=loginerroralert &strong_login=1&login_state=10&t=20131024001
return:

  • 扫描前 & 未失效
    ptuiCB('66','0','','0','二维码未失效。(3203423232)','');
    • 扫描前 & 已失效
      ptuiCB('65','0','','0','二维码已失效。(4012918406)', '');
      -扫描后 & 认证前
      ptuiCB('66','0','','0','二维码认证中。(3203423232)','');
      -认证后
      ptuiCB('66','0','','0','http://ptlogin4.web2.qq.com/check_sig?xxxxxx','');

这个请求可以直接轮训请求,直到认证成功后,将返回的地址保存下来用作下次请求。

流程 3 获取 ptwebqq

method: Get
url: 流程 2 返回的 url
referer: http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1

成功后
- HTTP 状态码 302
- 存储 cookie ptwebqq

流程 4 获取 vfwebqq

method: Get
url: http://s.web2.qq.com/api/getvfwebqq?ptwebqq=#{ptwebqq}&clientid=53999199&psessionid=&t=0.1
referer: http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1

url中需要填入上一步获取到的ptwebqq,请求成功后会返回一个JSON,将result.vfwebqq保存下来。

流程 5 获取 psessionid & uin

method: Get
url: http://d1.web2.qq.com/channel/login2
referer: http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2

表单数据只有一个,Key为 r

Value (JSON)

{  "ptwebqq": "#{ptwebqq}",  "clientid": 53999199,  "psessionid": "",  "status": "online",}
> 动态参数 `ptwebqq`> 储存 `result.uin` & `result.psessionid`> 返回值 `result.vfwebqq` 无用> 成功后有效期约2天,Web QQ 允许多页面同时在线但会出现接口冲突

资料获取 todo

消息收发 todo

其他 todo

来源

  • http://www.scienjus.com/webqq-analysis-1
  • http://www.scienjus.com/webqq-analysis-2
  • http://www.scienjus.com/webqq-analysis-3
  • http://www.scienjus.com/webqq-analysis-4
  • http://www.scienjus.com/webqq-analysis-5
0 0