如何正确使用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
相关产品推荐
相关产品推荐

