QQ快速登录:浏览器自动检测到已登录QQ号的原理

分享于:2019-03-13 11:45:17

我们在登录某一网站时,网站会有QQ登录,


1.png


点击网站的QQ登录,进入QQ快速登录界面


1.png


假如我们的电脑已登录了QQ软件,浏览器会自动识别,不需要手动输入QQ号和密码,轻轻一点就能登录。


对此,我们会有些疑惑:


做过web开发的童鞋都知道,浏览器是不提供访问本地电脑的权限的,也就是浏览器连本地电脑的计算机名都不会(通过http或者https)告诉网站服务端,更别说是本地电脑的一个三方软件(QQ软件)里的信息。


那腾讯是怎么实现QQ快速登录的呢?


早些年,腾讯是通过浏览器的一些插件实现的(下面信息了解下):


通过NPAPI和 ActiveX 来实现。

网景插件应用程序编程接口(NPAPI, Netscape Plugin Application Programming Interface)是Netscape Navigator、Mozilla Suite、Mozilla SeaMonkey和Mozilla Firefox等Gecko引擎浏览器与Apple Safari和Google Chrome等webkit引擎浏览器所使用的类似ActiveX的插件接口。

ActiveX 是一个开放的集成平台,为开发人员、 用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内容的方法。 使用 ActiveX, 可轻松方便的在 Web页中插入 多媒体效果、 交互式对象、以及复杂程序,创建用户体验相当的高质量多媒体CD-ROM 。

因为IE从5.5版本后停止支持   NPAPI,所以, 腾讯对 IE浏览器 采用 ActiveX 插件,对除IE浏览器等其它主流浏览器采用NPAPI的形式来实现快速登录。

每当你运行该页面的时候,他会判断你浏览器支持不支持ActiveX,然后再进行相关操作。

当然,如果用ActiveX呢,你的浏览器又得下载插件,如果用NPAPI呢部分浏览器还要审核插件,并且伴随着时代的发展,NPAPI和ActiveX 已经显得老态龙钟,


所以,腾讯想了个新花招来实现快速登录。


新方式实现的原理:


本地的QQ软件有着web服务器的功能,当从一网站点击QQ登录,跳转到QQ快速登录界面,页面会自动使用JS去请求本地电脑的QQ软件(使用https方式),从而得到QQ号、头像等信息,这就是为什么QQ快速登录页面会自动检测到本地已登录的QQ号。


是不是这样呢?我们来看下:


1)打开CMD命令行,输入netstat -ano


1.png


楠神的电脑打开了4300端口和4301端口,这两个端口仅限本机使用。打开这两个端口的进程id是6160,从任务管理器看下6160进程是谁?


1.png


原来是QQ软件的进程。


2)打开浏览器的开发者工具(F12),点击一网站的QQ登录,进入QQ快速登录界面,在开发者工具“Network”中,有这样两个JS请求


1.png


pt_get_unins开头的:


1.png


可以发现,它请求的是本地的4301端口,也就是本地是QQ软件。其返回内容:


1.png


第一个字段“account”就是QQ号。这就是QQ快速登录界面获取到QQ号的方式


getface开头的:


有了QQ号,获取头像就简单了:


1.png


浏览器自动检测到已登录QQ号的原理大致就是这样。


楠神只说下是怎么检测到QQ号,关于细节性的东西,比如网址中的参数有什么作用?后续的登录怎么实现?推荐看下这篇文章: http://www.cnblogs.com/1996V/p/7481823.html。