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 信息的方法,虽然问题不是出在快速登录这部分。