discord.py中Slash Commands触发Interaction Failed错误如何解决
问题成因
- 代码结构逻辑错误:你将实际的命令执行逻辑写在了
_ping函数的嵌套内部函数command_hi中,外层函数没有主动调用该内部函数,首次触发可能是缓存临时命中,第二次触发时没有对应逻辑响应交互,直接触发交互失效报错。 - 斜杠命令写法混用:discord.py v2.0+ 版本的斜杠命令使用
discord.Interaction作为交互载体,你用了前缀命令的ctx上下文参数写法,同时内部函数和外部函数重复定义ctx参数,导致上下文被覆盖失效。 - 交互响应规则冲突:discord斜杠命令的初始交互有效期仅为3秒,就算调用
defer()延迟响应,后续也不能重复调用交互响应方法,同一个交互只能响应一次,重复响应也会触发报错。 - 命令同步冲突:如果同时同步了重名的全局斜杠命令和公会测试斜杠命令,会导致第二次触发时路由匹配错误,找不到对应的执行逻辑。
修复方案
- 首先升级discord.py到2.0及以上正式版本,旧版本对斜杠命令的支持存在大量兼容性问题。
- 修正命令定义逻辑,不要嵌套定义命令函数,按照斜杠命令标准写法注册命令,示例代码如下:
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令牌")
- 清理重复的命令同步记录,如果之前同时同步过全局和公会的重名命令,先执行清空操作再重新同步:
- 清空指定公会命令:
await cmd_tree.clear_commands(guild=discord.Object(id=你的公会ID)) - 清空全局命令:
await cmd_tree.clear_commands()
- 清空指定公会命令:
内容的提问来源于stack exchange,提问作者Justnoob
相关产品推荐
相关产品推荐

