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

如何在discord.py中实现用户黑白名单管理及命令拦截反馈

实现discord.py的黑白名单功能

黑名单功能实现

基础准备

先初始化机器人,用列表临时存储黑名单用户ID(重启后会清空,后面附持久化方法):

import discord
from discord.ext import commands

# 开启必要权限,v2.x版本必需
intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix="!", intents=intents)

# 临时存储黑名单用户ID
blacklist = []

添加黑名单命令

只有管理员能执行这个命令:

@bot.command()
@commands.has_permissions(administrator=True)
async def add_blacklist(ctx, user: discord.User):
    if user.id not in blacklist:
        blacklist.append(user.id)
        await ctx.send(f"已把 {user.mention} 加入黑名单")
    else:
        await ctx.send(f"{user.mention} 本来就在黑名单里")

移除黑名单命令

同样限制管理员权限:

@bot.command()
@commands.has_permissions(administrator=True)
async def remove_blacklist(ctx, user: discord.User):
    if user.id in blacklist:
        blacklist.remove(user.id)
        await ctx.send(f"已把 {user.mention} 移出黑名单")
    else:
        await ctx.send(f"{user.mention} 不在黑名单里")

拦截黑名单用户用命令

用全局检查器,所有命令都会触发这个检查:

def check_blacklist():
    async def predicate(ctx):
        if ctx.author.id in blacklist:
            await ctx.send("你被拉黑了,没法用命令")
            return False
        return True
    return commands.check(predicate)

# 给所有命令绑定这个检查,也可以单独给特定命令加@check_blacklist()
bot.check(check_blacklist())

持久化黑名单(可选)

想要重启机器人后保留黑名单,用JSON文件存数据:

import json

# 加载黑名单
def load_blacklist():
    try:
        with open("blacklist.json", "r") as f:
            return json.load(f)
    except FileNotFoundError:
        return []

# 保存黑名单
def save_blacklist():
    with open("blacklist.json", "w") as f:
        json.dump(blacklist, f)

# 初始化时加载数据
blacklist = load_blacklist()

# 修改add和remove命令,添加保存操作:
@bot.command()
@commands.has_permissions(administrator=True)
async def add_blacklist(ctx, user: discord.User):
    if user.id not in blacklist:
        blacklist.append(user.id)
        save_blacklist()
        await ctx.send(f"已把 {user.mention} 加入黑名单")
    else:
        await ctx.send(f"{user.mention} 本来就在黑名单里")

@bot.command()
@commands.has_permissions(administrator=True)
async def remove_blacklist(ctx, user: discord.User):
    if user.id in blacklist:
        blacklist.remove(user.id)
        save_blacklist()
        await ctx.send(f"已把 {user.mention} 移出黑名单")
    else:
        await ctx.send(f"{user.mention} 不在黑名单里")

白名单功能实现

白名单逻辑和黑名单相反:只有白名单内的用户能使用命令,其他人触发命令会被拦截。

基础准备

# 临时存储白名单用户ID
whitelist = []

添加/移除白名单命令

@bot.command()
@commands.has_permissions(administrator=True)
async def add_whitelist(ctx, user: discord.User):
    if user.id not in whitelist:
        whitelist.append(user.id)
        await ctx.send(f"已把 {user.mention} 加入白名单")
    else:
        await ctx.send(f"{user.mention} 本来就在白名单里")

@bot.command()
@commands.has_permissions(administrator=True)
async def remove_whitelist(ctx, user: discord.User):
    if user.id in whitelist:
        whitelist.remove(user.id)
        await ctx.send(f"已把 {user.mention} 移出白名单")
    else:
        await ctx.send(f"{user.mention} 不在白名单里")

拦截非白名单用户用命令

全局检查器:

def check_whitelist():
    async def predicate(ctx):
        if ctx.author.id not in whitelist:
            await ctx.send("你不在白名单里,没法用命令")
            return False
        return True
    return commands.check(predicate)

bot.check(check_whitelist())

持久化白名单(可选)

和黑名单的持久化逻辑一样,复制load、save函数,把变量改成whitelist即可。

注意:黑白名单不要同时用全局检查器,否则逻辑冲突,根据需求二选一,或者给不同命令单独绑定检查器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:47:45