- 我找不到任何关于WhatsApp Web上使用的QR代码扫描的工作机制的答案。
- 当手机(运行WhatsApp的任何智能手机)扫描浏览器上的QR代码时,认证是如何进行的。
- 我不想了解它们背后的技术堆栈。就像WhatsApp使用修改版的
xmpp
,使用erlang
,使用Web技术,如socket.io
和ajax
来实现Web版本的功能。 - 这个问题可能比较广泛。但我渴望了解背后的实现。
xmpp
,使用erlang
,使用Web技术,如socket.io
和ajax
来实现Web版本的功能。它的工作方式如下:
1- 打开以下网址: https://web.whatsapp.com/
2- 浏览器加载页面时会加载各种JS和CSS文件,同时还会打开WebSocket(wss://w4.web.whatsapp.com/ws)- 参见此图片:
2.1- 每隔20000毫秒,您会在WebSocket上看到有关屏幕上QR代码刷新的通信。这是由服务器通过WebSocket(从现在开始称其为WS)发送到浏览器的。
2.2- 在接收到每个WS上的QR Code刷新时,您的浏览器将使用BASE64编码的GET请求获取新的QR Code。
2.3 - 请注意,服务器与浏览器之间打开的特定WS与唯一的QR代码相关联!因此,了解QR代码,服务器就知道哪个WS与其相关联!
---- 此阶段您的浏览器已经准备好使用WhatsApp应用程序,但它不知道您的ID(WhatsApp标识符,即您的手机号码),因为它无法从虚空中获取您的电话号码。
它也不需要您键入它,因为服务器不能确定该号码确实属于您。
因此,为了让服务器知道WS会话属于特定的手机,您需要使用手机进行QR阅读
3- 拿起已经经过身份验证的手机(否则您将无法访问扫描QR代码的部分),然后进行QR Code读取操作。
4- 当你的手机扫描二维码后,它会联系 WhatsApp 服务器并告知它们:
我的号码是XXXX,我的认证凭据是YYYYY,与此二维码相关联的 WS 现在可以接收我的数据了。
5- 服务器现在知道它可以将流量定向到属于该 QR Code 的特定 WS socket,并这样做!
6- 在浏览器的 WS 上,您可以看到服务器发送关于用户的数据,有关您正在进行的对话以及要获取哪些缩略图。
7- 浏览器从 WebSocket 获取此数据,并进行相应的 GET 请求以获取所需的缩略图和其他资源,例如用于通知的 MP3。
7.1- 浏览器上的 WS 监听器还会调用 Javascript 文件(在步骤1中接收)以使用新接口重绘页面 DOM。
8- 界面现在被重新绘制为类似 WhatsApp 应用程序的外观,并且您继续从 WS 接收数据,并在需要时发送数据,并且随着数据到达 WS,界面也会进行更新。
就是这样。
使用 Chrome 和开发人员工具,您可以实时看到所有这些内容。 您还可以查看 WS 通信(大部分内容,二进制帧需要另一个工具)并查看整个过程中发生的情况。
此外:
在线教程:点击此处
教程源代码 :Android 客户端
教程的源代码: Java Play 服务器