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

Telegram Bot API:如何停止用户答完投票后webhook重复收消息

核心原因

Telegram Webhook的更新投递遵循成功确认才停止推送规则:只要你的Webhook端点收到更新后,没有返回2xx范围的HTTP成功响应(标准要求返回200状态码+空响应体),服务端就会持续重试投递同一条update_id的更新,哪怕对应投票消息已经被删除,重试流程也不会自动终止。你遇到的固定频率重复推送同一条投票更新,就是典型的Webhook响应不符合规范触发的重试行为,和投票本身的运行状态无关。

立即停止当前重复推送的操作
  • 正确响应重试请求:当你收到update_id为199522750的更新时,直接给Telegram服务端返回HTTP 200状态码、空响应体,服务端会标记该条更新投递成功,立刻停止对应重试。
  • 手动清空未确认更新队列:如果不想逐条响应历史重试请求,可调用getUpdates接口,传入参数offset=199522751(即当前重复更新的ID+1),执行一次即可清空所有积压的未确认更新。注意该操作会临时把更新通道切到长轮询模式,操作完成后需要重新调用setWebhook接口切回Webhook接收模式。
适配私聊投票场景的落地方案

针对你「仅接收一次投票结果就自动停止投票、无其他用户参与」的需求,Webhook处理逻辑按以下规则编写即可:

  1. 所有进入Webhook端点的请求,第一时间返回200 OK空响应,不要等业务逻辑执行完成再返回,从根源避免触发服务端重试。
  2. 解析请求体,如果是poll类型更新,先提取poll.id做本地幂等校验:
    • 若该投票ID未在本地记录过,先持久化对应投票结果,再调用stopPoll接口,传入投票所在的私聊chat_id、投票消息的message_id,主动关闭投票,后续不会再产生该投票的状态更新推送。
    • 若该投票ID已经处理过,直接丢弃请求,不重复执行业务逻辑。

重复推送的更新样例:

{
  "update_id":199522750,
  "poll":{
    "id":"5276163750276104310",
    "question":"Question?",
    "options":[
      {"text":"test1","voter_count":0},
      {"text":"test2","voter_count":1},
      {"text":"test3","voter_count":0}
    ],
    "total_voter_count":1,
    "is_closed":false,
    "is_anonymous":true,
    "type":"regular",
    "allows_multiple_answers":false
  }
}

内容的提问来源于stack exchange,提问作者LeonidMew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:51:44