Python使用telebot API遇403用户封禁错误无法捕获如何解决
问题根源
- 你使用的pyTelegramBotAPI框架的异常类名称错误,403错误对应的异常不是
TelegramResponseException,而是telebot.apihelper.ApiTelegramException - 你在消息处理函数中直接使用
time.sleep(20)阻塞了主线程,单个请求的阻塞/报错会卡住所有后续用户的请求,这才是机器人无法响应其他用户的核心原因 - 异常捕获顺序错误,你将通用
Exception放在了AssertionError前面,就算触发断言也会被前面的通用异常捕获,走不到你写的断言处理逻辑
解决方案
1. 启用异步线程处理请求
调用tb.polling时增加threaded=True参数,让每个用户的请求在独立线程中处理,单个请求的报错/延迟不会影响其他用户的请求。
2. 正确捕获用户拉黑的403异常
捕获ApiTelegramException后判断错误码是否为403,同时匹配错误描述即可确认用户已拉黑机器人,可将这类用户ID存入黑名单列表,后续避免再向其发送消息。
3. 调整异常捕获顺序
将具体异常放在捕获逻辑前方,通用Exception放在最后,避免具体异常被提前拦截。
修正后代码
import telebot import time # 替换为你的机器人Token tb = telebot.TeleBot("YOUR_BOT_TOKEN") # 全局黑名单存储已拉黑用户的ID,生产环境可存入数据库持久化 blocked_users = set() @tb.message_handler(func=lambda m: True) def echo_all(message): user_id = message.from_user.id # 提前判断用户是否在黑名单,是则直接跳过处理 if user_id in blocked_users: return try: time.sleep(20) # 你的延迟逻辑 ret_msg = tb.reply_to(message, "response message") print(ret_msg) assert ret_msg.content_type == 'text' except telebot.apihelper.ApiTelegramException as e: # 判断是否为用户拉黑的403错误 if e.error_code == 403 and "bot was blocked by the user" in e.description: print(f"用户{user_id}已拉黑机器人,加入黑名单") blocked_users.add(user_id) else: print(f"接口请求异常:{e}") except AssertionError: print( "!!!!!!! 消息类型校验失败 !!!!!!!" ) except Exception as e: print(f"通用异常:{e}") # 开启线程模式,避免单请求阻塞全局 tb.polling(none_stop=True, timeout=123, threaded=True)
补充说明
- 生产环境下黑名单建议存入Redis、MySQL等持久化存储,避免机器人重启后黑名单数据丢失
- 如果需要提前判断用户是否拉黑机器人,可以在发消息前调用
tb.get_chat(用户ID)接口,如果返回403同样说明用户已拉黑,可提前加入黑名单 - 所有调用机器人主动发消息的接口(
send_message、reply_to、send_photo等)都需要加上对应的403异常捕获,避免遗漏报错
内容的提问来源于stack exchange,提问作者Ehsan
相关产品推荐
相关产品推荐

