discord.py斜杠命令运行长耗时函数时提示"This interaction failed"问题求解
问题根因
Discord 斜杠命令基于交互协议设计,所有交互必须在触发后3秒内得到首次响应,否则Discord会直接判定该交互执行失败,展示"This interaction failed"提示。
你遇到的两种场景触发的是同一个问题:
- 20秒长耗时函数:3秒内没有给Discord返回任何响应,触发超时判定
- 断点调试:打断点后程序暂停运行,超过3秒没有返回响应,同样触发超时
普通非斜杠前缀命令没有这套交互超时规则,只要最终消息能发出去就不会有报错提示,所以运行正常。
修复方案
只需要在斜杠命令函数最开始先调用defer()方法延迟响应即可,该操作会告知Discord当前命令需要更长时间处理,会先给用户展示「Bot is thinking...」的加载状态,同时将响应时限延长到15分钟,完全覆盖20秒的耗时需求。
等你的长耗时逻辑执行完成后,再正常调用send()方法返回最终结果即可。
代码示例
@slash.slash(name="test", guild_ids=[123,456], description="This is just a test command, nothing more.", options=[ create_option( name="optone", description="This is the first option we have.", option_type=3, required=False ) ]) async def test(ctx, optone: str): # 先延迟响应,必须放在所有耗时逻辑前 await ctx.defer() # 这里放你的20秒长耗时逻辑 # long_time_task() # 耗时逻辑执行完后发送最终结果 await ctx.send(content=f"I got you, you said {optone}!")
如果需要最终返回的结果仅命令触发者可见,可以在defer时添加参数:await ctx.defer(ephemeral=True),后续send的内容也会仅该用户可见。
内容的提问来源于stack exchange,提问作者August Williams
相关产品推荐
相关产品推荐

