SKILL.md 4.55 KB

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 已注入微信进程:

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 |