Telegram机器人切换令牌后旧Bot报400错误,如何终止其通信?
Telegram机器人令牌更新后旧Bot报错400的问题分析与解决建议
问题重现
- 用户首次配置Telegram机器人的access token和verify token后,webhook成功绑定到服务地址
https://[SERVER_URL]/webhooks/telegram/webhook?UID=CLIENT_A,Bot对话功能正常。 - 当用户更换新的令牌后,webhook更新为新Bot,但向旧Bot发消息时触发Telegram API错误:
A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: chat not found - 已尝试的无效操作:调用
delete_webhook()、log_out()、close()方法均无法解决错误;且向新Bot发消息时,会收到旧Bot对话产生的所有历史回复。
错误原因拆解
这个问题的核心是服务端未区分新旧Bot的消息处理逻辑:
- 用户更换令牌后,服务端统一使用新Bot的令牌处理所有消息,包括旧Bot推送过来的消息。
- 此时新Bot尚未与用户建立会话(用户还没给新Bot发过消息),用新Bot令牌调用API回复旧Bot的消息时,Telegram会判定“找不到对应会话”,触发400错误。
- 当用户给新Bot发消息后,会话建立,服务端再用新Bot令牌处理旧消息时就能正常发送回复,所以会一次性收到所有历史消息的回复。
关于stop_polling()的作用
调用stop_polling()完全无法解决这个问题。原因很简单:
stop_polling()是专门针对Telegram Bot的长轮询(Polling)模式设计的方法,用于终止服务端主动向Telegram拉取消息的进程。- 而你当前使用的是Webhook模式,由Telegram主动将消息推送到你的服务端,不存在服务端主动轮询的进程,所以这个方法对Webhook模式的Bot没有任何影响,更无法终止旧Bot的通信。
有效处理方案
维护用户的有效令牌列表
- 当用户更新令牌时,将旧令牌标记为无效,服务端收到Webhook消息时,先校验请求对应的令牌是否为当前用户的有效令牌,无效则直接返回,不执行回复逻辑。
按Bot令牌隔离消息处理逻辑
- 为每个Bot令牌维护独立的处理实例,确保回复消息时使用对应的Bot令牌调用Telegram API,避免用新令牌处理旧Bot的消息。
清理旧Bot的Webhook并确认生效
- 调用
delete_webhook()时,加上drop_pending_updates=True参数,让Telegram丢弃旧Bot的未处理消息队列,避免这些消息后续推送到服务端引发错误。修改后的代码示例:telegram_output_obj = TelegramOutput(access_token=old_access_token) telegram_output_obj.delete_webhook(drop_pending_updates=True) telegram_output_obj.log_out() telegram_output_obj.close()
- 调用
内容的提问来源于stack exchange,提问作者Anoop Sharma
相关产品推荐
相关产品推荐

