android-wechat-sender-frida.js 1.88 KB
/**
 * 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 };