You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:39:00