/** * android-wechat-sender-frida.js — ⚠️ 已废弃,保留仅供参考 * * 原设计:写入队列文件由常驻微信进程的 Frida daemon 读取并发送。 * * 实测在 WeChat 8.0.72 + Frida 17 上 daemon 注入会触发微信反调试, * 进程崩溃。当前生产路径走 am broadcast → HermesAccessibilityService UI 自动化, * 见 android-wechat-sender.js (sendTextMessageBroadcast)。 * * 不要在新代码中调用本模块的导出函数。 */ const fs = require('fs'); // 所有 Pixel 端文件统一放在 Termux 可访问目录,避免 /data/local/tmp 权限问题 const HOME_DIR = '/data/data/com.termux/files/home/hermes-wechat'; const QUEUE_DIR = HOME_DIR + '/.frida_queue'; const QUEUE_FILE = QUEUE_DIR + '/queue.jsonl'; function ensureDir() { try { if (!fs.existsSync(QUEUE_DIR)) { fs.mkdirSync(QUEUE_DIR, { recursive: true }); fs.chmodSync(QUEUE_DIR, 0o777); } } catch (e) { // ignore } } /** * 使用 Frida daemon 发送文本消息(fire-and-forget) * @param {string} toUser — wxid / 群聊ID * @param {string} content — 消息内容 * @returns {Promise<{ok: boolean, error?: string}>} */ async function sendTextMessageFrida(toUser, content) { if (!toUser || !content) { return { ok: false, error: 'toUser and content are required' }; } ensureDir(); const id = 'msg_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8); const payload = JSON.stringify({ talker: toUser, content, id }) + '\n'; try { fs.writeFileSync(QUEUE_FILE, payload); fs.chmodSync(QUEUE_FILE, 0o666); } catch (e) { return { ok: false, error: `Failed to write queue: ${e.message}` }; } // Fire-and-forget: daemon will process asynchronously // 给 daemon 一点时间处理(通常 < 1s) await new Promise(r => setTimeout(r, 500)); return { ok: true }; } module.exports = { sendTextMessageFrida };