且听疯吟如此生活三十年
QQ 是怎么实现快速登录的

这个问题之前很好解决,使用浏览器 plugin 即可。
但是随着 Chrome 和 Firefox 都先后放弃了 NPAPI plugin,这一方法也行不通了,而且很多人是很讨厌 plugin 的。
但是在默认禁止了 NPAPI 的 Chrome 版本,QQ 依然可以实现快速登录(一键登录),是怎么做到的呢?

原理

其实不难猜。既然不存在 plugin,无法以此来实现浏览器内和本地客户端的直接通信,那么排除其他的黑科技,有一种很简单的方法可以实现这个效果。
那就是在客户端开一个 Server,在浏览器里面请求这个地址。
理论上这样是可以实现的,至于 QQ 是不是用的这种方法,稍微验证下好了。

验证

  • 找一个有 QQ 快速登陆的页面,比如 mail.qq.com

  • 登陆 QQ 客户端

  • 打开浏览器的 Developer Tools -> Network

  • 刷新页面,观察所有请求的 domain

  • 好明显,这就是我们要找的了

    • 完整请求 url 是这样的

      1
      https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=0.22949112393586502&pt_local_tk=-2027291081
    • 看看这个请求的 Response Content

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      var var_sso_uin_list = [
      {
      account: "xxxxxx",
      client_type: 65793,
      face_index: 0,
      gender: 1,
      nickname: "xxx",
      uin: "xxx",
      uin_flag: xxxxx,
      },
      ];
      ptui_getuins_CB(var_sso_uin_list);

      很明显是当前登录的用户信息

    • ping 一下这个请求的 domain
      不出所料结果是 127.0.0.1

      1
      2
      ping localhost.ptlogin2.qq.com
      :: Pinging localhost.ptlogin2.qq.com [127.0.0.1] with 32 bytes of data
  • 现在我们验证下是否是 QQ 开了这个 Server

    • 查看哪个程序占用了 4301 端口

      1
      2
      netstat -ano | findstr "4301"
      :: TCP 127.0.0.1:4301 0.0.0.0:0 LISTENING 14516
    • 得到 pid 我们就可以看否是 QQ 在监听这个端口了

      1
      2
      tasklist | findstr "14516"
      :: QQ.exe 14516 Console 2 87,892 K

安全

可能有人担心会不会有安全问题,会不会其他网站访问这个 url 就拿走用户信息?其实挺容易解决,存一个 token 到服务端,获取的时候校验下就好了。
但是归根到底取决于腾讯对这方面安全的重视程度和意愿了,至少之前是确实存在从网页上获取当前登录的 QQ 信息的方法,虽然问题不是出在快速登录这部分。