You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的消息处理逻辑:

  1. 用户更换令牌后,服务端统一使用新Bot的令牌处理所有消息,包括旧Bot推送过来的消息。
  2. 此时新Bot尚未与用户建立会话(用户还没给新Bot发过消息),用新Bot令牌调用API回复旧Bot的消息时,Telegram会判定“找不到对应会话”,触发400错误。
  3. 当用户给新Bot发消息后,会话建立,服务端再用新Bot令牌处理旧消息时就能正常发送回复,所以会一次性收到所有历史消息的回复。

关于stop_polling()的作用

调用stop_polling()完全无法解决这个问题。原因很简单:

  • stop_polling()是专门针对Telegram Bot的长轮询(Polling)模式设计的方法,用于终止服务端主动向Telegram拉取消息的进程。
  • 而你当前使用的是Webhook模式,由Telegram主动将消息推送到你的服务端,不存在服务端主动轮询的进程,所以这个方法对Webhook模式的Bot没有任何影响,更无法终止旧Bot的通信。

有效处理方案

  1. 维护用户的有效令牌列表

    • 当用户更新令牌时,将旧令牌标记为无效,服务端收到Webhook消息时,先校验请求对应的令牌是否为当前用户的有效令牌,无效则直接返回,不执行回复逻辑。
  2. 按Bot令牌隔离消息处理逻辑

    • 为每个Bot令牌维护独立的处理实例,确保回复消息时使用对应的Bot令牌调用Telegram API,避免用新令牌处理旧Bot的消息。
  3. 清理旧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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:30:28