基于JSON存储的Discord Python Bot玩家昵称管理命令问题求解
修复说明
问题1:带空格昵称拆分处理
原代码使用*args接收参数时,discord.py默认按空格拆分输入内容,导致带空格的昵称被拆分为多个条目,两种适配方案可选:
- 保留批量添加能力:用户输入带空格的昵称时用双引号包裹即可,如
!add "张三 测试" "李四 测试",框架原生支持引号内内容识别为单个参数,无需修改代码逻辑 - 单条命令仅添加1个昵称:将参数改为
*, name: str,命令后所有内容会自动合并为单个字符串,无需用户额外加引号
问题2:列表输出格式化
改用Discord Embed组件排版,昵称逐行展示,同时修复原代码隐含问题:
- 修正删除命令触发词,支持输入
!delete调用 - 替换占用Python内置关键字的
list变量名 - 新增昵称不存在的异常捕获,避免删除操作时Bot崩溃
- 新增列表为空时的友好提示
- 新增启动时
list.json不存在的初始化逻辑,避免首次运行报错
完整修改后代码
import json import os import discord from discord.ext import commands # 配置命令前缀,开启消息内容意图(discord.py v2.x 版本必须开启) intents = discord.Intents.default() intents.message_content = True bot = commands.Bot(command_prefix='!', intents=intents) # 启动时初始化数据文件 @bot.event async def on_ready(): if not os.path.exists('list.json'): with open('list.json', 'w', encoding='utf-8') as f: json.dump([], f, ensure_ascii=False, indent=2) print(f'Bot已登录:{bot.user}') @bot.command(name='delete') async def delete_nick(ctx, *args): with open('list.json', 'r', encoding='utf-8') as f: nick_list = json.load(f) failed = [] for name in args: try: nick_list.remove(name) except ValueError: failed.append(name) with open('list.json', 'w', encoding='utf-8') as f: json.dump(nick_list, f, ensure_ascii=False, indent=2) msg = "✅ 昵称删除完成" if failed: msg += f"\n❌ 以下昵称不存在:{', '.join(failed)}" await ctx.send(msg) @bot.command(name='add') async def add_nick(ctx, *args): # 若要改为单条命令仅加1个昵称,把上面的参数改为 *, name: str,去掉for循环直接添加name即可 with open('list.json', 'r', encoding='utf-8') as f: nick_list = json.load(f) for name in args: nick_list.append(name) with open('list.json', 'w', encoding='utf-8') as f: json.dump(nick_list, f, ensure_ascii=False, indent=2) await ctx.send(f"✅ 成功添加 {len(args)} 个昵称") @bot.command(name='list') async def list_nick(ctx): with open('list.json', 'r', encoding='utf-8') as f: nick_list = json.load(f) if not nick_list: await ctx.send("📋 当前昵称列表为空") return # 构造Embed格式化输出 embed = discord.Embed(title="📋 昵称列表", color=discord.Color.blue()) content = '\n'.join([f"- {nick}" for nick in nick_list]) embed.description = content await ctx.send(embed=embed) bot.run("MY TOKEN HERE")
注意:如果你使用的是discord.py 2.x及以上版本,需要在Discord开发者后台的Bot设置里开启
Message Content Intent权限,否则命令无法正常触发。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

