SKILL.md
4.55 KB
WeChat 消息发送与跟踪 Skill
能力概述
在手机端(Pixel 10 Pro Fold,Termux/Debian)直接发送微信消息、实时跟踪收发消息,无需 adb。
环境要求
- Root 权限 — 必须已 root(Magisk 30.7+)
- LSPosed/Vector 模块 — HermesWeChatSendMsg 已启用,微信在作用域内
- 微信主进程运行中
文件位置
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 已注入微信进程:
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(备用)
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 }
批量发送
const { sendBatch } = require('./android-wechat-sender');
const results = await sendBatch([
{ toUser: 'filehelper', content: '消息1' },
{ toUser: 'wxid_abc123', content: '消息2' },
], 2000); // 每条间隔 2 秒
查询发送状态
const { queryStatus } = require('./android-wechat-sender');
const s = await queryStatus();
console.log(s); // { status: 'pending' } | { status: 'true' } | { status: 'false' }
跟踪消息
方式1:SQLCipher 轮询(推荐)
直接查询微信加密 DB,不依赖 LSPosed hook:
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(备用)
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();
一次性读取最近消息
const msgs = await tracker.fetchRecent(20); // 仅 AndroidWechatTracker 支持
消息格式
{
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 |