如何通过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
相关产品推荐
相关产品推荐

