Disnake中如何删除临时(ephemeral)交互响应?
无法删除Discord机器人发送的临时(Ephemeral)消息
我开发了一个支持用户通过斜杠命令玩游戏的Discord机器人,机器人会发送临时(ephemeral)消息。为保持界面整洁,我希望在特定场景下(比如用户数分钟未响应)删除这些响应,但目前无法成功删除临时消息。
发送临时消息的代码:
await inter.send(file=file, embed=embed, components=components, ephemeral=True)
当ephemeral=False时,用下面的代码可以成功删除机器人的响应:
await inter.delete_original_message()
但当ephemeral=True时,执行上述删除代码会抛出以下错误:
Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/disnake/ext/commands/slash_core.py", line 680, in invoke await call_param_func(self.callback, inter, self.cog, **kwargs) File "/usr/local/lib/python3.8/site-packages/disnake/ext/commands/params.py", line 817, in call_param_func return await maybe_coroutine(safe_call, function, **kwargs) File "/usr/local/lib/python3.8/site-packages/disnake/utils.py", line 580, in maybe_coroutine return await value File "/code/cogs/game.py", line 271, in game await game( File "/code/cogs/game.py", line 189, in game await inter.delete_original_message() File "/usr/local/lib/python3.8/site-packages/disnake/interactions/base.py", line 526, in delete_original_message await deleter File "/usr/local/lib/python3.8/site-packages/disnake/webhook/async_.py", line 222, in request raise NotFound(response, data) disnake.errors.NotFound: 404 Not Found (error code: 10008): Unknown Message
另外,尝试设置临时消息的delete_after属性时,也出现了错误:
disnake.ext.commands.errors.CommandInvokeError: Command raised an exception: ValueError: ephemeral messages can not be deleted via endpoints
我猜测这说明Discord不允许通过任何API端点删除临时消息,想确认是否存在其他删除临时消息的方法?
结论
你的猜测完全正确——Discord官方不支持通过API删除临时消息。
临时消息的设计逻辑就是仅对目标用户可见,且Discord的API规则明确禁止通过端点操作删除这类消息,这也是你设置delete_after时直接抛出ValueError的核心原因。
替代方案
如果需要实现“超时清理”的界面整洁效果,可以考虑两种思路:
- 改用普通消息+权限控制:放弃
ephemeral=True,发送普通消息后,通过设置消息的权限(仅目标用户可见)模拟临时消息的效果,之后就能正常使用delete_original_message()或delete_after参数来定时删除消息。 - 引导用户手动关闭:在临时消息中添加提示,告知用户可以点击消息右上角的关闭按钮手动清除这条临时消息。
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

