记一次 Telegram Bot 不回复的调试过程
记一次 Telegram Bot 不回复的调试过程
时间: 2026年4月19日
问题: Telegram Bot 配置后无法正常回复消息
Bot Token: 8529651472:***
Bot 用户名: @NNNNzs_hermes_bot
问题描述
配置了 Hermes Agent 的 Telegram Bot,但是在 Telegram 里问问题后没有正常回复。
调试过程
第一步:检查配置文件
发现 /root/.hermes/config.yaml 中 Telegram 配置缺少 token 字段:
yaml
telegram:
proxy_url: socks5://127.0.0.1:7891 # 有代理配置
channel_prompts: {}
问题1:配置中没有 Bot Token
第二步:修复配置
添加了 Token:
yaml
telegram:
token: 8529651472:***
proxy_url: socks5://127.0.0.1:7891
channel_prompts: {}
重启 Hermes 服务使配置生效。
第三步:验证 Token 有效性
bash
curl -s "https://api.telegram.org/bot8529651472:***/getMe"
返回结果:
json
{
"ok": true,
"result": {
"id": 8529651472,
"is_bot": true,
"first_name": "hermes",
"username": "NNNNzs_hermes_bot"
}
}
Token 有效,Bot 名称是 "hermes"。
第四步:检查日志
查看 /root/.hermes/logs/errors.log,发现大量错误:
2026-04-19 15:17:23,957 WARNING gateway.platforms.telegram: [Telegram] Telegram polling conflict (1/3), will retry in 10s.
Error: Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
问题2:Telegram 轮询冲突
第五步:排查冲突原因
检查运行中的进程:
bash
ps aux | grep -E "hermes|openclaw"
发现有两个服务在运行:
- Hermes Agent - PID 1804069
- OpenClaw Gateway - PID 1486016 (后来自动重启为 1807427)
查看 OpenClaw 配置 /root/.openclaw/openclaw.json,发现:
json
"telegram": {
"enabled": true,
"dmPolicy": "pairing",
"botToken": "7616633106:***",
"proxy": "http://127.0.0.1:7890"
}
OpenClaw 使用的 token 看起来不同(7616633106),但日志显示有冲突。
第六步:分析冲突原理
Telegram Bot API 限制:
- 同一个 Bot Token 只能有一个活跃的轮询连接
- 当两个程序同时调用
getUpdatesAPI 时,Telegram 会返回 409 Conflict 错误
可能的冲突原因:
- OpenClaw 配置中隐藏的 token 实际上与 Hermes 相同
- 有其他进程也在使用这个 token
- 代理设置导致连接复用冲突
第七步:查看完整日志
从 /root/.hermes/logs/gateway.log 可以看到:
2026-04-19 15:24:38,033 INFO gateway.platforms.telegram: [Telegram] Proxy detected; passing explicitly to HTTPXRequest: socks5://127.0.0.1:7891
2026-04-19 15:24:40,462 INFO gateway.platforms.telegram: [Telegram] Telegram menu: 100 commands registered, 26 hidden (over 100 limit). Use /commands for full list.
2026-04-19 15:24:40,465 INFO gateway.platforms.telegram: [Telegram] Connected to Telegram (polling mode)
2026-04-19 15:25:12,083 WARNING gateway.platforms.telegram: [Telegram] Telegram polling conflict (1/3), will retry in 10s. Error: Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
2026-04-19 15:25:17,372 INFO gateway.platforms.telegram: [Telegram] Disconnected from Telegram
虽然 Hermes 显示已连接,但随后因为冲突而断开。
技术要点
1. Bot Token 格式
Bot Token 格式:BOT_ID:API_KEY
8529651472是 Bot ID(不是 chat_id)- chat_id 是用户或群的 ID,用于发送消息
2. Telegram Bot 代理配置
Hermes 使用 socks5:// 代理:
yaml
proxy_url: socks5://127.0.0.1:7891
OpenClaw 使用 http:// 代理:
json
"proxy": "http://127.0.0.1:7890"
注意端口不同(7891 vs 7890)。
3. 轮询 vs Webhook
Polling(轮询):
- 客户端主动调用
getUpdatesAPI - 适合个人项目、开发测试
- 不需要公网 IP
- 有单连接限制
Webhook:
- Telegram 主动推送消息到指定 URL
- 适合生产环境
- 需要公网 IP + HTTPS 证书
- 支持多实例负载均衡
4. 进程管理
OpenClaw Gateway 通过 systemd user service 管理:
bash
systemctl --user stop openclaw-gateway
systemctl --user status openclaw-gateway
解决方案
有两种选择:
方案1:停止 OpenClaw 的 Telegram(推荐)
只使用 Hermes 的 Telegram Bot,因为已经配置好了。
bash
systemctl --user stop openclaw-gateway
方案2:禁用 Hermes 的 Telegram
继续使用 OpenClaw 的 Telegram,移除 Hermes 的 token 配置。
经验总结
- 配置检查要全面 - 不仅检查 Hermes 的配置,还要检查是否有其他服务在运行
- 日志是关键 - 轮询冲突的错误信息很明确,直接指向问题根源
- 进程管理很重要 - 多个自动化平台同时运行容易产生冲突
- 理解 API 限制 - Telegram Bot 的单连接限制是设计特性,不是 bug
相关命令
bash
# 测试 Bot Token
curl -s "https://api.telegram.org/bot<TOKEN>/getMe"
# 查看运行中的 Hermes 进程
ps aux | grep hermes
# 查看日志
tail -f /root/.hermes/logs/errors.log
tail -f /root/.hermes/logs/gateway.log
# 停止 OpenClaw
systemctl --user stop openclaw-gateway
# 重启 Hermes
pkill -f hermes-agent # 会自动重启
后续
需要决定使用哪个平台的 Telegram Bot:
- Hermes Agent:功能完整,已配置好
- OpenClaw:旧系统,可能还有其他依赖
建议统一到一个平台,避免未来再出现类似的冲突问题。