如何捕获SendMultiMediaRequest引发的61秒等待异常?
捕获SendMultiMediaRequest触发的“A wait of 61 seconds is required”异常
我需要捕获由SendMultiMediaRequest引发的“A wait of 61 seconds is required”异常,但官方文档里找不到相关说明。实际场景中,给部分用户发送图片时会出现这个错误;整体发送流程正常,但部分本应可以接收消息的用户会抛出通用Exception异常,我需要精准追踪这个异常。
我的代码如下:
from telethon import TelegramClient, errors client = TelegramClient('session', api_id=API_ID, api_hash=API_HASH) message = "Hello" files = ['img/11.jpg', 'img/22.jpg', 'img/33.jpg', 'img/44.jpg', 'img/55.jpg'] async def main(): for user in db.get_users(name_table=table): try: if db.check_invited(name_table=table, user_name=user) != "TRUE": await client.send_message(entity=user, message=message, file=files) print('Ok') except errors.BadRequestError as e: print(e) except Exception as e: print(e)
解决方案
这个错误是Telegram的限流机制触发的,属于errors.FloodWaitError的范畴,可通过以下方式精准捕获:
优先捕获官方定义的限流异常
FloodWaitError是Telethon专门用于处理限流等待的异常类,包含seconds属性可直接获取需要等待的时长,是最规范的处理方式。文本匹配兜底
如果遇到版本兼容问题导致FloodWaitError未被触发,可在通用Exception中匹配错误文本做兜底处理。
修改后的代码:
from telethon import TelegramClient, errors import asyncio client = TelegramClient('session', api_id=API_ID, api_hash=API_HASH) message = "Hello" files = ['img/11.jpg', 'img/22.jpg', 'img/33.jpg', 'img/44.jpg', 'img/55.jpg'] async def main(): for user in db.get_users(name_table=table): try: if db.check_invited(name_table=table, user_name=user) != "TRUE": await client.send_message(entity=user, message=message, file=files) print('Ok') except errors.BadRequestError as e: print(f"请求错误: {e}") except errors.FloodWaitError as e: print(f"触发限流,需等待{e.seconds}秒") # 可选:自动等待后重试 await asyncio.sleep(e.seconds) # 重试逻辑可根据需求添加 except Exception as e: error_msg = str(e) if "A wait of 61 seconds is required" in error_msg: print("触发61秒限流:", error_msg) # 自定义处理逻辑 else: print("未知异常:", error_msg)
说明
- 优先使用
FloodWaitError捕获,能直接获取等待时长,便于后续自动重试或提示 - 文本匹配作为兜底,应对特殊版本下的异常封装差异
- 捕获到限流后建议添加等待逻辑,避免重复触发限制导致更严重的封禁
内容的提问来源于stack exchange,提问作者Сергей Викторович
相关产品推荐
相关产品推荐

