Discord.py如何实现服务器白名单增删命令及JSON存储
Discord 机器人白名单命令及持久化实现方案
1. 前置依赖调整
原有使用discord.Client的逻辑改为discord.ext.commands.Bot来更方便处理前缀命令,同时必须开启消息内容意图,否则命令无法触发也不会报错。
2. JSON白名单持久化实现
首先在项目根目录创建whitelist.json文件,写入初始白名单内容:
[ 878537556332015626, 884958773913985054, 869615568838357052 ]
编写JSON读写逻辑,替换原有硬编码白名单:
import json import discord from discord.ext import commands # 读取白名单文件 def load_whitelist(): with open("whitelist.json", "r", encoding="utf-8") as f: return json.load(f) # 写入白名单文件 def save_whitelist(whitelist_data): with open("whitelist.json", "w", encoding="utf-8") as f: json.dump(whitelist_data, f, indent=4, ensure_ascii=False) # 配置机器人意图 intents = discord.Intents.default() intents.message_content = True # 必须在Discord开发者后台开启Message Content Intent权限 intents.guilds = True # 初始化机器人实例 client = commands.Bot(command_prefix=";", intents=intents, help_command=None) # 全局加载白名单 whitelist = load_whitelist()
3. 原有自动退服逻辑适配
@client.event async def on_guild_join(guild): if guild.id not in whitelist: await guild.leave()
4. 自定义命令实现
默认仅机器人所有者可执行命令,避免滥用:
# 添加白名单命令 @client.command() @commands.is_owner() async def addserver(ctx, guild_id: int): if guild_id in whitelist: await ctx.send(f"服务器 `{guild_id}` 已存在于白名单") return whitelist.append(guild_id) save_whitelist(whitelist) await ctx.send(f"已成功将服务器 `{guild_id}` 加入白名单") # 移除白名单命令 @client.command() @commands.is_owner() async def removeserver(ctx, guild_id: int): if guild_id not in whitelist: await ctx.send(f"服务器 `{guild_id}` 不在白名单内") return whitelist.remove(guild_id) save_whitelist(whitelist) await ctx.send(f"已成功将服务器 `{guild_id}` 移出白名单") # 命令错误处理 @addserver.error @removeserver.error async def cmd_error_handler(ctx, error): if isinstance(error, commands.NotOwner): await ctx.send("你没有权限执行该操作") elif isinstance(error, commands.MissingRequiredArgument): await ctx.send("请输入要操作的服务器ID,示例:`;addserver 1234567890`") elif isinstance(error, commands.BadArgument): await ctx.send("服务器ID必须为纯数字格式")
注意事项
- 必须登录Discord开发者平台,进入对应机器人的「Bot」设置页,开启Message Content Intent开关,否则机器人无法识别消息中的前缀命令,是无报错无响应的核心原因
- 机器人在执行命令的服务器内需要拥有发送消息的权限,否则不会有命令执行反馈
- 如需放开权限给所有人使用命令,删除
@commands.is_owner()装饰器即可,不建议该操作
内容的提问来源于stack exchange,提问作者Ex Dev
相关产品推荐
相关产品推荐

