深入ItChat登录协议:从扫码到心跳循环的Web微信逆向全解 深入ItChat登录协议从扫码到心跳循环的Web微信逆向全解【免费下载链接】ItChatA complete and graceful API for Wechat. 微信个人号接口、微信机器人及命令行微信三十行即可自定义个人号机器人。项目地址: https://gitcode.com/gh_mirrors/it/ItChatItChat 是一个用 Python 编写的微信个人号接口库它的核心就是对Web 微信登录协议的完整逆向。本文将带你逐层拆解 ItChat 的登录全流程如何获取二维码 uuid、如何轮询扫码状态、如何解析登录凭证以及心跳循环如何保持长连接不断线——读懂这篇指南你就能明白一个微信机器人从扫码到收发消息的完整生命周期。 整个协议实现集中在一个文件里itchat/components/login.py约 360 行代码覆盖登录与收消息全流程基础常量服务器地址、超时、UA定义在 itchat/config.py。一、总览扫码到心跳的 6 个阶段ItChat 的登录不是一步完成而是一条环环相扣的流水线官方文档 docs/intro/login.md 也按同样顺序拆解过阶段方法作用①get_QRuuid向服务器申请一个一次性二维码 uuid②get_QR本地生成并展示二维码③check_login轮询扫码状态直到返回 200④web_init初始化握手拿账号信息与 SyncKey⑤show_mobile_login让手机端显示网页已登录提示⑥start_receiving开启心跳循环持续拉取新消息这些方法由load_login函数批量挂载到 itchat/core.py 的 Core 对象上再经 itchat/components/register.py 包装成用户最常用的auto_login一键登录。二、阶段①申请二维码 uuid含免扫码捷径常规路径jslogin 接口ItChat 向https://login.weixin.qq.com/jslogin发起 GET 请求关键参数是一个固定值appidwx782c26e4c19acffb逆向教程 docs/tutorial/tutorial1.md 中通过抓包确认它是写死的。返回的是一段 HTML 内嵌的 JavaScriptItChat 用正则从中抠出 uuidregx rwindow.QRLogin.code (\d); window.QRLogin.uuid (\S?);只要code 200uuid 就到手了。捷径webwxpushloginurl 免扫码登录push_login函数会先检查 Cookie 里是否已有wxuin。如果有说明是上次登录过的号可直接访问webwxpushloginurl?uinxxx拿 uuid——此时扫码后无需再次确认甚至配合热重载可以做到完全不扫码重连。这就是auto_login(hotReloadTrue)的原理实现见 itchat/components/hotreload.py。三、阶段②二维码其实是本地生成的一个反直觉的细节ItChat 并没有向服务器下载二维码图片。它拿到 uuid 后直接用pyqrcode把指向https://login.weixin.qq.com/l/{uuid}的地址渲染成 PNG放大 10 倍保证清晰保存为QR.png并自动打开。也就是说二维码的内容只是一个登录页链接扫码后手机端的确认请求会触发服务端把这个 uuid 标记为已扫描。四、阶段③轮询扫码状态与 4 个状态码登录等待期check_login以秒级频率 GET 轮询/cgi-bin/mmwebwx-bin/login响应同样是window.code(\d)形式四个状态码构成整个登录状态机的核心状态码含义ItChat 的动作200登录成功解析登录凭证进入初始化201已扫码、待手机确认提示请在手机上按确认408二维码过期回到阶段①重新生成二维码0未知/无信息继续等待注意参数里的r -localTime / 1579这是逆向时发现的一个神秘常数疑似某种时间刻度照抄即可工作。五、阶段④解析登录凭证4 把钥匙 1 台设备收到 200 后process_login_info做三件事这也是 Web 微信协议里含金量最高的一步提取重定向地址从响应中抠出window.redirect_uri带着allow_redirectsFalse访问它解析 XML 凭证响应是 XML从中取出四把钥匙并组成后续所有请求都要携带的BaseRequest字段存入 BaseRequest 为用途skeySkey请求签名校验wxsidSid会话标识wxuinUin用户标识pass_ticketDeviceID访问票据生成设备指纹deviceid e 随机数并据重定向地址中的域名推断出fileUrl传文件和syncUrl心跳指向webpush.wx2.qq.com等域名。⚠️ 若四把钥匙缺任何一个说明该账号被微信限制登录网页版ItChat 会直接报错终止。六、阶段⑤webwxinit 握手与 SyncKeyweb_init向{url}/webwxinitPOSTBaseRequest服务端一次性回发User自己的账号信息昵称、头像、UserNameSyncKey同步密钥是心跳拉消息的游标ItChat 把它拼成Key_Val|Key_Val字符串存为synckeyContactList一部分初始联系人顺手写入本地通讯录InviteStartCount消息计数起点。随后show_mobile_login以Code3POSTwebwxstatusnotify手机端顶部即出现已登录网页微信的红字提示。七、阶段⑥心跳循环——机器人永不掉线的秘密start_receiving启动一个守护线程运行maintain_loop这就是整条消息的心脏while alive: 1. sync_check() ← 长连接心跳阻塞等待最长 60s 2. selector 0 → 无事发生继续心跳 selector 非 0 → get_msg() 拉取新消息 3. 消息经 produce_msg 格式化后放入消息队列交给注册的回调函数三个关键细节值得留意长连接而非定时轮询synccheck请求会挂起直到有消息或超时config.py中TIMEOUT (10, 60)正是为它设置的连接 10 秒、读取 60 秒SyncKey 必须滚动更新每次webwxsync返回后都用新的SyncCheckKey覆盖旧值否则会重复拉取旧消息断线自愈ReadTimeout静默忽略其他异常累计重试超过receivingRetryCount默认 5 次才判定掉线触发logout并回调exitCallback通知用户。logout本身很干净GET 一次webwxlogout清空 Cookie 与本地联系人缓存Core 对象即可重新登录。八、协议端点速查表端点方法作用/jsloginGET获取二维码 uuid/cgi-bin/mmwebwx-bin/loginGET轮询扫码状态/webwxinitPOST初始化握手获取 SyncKey/webwxstatusnotifyPOST手机端登录状态提示webpush.*/synccheckGET心跳长连接/webwxsyncPOST拉取新消息/webwxlogoutGET登出并清理状态九、总结为什么这套设计值得学习ItChat 把 Web 微信逆向的全部复杂度封装成了6 步流水线 1 个心跳线程状态机清晰uuid → 状态码 → 凭证 → SyncKey每一步都是可独立调用的原子方法新手可以照着 docs/intro/login.md 逐步手动复现整个流程容错务实二维码过期自动重生成、读超时静默重试、热重载免扫码重连都是逆向工程里照抄协议 兜底重试的典型思路逆向方法论完整官方教程 docs/tutorial/tutorial1.md 用 Wireshark 抓包逐包还原了 jslogin、状态码轮询的全部细节是学习协议逆向的优质入门材料。掌握这套扫码 → 凭证 → 心跳的三段式结构后你可以轻松判断登录卡在哪一步也能把它迁移到其他长连接类协议的实践中。【免费下载链接】ItChatA complete and graceful API for Wechat. 微信个人号接口、微信机器人及命令行微信三十行即可自定义个人号机器人。项目地址: https://gitcode.com/gh_mirrors/it/ItChat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考