Commit 81d1c534a3313802a7f4e26ab97d45d12efe5611
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>
Showing
3 changed files
with
57 additions
and
1 deletions
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 | ... | ... |