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

如何通过Telegram Bot API阻止特定用户,避免接收其请求?

如何让Telegram Bot直接忽略特定用户请求(避免数据库校验崩溃)

核心思路

把黑名单用户放在快速访问的内存层,在请求处理的最早期拦截,直接丢弃请求,完全不进入后续业务逻辑,彻底避免数据库查询拖垮Bot的问题。

可行方案

1. 内存黑名单+框架中间件拦截(推荐)

用内存集合(或Redis)存储黑名单用户ID,查询速度为O(1),比数据库快几个数量级。然后在Bot的请求入口添加拦截逻辑,比如用主流Bot框架的中间件:

以Python的python-telegram-bot为例:

from telegram import Update
from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler

# 内存黑名单,可替换为Redis集合实现持久化
BLACKLIST = {123456789, 987654321}

async def blacklist_filter(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.effective_user.id
    if user_id in BLACKLIST:
        # 直接返回None,终止请求处理流程
        return None
    # 放行正常请求
    return update, context

def main():
    app = ApplicationBuilder().token("YOUR_BOT_TOKEN").build()
    # 把拦截逻辑放在所有处理器最前面
    app.update_queue.middleware.insert(0, blacklist_filter)
    
    # 注册你的业务处理器
    app.add_handler(CommandHandler("start", start_command))
    
    app.run_polling()

如果需要持久化黑名单,把BLACKLIST换成Redis的SISMEMBER查询即可,重启Bot后黑名单不会丢失。

2. Web服务器层面拦截(超大请求量场景)

如果Bot用Webhook模式,可在前端Web服务器(如Nginx)直接拦截黑名单用户的请求,Bot完全不会收到这些请求,性能最优。

需要用Lua脚本解析Telegram Webhook的请求体,检查用户ID:

location /bot-webhook {
    access_by_lua_block {
        local json = require("cjson")
        local request_body = ngx.req.get_body_data()
        local data = json.decode(request_body)
        local user_id = data.message.from.id
        local blacklist = {123456789, 987654321}
        
        for _, id in ipairs(blacklist) do
            if user_id == id then
                ngx.exit(403)
            end
        end
    }
    proxy_pass http://localhost:8000; # 你的Bot服务地址
}

注意事项

  • 内存黑名单如果是本地集合,Bot重启后会丢失,需要定期同步到数据库或用Redis做持久化。
  • 拦截逻辑一定要放在所有业务处理之前,避免无效的资源消耗。

内容的提问来源于stack exchange,提问作者dealing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:42:22