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

如何正确使用Telegram API的getUpdates方法?请求异常排查

解决短轮询重复获取旧消息的可靠方案

你遇到的问题本质是短轮询时没做消息过滤,每次请求都会返回历史消息,导致重复处理最早的几条。浏览器刷新也出现同样问题,说明不是代码逻辑的问题,是请求没有指定只获取新消息。

下面是可靠的解决思路和代码示例:

核心思路:跟踪最后处理的消息ID

不管API是否支持过滤参数,都可以通过本地跟踪消息ID的方式,只处理新消息:

  • 初始化一个变量记录最后处理过的消息ID
  • 每次请求到消息列表后,只筛选ID大于这个记录值的消息
  • 处理完新消息后,更新记录值为最新消息的ID

代码实现示例

import requests
import time

# 初始化最后处理的消息ID,根据你的消息ID类型设初始值(比如0/空字符串)
last_processed_id = 0

def get_new_messages():
    global last_processed_id
    # 替换成你的实际消息API地址
    resp = requests.get("https://your-message-api-endpoint.com/messages")
    if resp.status_code != 200:
        return []
    
    all_messages = resp.json()
    # 过滤出未处理过的新消息
    new_messages = [msg for msg in all_messages if msg["id"] > last_processed_id]
    
    if new_messages:
        # 更新最后处理的ID为最新消息的ID
        last_processed_id = max(msg["id"] for msg in new_messages)
    
    return new_messages

def handle_message(msg):
    content = msg["content"]
    if content.startswith("say "):
        # 提取并输出指定内容
        print(content[4:])

# 持续监听
while True:
    for message in get_new_messages():
        handle_message(message)
    # 设置合理的轮询间隔,避免给服务器造成压力
    time.sleep(1)

优化建议

如果你的消息API支持since_id(或类似命名的参数,比如after_id),直接把last_processed_id作为参数传给API,服务器会直接返回该ID之后的新消息,这样能减少数据传输量,效率更高:

# 修改get_new_messages函数里的请求部分
params = {"since_id": last_processed_id}
resp = requests.get("https://your-message-api-endpoint.com/messages", params=params)

这个方案完全不需要依赖不可靠的短sleep,通过消息ID精准控制只处理新消息,彻底解决重复获取旧消息的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:55:20