Commit 81d1c534a3313802a7f4e26ab97d45d12efe5611

Authored by yibo
1 parent 58baa21d

feat(wechat-auto-reply): 环节1 常驻自启 — service.d + 看门狗监督器

wechat_reply_daemon.sh:root 监督器,带 Termux 环境、单实例锁、等微信登录
就绪(selftest)、看门狗崩溃重启(退避 10s)。
service.d__wechat-reply-watcher.sh:Magisk service.d 开机钩子(装到
/data/adb/service.d/wechat-reply-watcher.sh)拉起监督器。
真机验证:纯 root(boot 上下文)selftest 通过、单实例防重、杀 watcher 自动
重启、setsid 脱离后挂 init 常驻。已在设备 7×24 运行。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
md/wechat-auto-reply-requirements.md
... ... @@ -43,7 +43,8 @@
43 43 - **增量+去重+基线**:持久化 `last_msgId`;只 `isSend=0 且 msgId>last`;首跑基线=当前最大 msgId,不重放历史。
44 44 - **分类**:private / group_at_me / group_quote_me / group_other;群消息剥 `wxid:\n` 前缀取 sender+body;自身 wxid/昵称从 userinfo 自动检测。
45 45 - **输出**:`incoming.jsonl` 事件队列(供环节 2-5 消费)。自检 `--selftest`、单读 `--once`、`--tail N`。
46   -- 待接:常驻自启(Termux:Boot / Hermes cron),env4 里再过滤 gh_ 公众号与系统消息(撤回/拍一拍)。
  46 +- **常驻自启(已接)**:`wechat_reply_daemon.sh` 监督器(root + Termux 环境、单实例锁、等微信登录、看门狗崩溃重启);`/data/adb/service.d/wechat-reply-watcher.sh` 开机拉起。真机验证:纯 root(boot 上下文) selftest 通过、单实例防重、杀 watcher 自动重启。已在设备常驻运行。
  47 +- 待接:env4 里过滤 gh_ 公众号与系统消息(撤回/拍一拍);daemon.log 无限增长需加轮转(ponytail:先不做,24/7 下每天几 MB)。
47 48  
48 49 原始设计记录:
49 50  
... ...
wechat_plain/scripts/auto-reply/service.d__wechat-reply-watcher.sh 0 → 100644
  1 +#!/system/bin/sh
  2 +# Magisk service.d 开机钩子:拉起微信自动回复 watcher 监督器(环节1)。
  3 +# 部署到 /data/adb/service.d/wechat-reply-watcher.sh(去掉本文件名里的 "service.d__" 前缀)。
  4 +# service.d 本身以 root、late_start 运行;监督器内部还会再等微信登录,故这里只需粗略延时。
  5 +sleep 30
  6 +nohup /data/data/com.termux/files/home/.hermes/wechat_reply/wechat_reply_daemon.sh >/dev/null 2>&1 &
... ...
wechat_plain/scripts/auto-reply/wechat_reply_daemon.sh 0 → 100644
  1 +#!/system/bin/sh
  2 +# 环节1 watcher 的常驻监督器(root 运行,带 Termux 环境)。
  3 +# 职责:单实例、等微信登录就绪、看门狗式崩溃重启。
  4 +# 由 /data/adb/service.d/wechat-reply-watcher.sh 开机拉起;也可手动直接跑。
  5 +export HOME=/data/data/com.termux/files/home
  6 +export PREFIX=/data/data/com.termux/files/usr
  7 +export PATH=$PREFIX/bin:/system/bin:/system/xbin
  8 +export LD_LIBRARY_PATH=$PREFIX/lib
  9 +export TMPDIR=$PREFIX/tmp
  10 +PY=$PREFIX/bin/python
  11 +W=$HOME/.hermes/wechat_reply
  12 +WATCHER=$W/wechat_reply_watcher.py
  13 +LOG=$W/daemon.log
  14 +LOCK=$W/daemon.lock
  15 +
  16 +mkdir -p "$W"
  17 +
  18 +# ── 单实例:已有活着的监督器就退出 ──
  19 +if [ -f "$LOCK" ]; then
  20 + OLD=$(cat "$LOCK" 2>/dev/null)
  21 + if [ -n "$OLD" ] && kill -0 "$OLD" 2>/dev/null; then
  22 + echo "$(date) 监督器已在跑 pid=$OLD,退出" >> "$LOG"
  23 + exit 0
  24 + fi
  25 +fi
  26 +echo $$ > "$LOCK"
  27 +echo "$(date) 监督器启动 pid=$$" >> "$LOG"
  28 +
  29 +# ── 等 Termux python ──
  30 +i=0
  31 +while [ ! -x "$PY" ]; do
  32 + sleep 5; i=$((i + 1))
  33 + [ $i -gt 60 ] && { echo "$(date) 等不到 python,放弃" >> "$LOG"; rm -f "$LOCK"; exit 1; }
  34 +done
  35 +
  36 +# ── 等微信登录 / DB 可解密(selftest 通过)──
  37 +until "$PY" "$WATCHER" --selftest >/dev/null 2>&1; do
  38 + echo "$(date) 等微信登录/DB 就绪…" >> "$LOG"
  39 + sleep 15
  40 +done
  41 +echo "$(date) 就绪,进入看门狗循环" >> "$LOG"
  42 +
  43 +# ── 看门狗:watcher 退出就重启(退避 10s)──
  44 +while true; do
  45 + echo "$(date) 拉起 watcher" >> "$LOG"
  46 + "$PY" "$WATCHER" >> "$LOG" 2>&1
  47 + echo "$(date) watcher 退出 rc=$?,10s 后重启" >> "$LOG"
  48 + sleep 10
  49 +done
... ...