Python Discord斜杠命令设置ephemeral=True仍发送公开消息问题
Discord斜杠命令ephemeral=True消息仍公开发送排查方案
问题复现代码
await ctx.respond("Test", ephemeral = True)
按照接口规则,设置ephemeral=True后响应应对触发命令的用户单独可见,实际却公开发送到频道,按以下优先级排查解决:
- 检查命令定义与依赖库版本
首先确认你使用的是正确的斜杠命令装饰器:普通前缀命令用@bot.command()装饰时,传入ephemeral参数不会被识别,必须使用对应库的斜杠命令装饰器:- 原生discord.py 2.0+版本使用
@app_commands.command()装饰应用命令,响应调用为await interaction.response.send_message("Test", ephemeral=True) - py-cord/nextcord等分叉库使用
@bot.slash_command()装饰斜杠命令时,ctx.respond()的ephemeral参数才会生效
若你混用了不同Discord机器人库的语法,或者使用2.0以下版本的discord.py,会出现参数无效果的问题,升级到对应库的最新稳定版即可。
- 原生discord.py 2.0+版本使用
- 检查响应时序逻辑
如果你在调用respond()之前已经调用过ctx.defer()做延迟响应,ephemeral属性必须在defer阶段声明,后续respond/followup传入的ephemeral参数不会生效:
错误写法:
正确写法:await ctx.defer() # 未传ephemeral,默认标记为公开响应 await ctx.respond("Test", ephemeral=True) # 此处参数无效await ctx.defer(ephemeral=True) # 延迟响应时就标记为隐藏消息 await ctx.followup.send("Test") # 后续发送的消息自动继承隐藏属性 - 检查参数冲突与拼写问题
- 确认参数名拼写为
ephemeral,拼写错误时Python不会抛出语法错误,但会被当成无效参数被接口忽略 - 不要在调用respond时同时传入
delete_after参数,多个库的历史版本存在这两个参数同时使用时ephemeral失效的bug - 公告频道、论坛频道等特殊频道下,旧版本库存在ephemeral兼容问题,升级依赖即可修复
- 确认参数名拼写为
- 检查机器人权限
确认机器人在当前频道拥有发送消息、嵌入链接的基础权限,权限不足时接口会触发降级逻辑,忽略ephemeral参数直接发送公开消息。
内容的提问来源于stack exchange,提问作者Viski
相关产品推荐
相关产品推荐

