2026-07-07 19:04:13 +08:00
|
|
|
|
#!/usr/bin/with-contenv bash
|
2026-07-17 18:10:31 +08:00
|
|
|
|
# 等待微信主界面登录完成(检测到足够大的主窗口),避免未登录时 bridge
|
|
|
|
|
|
# 狂刷日志/任务失败。超时 10 分钟仍未登录则放弃启动。
|
2026-07-07 19:04:13 +08:00
|
|
|
|
WAITED=0
|
2026-07-17 18:10:31 +08:00
|
|
|
|
MAX_WAIT=600
|
|
|
|
|
|
while true; do
|
|
|
|
|
|
# 通过 wechat 进程 PID 查找窗口,过滤出面积足够大的主窗口
|
|
|
|
|
|
wid=""
|
|
|
|
|
|
area=0
|
|
|
|
|
|
pid=$(pgrep -f "/config/wechat/opt/wechat/wechat" | head -1)
|
|
|
|
|
|
if [ -n "$pid" ]; then
|
|
|
|
|
|
for candidate in $(xdotool search --pid "$pid" 2>/dev/null); do
|
|
|
|
|
|
info=$(xdotool getwindowgeometry --shell "$candidate" 2>/dev/null)
|
|
|
|
|
|
if [ -n "$info" ]; then
|
|
|
|
|
|
eval "$info"
|
|
|
|
|
|
a=$((WIDTH * HEIGHT))
|
|
|
|
|
|
if [ "$a" -gt "$area" ]; then
|
|
|
|
|
|
area=$a
|
|
|
|
|
|
wid=$candidate
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
done
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 登录后主窗口面积通常 > 300000;登录窗口/扫码窗口面积较小
|
|
|
|
|
|
if [ "$area" -ge 300000 ]; then
|
|
|
|
|
|
echo "woc-bridge: 检测到微信已登录主窗口(area=${area}),等待 60s 让微信完全就绪后再启动 bridge" >&2
|
|
|
|
|
|
sleep 60
|
|
|
|
|
|
echo "woc-bridge: 等待结束,启动 bridge" >&2
|
2026-07-07 19:04:13 +08:00
|
|
|
|
break
|
|
|
|
|
|
fi
|
2026-07-17 18:10:31 +08:00
|
|
|
|
|
|
|
|
|
|
sleep 3
|
|
|
|
|
|
WAITED=$((WAITED + 3))
|
|
|
|
|
|
if [ "$WAITED" -ge "$MAX_WAIT" ]; then
|
|
|
|
|
|
echo "woc-bridge: 等待微信登录超时(${WAITED}s),暂不启动 bridge" >&2
|
|
|
|
|
|
# s6 服务退出码 0 会被视为正常结束并自动重启;用 sleep + 退出 0
|
|
|
|
|
|
# 让服务进入休眠,用户登录后可通过重启容器或手动 s6-svc -u 唤醒
|
|
|
|
|
|
sleep infinity
|
|
|
|
|
|
exit 0
|
|
|
|
|
|
fi
|
2026-07-07 19:04:13 +08:00
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
# 以 abc 用户身份运行(与微信同 X 会话,才能操作微信窗口)
|
|
|
|
|
|
# s6-setuidgid 不接受 VAR=value 参数,须先用 s6-env 设环境变量再切用户
|
|
|
|
|
|
|
|
|
|
|
|
# 校验 ptrace 权限(key_extractor 读微信进程内存需要)
|
2026-07-17 18:10:31 +08:00
|
|
|
|
PTRACE_SCOPE="/proc/sys/kernel/yama/ptrace_scope"
|
|
|
|
|
|
if [ -e "$PTRACE_SCOPE" ]; then
|
|
|
|
|
|
if echo 0 > "$PTRACE_SCOPE" 2>/dev/null; then
|
|
|
|
|
|
echo "woc-bridge: ptrace_scope 已设置为 0" >&2
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "woc-bridge: 无法写入 ptrace_scope(可能需要 --privileged 或 SYS_PTRACE capability)" >&2
|
|
|
|
|
|
fi
|
|
|
|
|
|
else
|
|
|
|
|
|
# 通过 CapEff 检查是否持有 SYS_PTRACE (bit 12)
|
|
|
|
|
|
CAP_EFF=$(awk '/^CapEff:/{print $2}' /proc/self/status 2>/dev/null)
|
|
|
|
|
|
if [ -n "$CAP_EFF" ] && [ $((0x${CAP_EFF} & 0x1000)) -ne 0 ]; then
|
|
|
|
|
|
echo "woc-bridge: 宿主机未启用 YAMA,但容器已持有 SYS_PTRACE,key 提取仍可尝试" >&2
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "woc-bridge: 宿主机未启用 YAMA 且容器未持有 SYS_PTRACE,自动 key 提取可能不可用" >&2
|
|
|
|
|
|
fi
|
2026-07-07 19:04:13 +08:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
exec s6-env DISPLAY=${DISPLAY:-:1} XAUTHORITY=/config/.Xauthority \
|
|
|
|
|
|
s6-setuidgid abc \
|
|
|
|
|
|
python3 /opt/woc-bridge/server.py \
|
|
|
|
|
|
--listen 0.0.0.0:8088 \
|
|
|
|
|
|
--wechat-db /config \
|
|
|
|
|
|
--display ${DISPLAY:-:1}
|