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

Telethon调用messages.getDialogs时offset_id与offset_peer被忽略问题求助

问题分析与解决方法

你对Telethon对话偏移参数的理解确实存在偏差——offset_id、offset_peer这些参数不是基于消息ID来偏移对话列表的,而是用于指定对话列表分页的起始位置,依赖的是对话本身的排序规则。

核心逻辑说明

Telegram的对话列表默认按对话最后活跃时间(即对话top_message的发送日期)倒序排列。get_dialogs/iter_dialogs的偏移参数作用是:

  • offset_peer:指定从哪个对话之后开始获取下一页
  • offset_date:配合offset_peer,指定该对话的最后活跃日期(用于精确分页)
  • offset_id:这里的ID并非消息ID,而是Telegram内部用于分页的对话标识,通常不需要手动指定,由Telethon自动处理

正确实现代码

要实现从指定对话之后获取后续对话,应该用目标对话的peer和它的top_message日期作为偏移参数:

from telethon import TelegramClient
from typing import List
from telethon.tl.custom import Dialog

async with TelegramClient(...) as client:
    # 获取前20个对话
    dialogs: List[Dialog] = await client.get_dialogs(limit=20)
    if not dialogs:
        return
    
    # 取最后一个对话作为偏移起点
    last_dialog = dialogs[-1]
    # 用该对话的peer和最后消息日期作为偏移参数
    dialogs2 = await client.get_dialogs(
        limit=20,
        offset_peer=last_dialog.peer,
        offset_date=last_dialog.last_message.date if last_dialog.last_message else None
    )
    
    # 此时dialogs2会是dialogs之后的下一页对话

为什么之前的方法无效

你传入的offset_id是消息ID,但Telethon的offset_id参数对应的是对话分页的内部标识,和消息ID完全无关。Telegram服务器会优先根据offset_date和offset_peer来确定分页起点,忽略不符合规则的offset_id值,所以才会每次都返回从头开始的列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:27:09