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

Pycord机器人同步命令触发KeyError: default_permission问题求助

解决Discord机器人KeyError: 'default_permission'及自定义HelpCommand失效问题

一、错误核心原因

bot.sync_commands()执行时,Discord API要求命令对象必须包含default_permission字段,你的问题大概率是以下情况之一:

  • 部分斜杠命令的权限配置未明确设置该字段
  • 所用Discord.py版本与命令定义不兼容(旧版本不会自动填充该字段)
  • 自定义SupremeHelpCommand的逻辑破坏了命令的元数据结构

二、分步排查与解决

1. 检查cogs中的斜杠命令定义

打开cogs/moderation.py,查看所有用@app_commands.command()装饰的命令:

  • 如果手动配置权限,必须明确加上@app_commands.default_permissions()装饰器,比如:
@app_commands.command(name="kick", description="踢出指定成员")
@app_commands.default_permissions(kick_members=True)  # 必须明确设置
@app_commands.checks.has_permission(kick_members=True)
async def kick(self, interaction: discord.Interaction, member: discord.Member, reason: str = "无"):
    # 命令逻辑代码
  • 别混用旧的权限设置方式,比如同时手动修改命令的permissions属性

2. 升级Discord.py到稳定版

旧版本Discord.py处理斜杠命令同步时,不会自动为命令添加默认的default_permission字段,直接升级即可:

pip install --upgrade discord.py

3. 排查自定义SupremeHelpCommand的问题

打开classes/help.py:

  • 别在HelpCommand逻辑里直接修改命令的__dict__或元数据字段
  • 如果需要读取命令权限,用官方API(比如command.default_permission),别直接访问字典键

4. 定位问题命令(调试用)

在调用bot.sync_commands()前,加一段代码遍历所有命令,找出缺字段的那个:

for command in bot.tree.walk_commands():
    if not hasattr(command, 'default_permission'):
        print(f"问题命令:{command.name} 缺少default_permission字段")

找到后针对性修复该命令的定义就行。

5. 修正同步命令的调用

确保用官方标准同步方式,别手动修改同步时的命令数据:

# 正确写法
await bot.tree.sync()

三、测试验证

  1. 先注释掉自定义HelpCommand,单独跑bot.sync_commands(),确认同步正常
  2. 同步成功后,再逐步恢复HelpCommand的逻辑,排查是否是它导致的干扰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:52:07