# WebSocket 智能机器人特有坑位

> 从 `wework-bot` 和 `wecom-aibot` 技能合并而来的 WebSocket 长连接专属陷阱。

## 1. ping/pong 超时导致频繁断连

`run_forever(ping_interval=30, ping_timeout=10)` 会导致每 ~75 秒断开重连。企微服务器不支持标准 WebSocket ping 帧。

**修复**：禁用客户端 ping
```python
ws_app.run_forever(ping_interval=0)
```

## 2. 服务端主动断开（~5 分钟无活动）

即使用 `ping_interval=0` 禁用了客户端 ping，服务端仍会在 ~5 分钟无消息交换后断开连接（`Connection to remote host was lost.`）。这是服务端主动断连，不是客户端问题。断开后重连即可——连接稳定期间消息收发正常。

要长时间保持活跃：实现应用层心跳（定期发送空消息或自定义 ping）。

## 3. 重连后收到旧连接的 `disconnected_event`

每次重连订阅成功后，企微会推送上一次连接的 `disconnected_event`。正常现象，忽略即可。

## 4. 日志缓冲问题

`logging.StreamHandler` 可能在后台进程中不输出。使用 `sys.stderr` 或文件日志：
```python
handlers=[logging.StreamHandler(sys.stderr), logging.FileHandler("bot.log")]
```

## 5. 空 cmd 响应（订阅确认）

订阅确认消息没有 `cmd` 字段，只有 `errcode`/`errmsg`。需特殊处理：
```python
errcode = msg.get("errcode")
if errcode is not None and not msg.get("cmd"):
    # 这是订阅确认
```

## 6. 凭证失效

`invalid bot_id or secret (853000)` → 后台重新获取 Bot ID 和 Secret。
