Skip to content

WhatsApp Web session 登出后监听器永久死亡

问题

WhatsApp Web session 被登出(手机端断开、多设备冲突、会话超时等原因)后,gateway 的 WhatsApp 监听器永久停止,agent 对 WhatsApp 消息完全失盲。

即使通过以下操作也无法恢复:

  • CLI 手动 openclaw pairing 重新配对
  • 等待自动重连
  • 切换 defaultAccount

只有重启 gateway 才能恢复监听。

受影响版本:OpenClaw 2026.3.x 及以上

根本原因分析(社区深度排查)

问题是两个 bug 叠加导致的:

Bug 1:重连循环中使用了 break

WhatsApp 重连循环在 loggedOut === true 时直接 break 退出循环,没有重入路径。一次登出就杀死了整个 monitor 循环。之后即使 CLI relink 成功,监听循环也已经消失,无法重新触发。

Bug 2:状态可见性丢失

登出状态没有持久化到外部存储,重启后 gateway 以为连接健康(内存中的 loggedOut 状态丢失),重连循环认为无需重建,造成状态不一致。

核心问题类比:这就像把"手机断线了"和"用户主动退出账号"两件事用同一个分支处理,然后用 break 一刀切。

解决方案

立即恢复的临时方案:重启 gateway

bash
openclaw gateway restart
# 或者完整停止再启动
openclaw gateway stop && openclaw gateway start

重启后需要重新配对(pairing):

bash
openclaw pairing  # 按提示扫码重新配对 WhatsApp

预防措施:设置监控告警

配置一个简单的健康检查,当 WhatsApp 连接断开超过 N 分钟时自动重启:

yaml
# 在 cron 中配置健康检查
# openclaw cron 示例:
schedule:
  - cron: "*/10 * * * *"
    command: |
      openclaw status | grep -q "whatsapp.*connected" || openclaw gateway restart

等待官方修复:该问题(#49305)需要将 break 改为带重连逻辑的状态机,区分"临时断连需要重试"和"需要重新授权"两种情况。

常见问题

Q: WhatsApp 多设备(Multi-Device)模式会更稳定吗?

A: 多设备模式(MD)下 session 持久性更强,手机离线时不会立即断连。但一旦 session 被强制登出(如账号被注销或在手机端手动退出),同样会触发此 bug。建议同时做好 gateway 监控。

Q: 配对后总是很快断开,有什么办法吗?

A: 确保 gateway 运行在低延迟网络环境中,避免 NAT 超时导致的 WebSocket 断连。可以通过 openclaw config set channels.whatsapp.keepaliveIntervalMs 20000 缩短 keepalive 间隔。