get_chat_history与get_chat_members方法持续触发FloodWait错误求助
问题排查与解决方案
1. 异步代码误用同步sleep
你的异步上下文里用了同步的sleep(Err.value),这会阻塞整个事件循环,导致等待逻辑完全失效,Telegram的限流判断不会因为这种同步等待而解除。必须替换为异步等待:
import asyncio # 替换原代码中的sleep(Err.value) await asyncio.sleep(Err.value)
2. 主动添加请求冷却,降低调用频率
get_chat_members和get_chat_history是Telegram严格限流的接口,即使处理了单次FloodWait,短时间内连续请求仍会触发重复限制。建议在每次成功请求后主动添加1-2秒的异步延迟:
# 示例:获取成员后添加冷却 async for members in tg_cl.get_chat_members(target): members_chat.append(members) break await asyncio.sleep(1.5)
3. 复用客户端连接,避免频繁初始化
你的代码每次操作都用async with tg_cl:重新创建客户端连接,频繁的连接建立会提升账号风险评分,更容易触发限流。建议全局初始化一次客户端,后续所有操作复用该实例:
# 全局初始化客户端 tg_cl = TelegramClient(...) await tg_cl.start() # 复用实例执行操作 try: async for members in tg_cl.get_chat_members(target): members_chat.append(members) break except FloodWait as Err: print(f"Flood wait: {Err.value} seconds") await asyncio.sleep(Err.value)
4. 检查账号与IP状态
- 确认账号是否有批量加群、频繁拉取成员等异常操作记录,若账号被Telegram标记为可疑,限流会持续收紧,建议暂停操作12-24小时后再测试。
- 检查当前IP是否属于共享IP池(如公共VPS、批量代理IP),若该IP上存在大量Telegram请求,会被全局限流,建议更换专属IP或切换网络环境。
5. 修正接口调用逻辑
- 对于
get_chat_members:若仅需少量成员,直接用limit参数指定数量,避免不必要的分页请求:
async for members in tg_cl.get_chat_members(target, limit=1): members_chat.append(members)
- 对于
get_chat_history:offset_id=-1的用法可能不符合你所用库(如Telethon)的规范,若仅需最新一条消息,直接使用limit=1即可:
async for messages in tg_cl.get_chat_history(chat, limit=1): count_messages = messages.id
内容的提问来源于stack exchange,提问作者listcool
相关产品推荐
相关产品推荐

