
本文详解如何在 discord.py 中通过 allowed_mentions 参数启用真实角色提及,解决命令响应中角色被显示但不触发通知的“幽灵提及”问题。
在使用 discord.py 构建 Slash 命令时,许多开发者会遇到一个常见误区:直接在消息内容中插入 格式的字符串(如 ),看似成功渲染了角色名,但实际上该提及不会触发通知、不会高亮、也不会被 Discord 视为有效提及——这就是所谓的“幽灵提及”(Ghost Ping)。根本原因在于:Discord 默认禁止 Bot 自动提及角色或用户,以防止滥用;必须显式声明允许的提及类型。
要真正触发角色提及并使成员收到通知,需在发送消息时传入 allowed_mentions 参数,并明确启用角色提及权限:
import discord
from discord import app_commands
@client.tree.command(name="duty", description="Ping @SASP — zapraszam na służbę (admin only)")
@app_commands.checks.has_permissions(administrator=True)
async def nagana(interaction: discord.Interaction):
await interaction.response.send_message(
f"<@&1064986634963140628>, Zapraszam na służbę",
allowed_mentions=discord.AllowedMentions(roles=True) # ✅ 关键:启用角色提及
)⚠️ 重要注意事项:
- allowed_mentions 必须作为关键字参数传入 send_message()(或 followup.send()),不可省略;
- discord.AllowedMentions(roles=True) 表示仅允许提及角色;若还需提及用户或所有人,可组合使用:
AllowedMentions(roles=True, users=True, everyone=False); - 即使启用了 roles=True,目标角色也必须满足两个前提条件才能被成功提及:
- 该角色在当前频道中具有「查看频道」和「发送消息」权限(否则 Bot 无法提及);
- 角色本身未被设置为「提及禁用」(即角色设置中未勾选 Disable mentions);
- 若需全局控制提及行为,也可在 Client 初始化时配置默认值:
client = discord.Client(intents=intents, allowed_mentions=discord.AllowedMentions(roles=True)),但推荐按需显式指定,更安全可控。
✅ 总结:幽灵提及不是 Bug,而是 Discord 的安全机制;正确使用 allowed_mentions 是实现可靠、合规提及的唯一标准方式。务必在每次涉及提及的 send_message() 调用中显式声明,切勿依赖纯字符串拼接。










