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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:41:10