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
相关产品推荐
相关产品推荐

