深入ItChat登录协议:从扫码到心跳循环的Web微信逆向全解
【免费下载链接】ItChatA complete and graceful API for Wechat. 微信个人号接口、微信机器人及命令行微信,三十行即可自定义个人号机器人。项目地址: https://gitcode.com/gh_mirrors/it/ItChat
ItChat 是一个用 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 请求,关键参数是一个固定值appid=wx782c26e4c19acffb(逆向教程 docs/tutorial/tutorial1.md 中通过抓包确认它是写死的)。返回的是一段 HTML 内嵌的 JavaScript,ItChat 用正则从中抠出 uuid:
regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)";'只要code == '200',uuid 就到手了。
捷径:webwxpushloginurl 免扫码登录
push_login函数会先检查 Cookie 里是否已有wxuin。如果有,说明是"上次登录过的号",可直接访问webwxpushloginurl?uin=xxx拿 uuid——此时扫码后无需再次确认,甚至配合热重载可以做到完全不扫码重连。这就是auto_login(hotReload=True)的原理,实现见 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_redirects=False访问它; - 解析 XML 凭证:响应是 XML,从中取出四把"钥匙"并组成后续所有请求都要携带的
BaseRequest:
| 字段 | 存入 BaseRequest 为 | 用途 |
|---|---|---|
skey | Skey | 请求签名校验 |
wxsid | Sid | 会话标识 |
wxuin | Uin | 用户标识 |
pass_ticket | DeviceID | 访问票据 |
- 生成设备指纹:
deviceid = 'e' + 随机数,并据重定向地址中的域名推断出fileUrl(传文件)和syncUrl(心跳,指向webpush.wx2.qq.com等域名)。
⚠️ 若四把钥匙缺任何一个,说明该账号被微信限制登录网页版,ItChat 会直接报错终止。
六、阶段⑤:webwxinit 握手与 SyncKey
web_init向{url}/webwxinitPOSTBaseRequest,服务端一次性回发:
- User:自己的账号信息(昵称、头像、UserName);
- SyncKey:同步密钥,是心跳拉消息的"游标",ItChat 把它拼成
Key_Val|Key_Val字符串存为synckey; - ContactList:一部分初始联系人,顺手写入本地通讯录;
- InviteStartCount:消息计数起点。
随后show_mobile_login以Code=3POSTwebwxstatusnotify,手机端顶部即出现"已登录网页微信"的红字提示。
七、阶段⑥:心跳循环——机器人永不掉线的秘密
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 对象即可重新登录。
八、协议端点速查表
| 端点 | 方法 | 作用 |
|---|---|---|
/jslogin | GET | 获取二维码 uuid |
/cgi-bin/mmwebwx-bin/login | GET | 轮询扫码状态 |
/webwxinit | POST | 初始化握手,获取 SyncKey |
/webwxstatusnotify | POST | 手机端登录状态提示 |
webpush.*/synccheck | GET | 心跳(长连接) |
/webwxsync | POST | 拉取新消息 |
/webwxlogout | GET | 登出并清理状态 |
九、总结:为什么这套设计值得学习
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),仅供参考