且听疯吟 在此记录扯淡的青春
QQ 是怎么实现快速登录的

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

原理

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

验证

  • 找一个有 QQ 快速登陆的页面,比如 mail.qq.com
  • 登陆 QQ 客户端
  • 打开浏览器的 Developer Tools -> Network
  • 刷新页面,观察所有请求的 domain
  • 好明显,这就是我们要找的了
    • 完整请求 url 是这样的
      https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=0.22949112393586502&pt_local_tk=-2027291081
    • 看看这个请求的 Response Content
      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

      ping localhost.ptlogin2.qq.com
      :: Pinging localhost.ptlogin2.qq.com [127.0.0.1] with 32 bytes of data
      
  • 现在我们验证下是否是 QQ 开了这个 Server
    • 查看哪个程序占用了 4301 端口

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

安全

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