如何用Telethon获取聊天消息且不请求用户实体以规避WaitFloodError
解决Telethon获取消息时因请求发送者实体触发WaitFloodError的问题
Telethon默认会自动解析并缓存消息关联的发送者/聊天实体,这就是你会话文件中出现大量用户实体、进而触发WaitFloodError的原因。要只获取消息本身信息、避免触发用户信息请求,可以通过以下两种方式实现:
方法一:使用底层API请求(推荐)
直接调用Telethon的底层GetHistory接口,绕过自动实体解析逻辑:
from telethon import raw # 发起底层历史消息请求 result = await client(raw.functions.messages.GetHistory( peer=my_channel, offset_id=offset_id, offset_date=None, add_offset=0, limit=limit, max_id=0, min_id=0, hash=0 )) # 提取仅需要的消息字段(避免访问sender/from_id等会触发解析的属性) target_messages = [] for msg in result.messages: if isinstance(msg, raw.types.Message): target_messages.append({ "id": msg.id, "content": msg.message, "send_time": msg.date, # 按需添加其他非实体关联字段 })
方法二:临时禁用自动实体解析
通过临时替换客户端的_resolve_peer方法,阻止自动解析实体:
# 保存原始解析方法 original_resolve = client._resolve_peer # 替换为直接返回输入的方法,跳过解析 client._resolve_peer = lambda x: x try: # 正常调用get_messages messages = await client.get_messages( entity=my_channel, offset_id=offset_id, limit=limit ) # 处理消息时仅访问非实体字段,如id、message、date等 finally: # 恢复原始方法,避免影响后续操作 client._resolve_peer = original_resolve
注意事项
- 处理消息时,绝对不要访问
sender、from_id、chat等关联实体的属性,否则会触发延迟解析,仍可能导致限流。 - 底层API返回的消息结构是Telethon的原始类型,需要自行判断类型并提取字段。
内容的提问来源于stack exchange,提问作者temp705
相关产品推荐
相关产品推荐

