WebSocket 协议是用于单个 TCP 连接上进行全双工通信的一种协议,其特点在于服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是双向平等对话,属于服务器推送技术的一种。WebSocket 协议的 URL 以 ws:// 或者 wss:// 开头,其中 wss 是 WebSocket Secure 的加密版本。在进行抓包分析时,可以使用 WebSocket 来筛选 WebSocket 请求。在智慧树的扫码登录页面抓包时,可以看到一些特殊参数,与 HTTP/HTTPS 请求不同。在扫码登录后,可以看到客户端与服务器之间进行的数据交互,包括客户端发送给服务器的信息以及服务器返回给客户端的信息。在分析过程中,需要关注 WebSocket 连接的建立、数据发送与接收的间隔、扫码结果的返回以及连接的保持等问题。通过抓包,可以发现当二维码加载出来时,WebSocket 连接即建立,客户端每隔一段时间主动发送信息,服务器也以字典格式返回信息。扫码成功时,服务器返回扫码成功的信息。点击登录时,客户端再次发送扫码结果,成功时会得到一次性密码 oncePassword 和 uuid。此外,如果长时间不扫码,服务器会返回二维码已失效的信息。解决参数获取问题时,可以通过搜索加密字符串的方式找到客户端发送的那串字符串。对于较为复杂的客户端发送数据情况,可以利用已知的 WebSocket 方法来定位问题。在 Python 中实现 WebSocket 请求时,可以使用 websocket-client、websockets 或 aiowebsocket 库。为了实现每隔 8 秒发送一次数据以及实时接收服务端信息,可以参照 websocket-client 的长连接 demo,并根据需求进行适当的改造。扫码拿到 oncePassword 和 uuid 后,接下来的处理步骤就比较简单了。根据分析结果,实际操作中,只有两个重定向比较有用。在完整代码中,可以通过 GitHub 的仓库获取关键代码示例,虽然不能直接运行,但能提供参考。