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