news 2026/9/18 22:46:38

深入ItChat登录协议:从扫码到心跳循环的Web微信逆向全解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入ItChat登录协议:从扫码到心跳循环的Web微信逆向全解

深入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 微信协议里含金量最高的一步:

  1. 提取重定向地址:从响应中抠出window.redirect_uri,带着allow_redirects=False访问它;
  2. 解析 XML 凭证:响应是 XML,从中取出四把"钥匙"并组成后续所有请求都要携带的BaseRequest
字段存入 BaseRequest 为用途
skeySkey请求签名校验
wxsidSid会话标识
wxuinUin用户标识
pass_ticketDeviceID访问票据
  1. 生成设备指纹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_loginCode=3POSTwebwxstatusnotify,手机端顶部即出现"已登录网页微信"的红字提示。

七、阶段⑥:心跳循环——机器人永不掉线的秘密

start_receiving启动一个守护线程运行maintain_loop,这就是整条消息的"心脏":

while alive: 1. sync_check() ← 长连接心跳(阻塞等待,最长 60s) 2. selector == '0' → 无事发生,继续心跳 selector 非 0 → get_msg() 拉取新消息 3. 消息经 produce_msg 格式化后放入消息队列,交给注册的回调函数

三个关键细节值得留意:

  • 长连接而非定时轮询synccheck请求会挂起直到有消息或超时,config.pyTIMEOUT = (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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 22:45:58

VSCode Python 调试配置:launch.json 与断点技巧

用 VSCode 写 Python,最容易被忽略、又最影响日常效率的环节,就是 Debug 调试配置。我见过太多人把 VSCode 当成一个"好看点的记事本"——写代码靠它,定位问题还是回到最原始的方式:满屏 print,改一次跑一次…

作者头像 李华
网站建设 2026/9/18 22:42:23

科研PPT设计规范:信息密度优先的工程化表达

简介:本资源是一份面向科研人员与技术从业者的技术汇报PPT制作指南,聚焦组内学术汇报场景下的专业表达与视觉呈现。内容系统梳理了简约严谨的风格设计、逻辑清晰的表述结构、阶段性工作成果的合理呈现、个人思考过程的可视化技巧,以及字体字号…

作者头像 李华