增加“撤回通知带原文显示”功能,便于识别出被撤回的内容。注意:当前只支持私聊,群聊暂不支持

This commit is contained in:
zhangyang131 2026-06-10 14:35:47 +08:00
parent bebe756f1d
commit 5a6c282537
2 changed files with 134 additions and 14 deletions

View File

@ -48,15 +48,17 @@ chmod +x patch.sh # 添加可执行权限
### 可选:启用"撤回通知带原文" ### 可选:启用"撤回通知带原文"
完成基础安装后,在终端前台运行消息监听,撤回通知就会带上原文 完成基础安装后,安装消息监听服务,撤回通知就会带上原文(当前只支持私聊,群聊暂不支持)
```bash ```bash
./patch.sh --monitor # 前台运行消息监听Ctrl+C 退出 ./patch.sh --monitor-install # 安装(后台自动运行,开机自启)
./patch.sh --monitor-status # 查看状态
./patch.sh --monitor-uninstall # 卸载
``` ```
监听运行期间,收到的消息会被缓存;对方撤回时通知自动展示消息原文 安装后无需手动操作。微信启动时自动开始监听消息、微信关闭后自动收尾、下次启动再次跟随
运行此命令也不影响防撤回主功能,撤回通知降级为不带原文。 安装也不影响防撤回主功能,撤回通知降级为不带原文。
> **已知限制**:部分群聊消息因内部对象结构差异,可能无法缓存原文,撤回时会降级为不带原文的通知。私聊消息和大部分群聊消息可正常获取原文。 > **已知限制**:部分群聊消息因内部对象结构差异,可能无法缓存原文,撤回时会降级为不带原文的通知。私聊消息和大部分群聊消息可正常获取原文。
@ -67,8 +69,9 @@ chmod +x patch.sh # 添加可执行权限
```bash ```bash
./patch.sh --debug # 不装 hook仅签名允许 lldb attach ./patch.sh --debug # 不装 hook仅签名允许 lldb attach
./patch.sh --monitor # 前台运行消息监听 ./patch.sh --monitor # 前台运行消息监听调试用Ctrl+C 退出)
cat /tmp/antirevoke_debug.log # 防撤回日志 cat /tmp/antirevoke_debug.log # 防撤回日志
cat /tmp/wechat_monitor_daemon.log # 监听 daemon 日志
cat /tmp/wechat_msg_cache.tsv # 消息缓存 cat /tmp/wechat_msg_cache.tsv # 消息缓存
``` ```
@ -103,9 +106,9 @@ cat /tmp/wechat_msg_cache.tsv # 消息缓存
- **聊天框内无撤回提示**:由于微信 4.x 的架构限制C++ 实现 + 符号 strip + 数据库加密),无法在聊天界面内插入系统消息。替代方案为 macOS 系统通知。 - **聊天框内无撤回提示**:由于微信 4.x 的架构限制C++ 实现 + 符号 strip + 数据库加密),无法在聊天界面内插入系统消息。替代方案为 macOS 系统通知。
- **撤回通知原文需 monitor 在跑**:消息原文功能依赖前台 `./patch.sh --monitor` 监听消息。不运行时撤回通知降级为不带原文。 - **撤回通知原文需 monitor 服务运行**:通过 `./patch.sh --monitor-install` 安装后自动后台运行。未安装时撤回通知降级为不带原文。
- **monitor 运行时微信会被 lldb attach**:性能影响极小(每条消息触发约 1ms 断点回调)。如果不需要原文功能,不启动 monitor 即可。 - **monitor 运行时微信会被 lldb attach**:性能影响极小(每条消息触发约 1ms 断点回调)。如果不需要原文功能,不安装 monitor 即可。
## 风险说明 ## 风险说明

121
patch.sh
View File

