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

