# WeChat 消息发送与跟踪 Skill ## 能力概述 在手机端(Pixel 10 Pro Fold,Termux/Debian)直接发送微信消息、实时跟踪收发消息,无需 adb。 ## 环境要求 1. **Root 权限** — 必须已 root(Magisk 30.7+) 2. **LSPosed/Vector 模块** — HermesWeChatSendMsg 已启用,微信在作用域内 3. **微信主进程运行中** ## 文件位置 ``` server/services/wechat/ ├── android-wechat-tracker-sqlcipher.js # **主推** 消息跟踪(sqlcipher 轮询 DB) ├── android-wechat-sender-frida.js # **主推** 消息发送(Frida daemon 队列) ├── android-wechat-sender.js # 备用发送(am broadcast / content insert) ├── android-wechat-tracker.js # 备用跟踪(tail -f LSPosed 日志) ├── auto-reply.js # 自动回复主入口 └── wechat-reader.js # 数据库读取 ``` ## 发送消息 ### 方式1:Frida Daemon(推荐) 需要 frida-server 运行且 frida_daemon.js 已注入微信进程: ```js const { sendTextMessageFrida } = require('./android-wechat-sender-frida'); const r = await sendTextMessageFrida('wxid_xxxxxx', '你好,来自 hermes'); console.log(r); // { ok: true } // 写入 /data/local/tmp/frida_daemon/queue.jsonl,daemon 异步消费 ``` ### 方式2:ContentProvider / Broadcast(备用) ```js const { sendTextMessage, sendTextMessageBroadcast } = require('./android-wechat-sender'); // ContentProvider(与 Mac 端 API 一致) const r1 = await sendTextMessage('filehelper', '你好'); console.log(r1); // { ok: true, uri: 'content://.../send/0' } // 直接广播(绕过 Provider 进程) const r2 = await sendTextMessageBroadcast('wxid_xxxxxx', '测试消息'); console.log(r2); // { ok: true } ``` ### 批量发送 ```js const { sendBatch } = require('./android-wechat-sender'); const results = await sendBatch([ { toUser: 'filehelper', content: '消息1' }, { toUser: 'wxid_abc123', content: '消息2' }, ], 2000); // 每条间隔 2 秒 ``` ### 查询发送状态 ```js const { queryStatus } = require('./android-wechat-sender'); const s = await queryStatus(); console.log(s); // { status: 'pending' } | { status: 'true' } | { status: 'false' } ``` ## 跟踪消息 ### 方式1:SQLCipher 轮询(推荐) 直接查询微信加密 DB,不依赖 LSPosed hook: ```js const { AndroidWechatTrackerSQLCipher } = require('./android-wechat-tracker-sqlcipher'); const tracker = new AndroidWechatTrackerSQLCipher(); tracker.on('message', msg => { console.log(`[${msg.type.toUpperCase()}] ${msg.talker}: ${msg.content}`); }); tracker.on('error', err => console.error('Tracker error:', err.message)); await tracker.init(); // 读取当前最大 msgId tracker.startPolling(3000); // 每 3 秒轮询 // tracker.stopPolling(); ``` ### 方式2:LSPosed 日志 tail(备用) ```js const { AndroidWechatTracker } = require('./android-wechat-tracker'); const tracker = new AndroidWechatTracker(); tracker.on('message', msg => console.log(msg)); tracker.startPolling(3000); // tracker.startStream(); // tail -f 模式(更实时) // tracker.stopPolling(); ``` ### 一次性读取最近消息 ```js const msgs = await tracker.fetchRecent(20); // 仅 AndroidWechatTracker 支持 ``` ## 消息格式 ```ts { type: 'send' | 'recv', // 发送或接收 talker: string, // 对方 wxid / 群聊ID msgType: number, // 微信消息类型(1=文本) msgId: number, content: string, // 消息内容(截断前 50 字符) raw: string, // 原始日志行 timestamp: number, // 解析时间戳 } ``` ## 故障排查 | 现象 | 原因 | 解决 | |------|------|------| | `exit 1: permission denied` | 未 root 或 su 不可用 | 检查 Magisk root 状态 | | `content: not found` | 不在 Android 环境 | 确保在 Termux 或 Debian 中用 `/system/bin/content` | | 发送成功但对方没收到 | 广播被拦截或微信没在前台 | 确保微信主进程存活,检查 LSPosed 日志 | | 跟踪不到消息 | 日志级别不够 | 在 Vector Manager → 日志 中设置详细级别 | | `am broadcast` 提示 `Background execution not allowed` | Android 10+ 后台限制 | 使用 `content insert` 方式替代 | ## 与 Mac 端区别 | | Mac 端 | 手机端 | |--|--------|--------| | 文件 | `wechat-sender.js` / `wechat-tracker.js` | `android-wechat-sender.js` / `android-wechat-tracker.js` | | 连接方式 | `adb shell` | 直接 `su -c` | | 运行位置 | Mac hermes agent | Pixel Termux/Debian hermes agent | | 依赖 | adb | root + su |