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

discord.py中Slash Commands触发Interaction Failed错误如何解决

问题成因
  • 代码结构逻辑错误:你将实际的命令执行逻辑写在了_ping函数的嵌套内部函数command_hi中,外层函数没有主动调用该内部函数,首次触发可能是缓存临时命中,第二次触发时没有对应逻辑响应交互,直接触发交互失效报错。
  • 斜杠命令写法混用:discord.py v2.0+ 版本的斜杠命令使用discord.Interaction作为交互载体,你用了前缀命令的ctx上下文参数写法,同时内部函数和外部函数重复定义ctx参数,导致上下文被覆盖失效。
  • 交互响应规则冲突:discord斜杠命令的初始交互有效期仅为3秒,就算调用defer()延迟响应,后续也不能重复调用交互响应方法,同一个交互只能响应一次,重复响应也会触发报错。
  • 命令同步冲突:如果同时同步了重名的全局斜杠命令和公会测试斜杠命令,会导致第二次触发时路由匹配错误,找不到对应的执行逻辑。
修复方案
  1. 首先升级discord.py到2.0及以上正式版本,旧版本对斜杠命令的支持存在大量兼容性问题。
  2. 修正命令定义逻辑,不要嵌套定义命令函数,按照斜杠命令标准写法注册命令,示例代码如下:
import discord
from discord import app_commands

# 初始化实例时确保开启必要的意图
intents = discord.Intents.default()
bot = discord.Client(intents=intents)
# 初始化命令树
cmd_tree = app_commands.CommandTree(bot)

# 注册ping斜杠命令
@cmd_tree.command(name="ping", description="返回Pong测试响应")
async def ping(interaction: discord.Interaction):
    # 若需要延迟处理先调用defer,ephemeral参数设为True则响应仅触发命令的用户可见
    await interaction.response.defer(ephemeral=False)
    # defer之后使用followup发送后续内容,不要重复调用interaction.response下的方法
    await interaction.followup.send(content="Pong!")

# bot启动时同步命令,测试环境建议同步到指定公会,生效速度更快
@bot.event
async def on_ready():
    # 同步到指定测试公会,替换为你的公会ID
    test_guild = discord.Object(id=123456789)
    await cmd_tree.sync(guild=test_guild)
    # 若需要同步全局命令,取消注释下行即可,全局命令同步最长需要1小时生效
    # await cmd_tree.sync()
    print(f"已登录为 {bot.user}")

bot.run("你的bot令牌")
  1. 清理重复的命令同步记录,如果之前同时同步过全局和公会的重名命令,先执行清空操作再重新同步:
    • 清空指定公会命令:await cmd_tree.clear_commands(guild=discord.Object(id=你的公会ID))
    • 清空全局命令:await cmd_tree.clear_commands()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:54:04