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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:57:03