Telethon模块FloodWaitError问题求助及优化方案咨询
- 改用多会话池(Multi-Session)
Telegram的限流是按单个账号(session)维度管控的,单账号的请求上限存在明显瓶颈。可以搭建多个Telegram会话(使用不同的API ID/哈希,或者多个小号),通过轮询机制分散请求压力:维护一个会话队列,每次请求从队列头部取出闲置会话,请求完成后放回队列尾部;如果某会话触发FloodWaitError,则暂时将其移出队列,等待足够时间后再放回。
示例代码:
from collections import deque import time import random from telethon.errors import FloodWaitError # 初始化会话池 session_pool = deque([session1, session2, session3]) def get_available_session(): return session_pool.popleft() def release_session(session): session_pool.append(session) # 校验逻辑示例 def check_group_url(url): while True: session = get_available_session() try: chat = session.get_entity(url) # 处理校验结果(比如更新数据库逻辑) release_session(session) return chat except FloodWaitError as e: # 严格等待官方要求时间+额外随机延迟 wait_time = e.seconds + random.randint(1, 3) time.sleep(wait_time) # 等待后放回会话池 release_session(session)
动态调整延迟策略,结合实际请求反馈
不要固定使用单一的指数分布延迟,而是根据请求的实际响应动态调整:如果连续3次请求都未触发限流,可逐步降低延迟(比如每次减少0.2秒);如果遇到一次FloodWaitError,后续5次请求都将延迟加倍;同时,将指数延迟的基数调高(比如从0.8秒起步,而非0.2秒),避免短时间内密集发起请求。采用批量请求减少调用次数
Telegram部分API支持批量操作,比如使用get_chats接口批量查询多个群组的状态,或者一次性提交多个群组URL进行校验(如果业务逻辑允许),大幅降低请求频率。比如原本需要100次单个请求,改成1次批量请求,直接减少99%的触发限流概率。异步优化数据库操作
如果脚本中数据库同步写入操作耗时较长,会导致请求间隔波动,反而容易触发限流。可以将校验结果缓存到内存队列中,攒够50条(或根据实际情况调整)后,一次性异步写入数据库,保证请求间隔的均匀性,避免因DB阻塞导致的突发请求密集。严格遵守FloodWait等待规则,避免提前重试
遇到FloodWaitError时,必须确保等待时间不短于官方返回的e.seconds,再追加1-3秒的随机缓冲时间;同时,在等待后的3次请求中主动增大延迟,避免再次触发限流。绝对不要在官方要求的等待时间未到就重试,否则会导致限流惩罚升级。实现请求频率监控与预警
为每个会话维护请求计数器,统计每分钟的请求次数。当计数达到Telegram限流阈值的80%(普通账号单接口大概30-60次/分钟,可根据实际测试调整)时,主动将延迟增大至原来的1.5倍;当计数超过阈值时,暂停该会话的请求,等待1分钟后再恢复。
内容的提问来源于stack exchange,提问作者ephedan

