Pyrogram如何获取离线期间的更新?(非机器人账号)
解决Pyrogram用户账号重启后无法获取离线更新的问题
Pyrogram针对用户账号(非机器人)的离线更新获取,提供了对应API方法来处理,核心是基于Telegram的updates.getDifference机制,Pyrogram将其封装为get_updates_difference()方法,具体实现步骤如下:
1. 保存客户端停止前的更新状态
在关闭客户端前,需要获取当前的更新状态并持久化存储(比如数据库或本地文件),避免重启后丢失更新基准:
from pyrogram import Client import json app = Client("my_account") async def save_update_state(): # 获取当前更新状态 state = await app.get_updates_state() # 将状态字段写入本地文件(生产环境建议用数据库) with open("update_state.json", "w") as f: json.dump({ "pts": state.pts, "date": state.date, "qts": state.qts, "seq": state.seq }, f) # 关闭客户端前执行状态保存 await save_update_state() await app.stop()
2. 重启客户端后拉取离线更新
重启客户端时,读取之前保存的状态,调用get_updates_difference()获取离线期间的所有更新,再按业务逻辑处理:
from pyrogram import Client import json app = Client("my_account") async def load_update_state(): # 读取之前保存的更新状态 with open("update_state.json", "r") as f: return json.load(f) async def fetch_offline_updates(): saved_state = await load_update_state() # 获取离线期间的更新差异 updates_diff = await app.get_updates_difference( pts=saved_state["pts"], date=saved_state["date"], qts=saved_state["qts"] ) # 遍历并处理所有离线更新 for update in updates_diff.updates: # 示例:处理新消息更新 if hasattr(update, "message"): msg = update.message # 这里复用你之前的逻辑,将消息保存到数据库 print(f"离线消息:{msg.chat.id} - {msg.text}") # 更新并保存最新状态,避免重复获取 new_state = await app.get_updates_state() with open("update_state.json", "w") as f: json.dump({ "pts": new_state.pts, "date": new_state.date, "qts": new_state.qts, "seq": new_state.seq }, f) async def main(): await app.start() # 先拉取离线更新 await fetch_offline_updates() # 启动常规更新监听 await app.idle() app.run(main())
关键注意事项
- 状态存储需可靠:如果保存的状态丢失,可能导致重复获取或遗漏更新,生产环境优先用数据库而非本地文件。
get_updates_difference()返回的UpdatesDifference包含所有类型的离线更新(消息、聊天状态、联系人变更等),需根据业务需求针对性处理。- 不要依赖
skip_updates参数:该参数仅针对机器人账号设计,对用户账号的离线更新获取无效。
内容的提问来源于stack exchange,提问作者EBRAHIM
相关产品推荐
相关产品推荐

