记一次用 LSPosed 把手机微信接入 AstrBot 的过程
本文仅供交流学习用途,严禁将本文提到的方法或逆向技术用于任何未经授权的破解、破坏、窃取数据、恶意攻击或其他非法用途。
使用者须自行承担因使用不当而导致的一切法律后果。
前言
微信自己没有机器人服务,想接入AstrBot只能用OpenClaw方式,而这方式接入就是一个只能和自己互动的玩具,根本不能加入群聊。
你问为什么?不然似冯的张小龙怎么推销它的企业微信机器人呢。
电脑端的微信采用的是自己的Qt+C#架构,太难下手了,于是将目光转向安卓端。恰好MI8SE限制,拿它进行调试。
环境准备,与开发前的分析
直接装个Android Studio来准备环境,不过后续开发和调试都可以在VSCode里完成。也不是我做的。
电脑上已经有ADB和Java了,直接安装API 37版本的开发SDK,对应安卓版本Android 17。
考虑一下,需要对微信做什么:
- 需要Hook微信收消息的能力,并将其转换为Onebot v11格式,再发送到AstrBot进行处理;
- 同样地,插件需要接收AstrBot给出的Onebot v11格式消息,再使用特定Hook点将其转换为微信操作。
此外,直接在手机上完成Onebot协议转换会更方便。考虑到其他类似的适配器,这里将手机作为反向WebSocket的客户端,电脑上的AstrBot作为服务端启动监听。
为了保险,采用双重白名单的方式:手机一层+AstrBot一层。
逆向过程
感谢GPT-6-Astra的全流程协作,让我得以完成整个项目。
通过 ADB 提取手机上实际安装的微信 APK,用 JADX 分析。直接把整个 APK 丢进去,结果电脑内存爆了。不愧是腾讯家的IM,一个内置虚幻五,一个解包炸电脑。考虑其他方式,先给 DEX 里的类做索引,再按目标类分批反编译。
随后考虑接收端消息,让Astra自己反编译后插桩Hook测试即可。
期间还有个问题,明明微信已经打开了,账号查询却一直说“内核还没初始化”,后来发现是微信启动期间会切换 ClassLoader。过早拿到的加载器能找到类,但不一定是实际运行时正在使用的那一份。把初始化往后放,从应用 Context 重新取加载器,账号才终于认出来。
考虑到各类QQ逆向协议的客户端都是6199端口,将其设置为默认6198,避免端口冲突。这里新建一个OnebotV11的机器人,就叫做MyWxAdaptBot。因为微信ID的原因,插件解析并协议转换后的实际上不是原始ID,而是一一映射得到的,形如MyWxAdaptBot:GroupMessage:91。但需要先加入模块端白名单,才能向AstrBot上报信息。当时考虑了这个问题,设置了快捷添加最近打开的对话到白名单的功能。
一开始为了安全,使用adb的reverse进行端口转发;后续加了验证Token,就可以完全转为无线方案了。
接着再让Astra优化一下消息积压时候的异步处理,就差不多完成了。
还有拍一拍和引用回复,依旧是相同的方法让Astra调试。
真搞不懂为啥微信不能一键创建两人群聊,还得拉三个人然后踢掉一个才行。
测试
效果完美。目前作为服务监控消息推送机器人来使用。
先挂安卓手机上了,看看跑几天会被检测封号。还好是小号,随便造。





![[星港游记] 金星大距:二分相](https://webpn.esing.dev/img/starport.webp)