@ -1065,9 +1065,9 @@ do_uninstall() {
# ======================== 消息监听(撤回原文)======================== # ======================== 消息监听(撤回原文)========================
# 释放内嵌脚本到 MONITOR_INSTALL_DIR MONITOR_INSTALL_DIR="$HOME/.local/share/wechatintercept"
deploy_monitor_files() { deploy_monitor_files() {
MONITOR_INSTALL_DIR="/tmp/wechatintercept_monitor"
mkdir -p "$MONITOR_INSTALL_DIR" mkdir -p "$MONITOR_INSTALL_DIR"
# wechat_msg_monitor.py # wechat_msg_monitor.py
@ -1690,6 +1690,111 @@ EOF
lldb -s "$INIT_FILE" lldb -s "$INIT_FILE"
} }
# ── 后台 daemon ──────────────────────────────────────────
MONITOR_LABEL="com.wechatintercept.monitor"
MONITOR_PLIST="$HOME/Library/LaunchAgents/${MONITOR_LABEL}.plist"
MONITOR_DAEMON="$MONITOR_INSTALL_DIR/monitor_daemon.sh"
MONITOR_LOG="/tmp/wechat_monitor_daemon.log"
MONITOR_PID="/tmp/wechat_monitor_daemon.pid"
deploy_daemon() {
deploy_monitor_files
cat > "$MONITOR_DAEMON" << 'DAEMON_SH'
#!/bin/bash
set -u
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PY_SCRIPT="$SCRIPT_DIR/wechat_msg_monitor.py"
LOG="/tmp/wechat_monitor_daemon.log"
PID_FILE="/tmp/wechat_monitor_daemon.pid"
log() { echo "[$(date '+%H:%M:%S')] $*" >> "$LOG"; }
cleanup() { [ -n "${LLDB_PID:-}" ] && kill "$LLDB_PID" 2>/dev/null; rm -f "$PID_FILE"; exit 0; }
trap cleanup INT TERM EXIT
[ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE" 2>/dev/null)" 2>/dev/null && exit 0
echo $$ > "$PID_FILE"
log "daemon start pid=$$"
LLDB_PID="" ; LAST_PID=""
while true; do
WPID=$(pgrep -x WeChat | head -1 || true)
if [ -z "$WPID" ]; then
[ -n "$LLDB_PID" ] && kill "$LLDB_PID" 2>/dev/null && wait "$LLDB_PID" 2>/dev/null
LLDB_PID="" ; LAST_PID=""
sleep 3; continue
fi
if [ "$WPID" != "$LAST_PID" ] || [ -z "$LLDB_PID" ] || ! kill -0 "$LLDB_PID" 2>/dev/null; then
[ -n "$LLDB_PID" ] && kill "$LLDB_PID" 2>/dev/null && wait "$LLDB_PID" 2>/dev/null
log "attach wechat pid=$WPID"
INIT=$(mktemp /tmp/wx_mon.XXXXXX)
cat > "$INIT" << LLDBEOF
command script import "$PY_SCRIPT"
process attach --pid $WPID
wx_monitor_start
continue
LLDBEOF
lldb -b -s "$INIT" >> "$LOG" 2>&1 &
LLDB_PID=$!
LAST_PID="$WPID"
sleep 5
rm -f "$INIT"
fi
sleep 5
done
DAEMON_SH
chmod +x "$MONITOR_DAEMON"
}
do_monitor_install() {
deploy_daemon
mkdir -p "$HOME/Library/LaunchAgents"
cat > "$MONITOR_PLIST" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>${MONITOR_LABEL}</string>
<key>ProgramArguments</key>
<array>
<string>${MONITOR_DAEMON}</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>${MONITOR_LOG}</string>
<key>StandardErrorPath</key>
<string>${MONITOR_LOG}</string>
<key>ThrottleInterval</key>
<integer>10</integer>
</dict>
</plist>
EOF
launchctl unload "$MONITOR_PLIST" 2>/dev/null || true
launchctl load "$MONITOR_PLIST"
echo "[OK] 消息监听已安装(后台自动运行)"
echo " 日志tail -f $MONITOR_LOG"
echo " 状态:$0 --monitor-status"
echo " 卸载:$0 --monitor-uninstall"
}
do_monitor_uninstall() {
[ -f "$MONITOR_PLIST" ] && launchctl unload "$MONITOR_PLIST" 2>/dev/null && rm -f "$MONITOR_PLIST"
[ -f "$MONITOR_PID" ] && kill "$(cat "$MONITOR_PID" 2>/dev/null)" 2>/dev/null; rm -f "$MONITOR_PID"
[ -d "$MONITOR_INSTALL_DIR" ] && rm -rf "$MONITOR_INSTALL_DIR"
echo "[OK] 消息监听已卸载"
}
do_monitor_status() {
[ -f "$MONITOR_PLIST" ] && echo "LaunchAgent: 已安装" || echo "LaunchAgent: 未安装"
if [ -f "$MONITOR_PID" ] && kill -0 "$(cat "$MONITOR_PID" 2>/dev/null)" 2>/dev/null; then
echo "daemon: 运行中 (pid=$(cat "$MONITOR_PID"))"
else echo "daemon: 未运行"; fi
WPID=$(pgrep -x WeChat | head -1 || true)
[ -n "$WPID" ] && echo "微信: 运行中 (pid=$WPID)" || echo "微信: 未运行"
[ -f /tmp/wechat_msg_cache.tsv ] && echo "缓存: $(wc -l < /tmp/wechat_msg_cache.tsv)" || echo "缓存: 空"
[ -f "$MONITOR_LOG" ] && echo "" && echo "── 最近日志 ──" && tail -5 "$MONITOR_LOG"
}
# ======================== 入口 ======================== # ======================== 入口 ========================
case "${1:-}" in case "${1:-}" in
--debug|-d) --debug|-d)
@ -1701,10 +1806,22 @@ case "${1:-}" in
--monitor) --monitor)
do_monitor_foreground do_monitor_foreground
;; ;;
--monitor-install)
do_monitor_install
;;
--monitor-uninstall)
do_monitor_uninstall
;;
--monitor-status)
do_monitor_status
;;
--help|-h) --help|-h)
print_banner print_banner
echo "用法:" echo "用法:"
echo " $0 安装防撤回" echo " $0 安装防撤回"
echo " $0 --monitor-install 安装消息监听(后台自动运行)"
echo " $0 --monitor-uninstall 卸载消息监听"
echo " $0 --monitor-status 查看监听状态"
echo " $0 --monitor 前台运行消息监听(调试用)" echo " $0 --monitor 前台运行消息监听(调试用)"
echo " $0 --debug 调试模式(无 hook允许 lldb" echo " $0 --debug 调试模式(无 hook允许 lldb"
echo " $0 --uninstall 卸载防撤回" echo " $0 --uninstall 卸载防撤回"