
Discord 机器人的 Slash 命令不会自动显示,必须显式调用 tree.sync() 同步到服务器或全局;缺少此步骤是命令不可见的最常见原因。
discord 机器人的 slash 命令不会自动显示,必须显式调用 `tree.sync()` 同步到服务器或全局;缺少此步骤是命令不可见的最常见原因。
要使你定义的 Slash 命令(例如 /echo)在 Discord 客户端中实际出现并可被调用,关键在于命令同步(command synchronization)——这是 Discord API 的强制要求。即使代码逻辑正确、权限配置无误,若未主动触发同步,命令将始终处于“未注册”状态,用户无法看到或使用。
✅ 正确做法:在 on_ready 中同步命令
将以下代码添加到你的机器人启动完成事件中(即 @bot.event 或 @client.event 的 on_ready 回调内):
@bot.event
async def on_ready():
print(f'Logged in as {bot.user}')
try:
# 同步到当前所有已加入的服务器(推荐用于开发/测试)
await bot.tree.sync()
# ✅ 可选:仅同步到特定服务器(需传入 Guild 对象)
# await bot.tree.sync(guild=discord.Object(id=YOUR_GUILD_ID))
# ✅ 可选:全局同步(生效慢,最多1小时,且需 Bot 有 APPLICATION_COMMANDS 权限)
# await bot.tree.sync()
print("Slash commands synced successfully.")
except Exception as e:
print(f"Error occurred while syncing commands: {e}")
⚠️ 注意事项:
bot.tree.sync()是异步操作,必须用await调用;- 同步后需手动刷新 Discord 客户端(Windows/Linux:
Ctrl + R;macOS:Cmd + R),否则旧缓存可能导致命令延迟显示;- 若使用
guild=参数进行本地同步(推荐开发阶段),确保 Bot 已加入该服务器,且你拥有MANAGE_GUILD权限(用于注册命令);- 全局命令同步(无
guild=参数)对所有添加了 Bot 的服务器生效,但需 Bot OAuth2 URL 包含applications.commandsscope(你截图中已勾选 ✅,符合要求);- 每次修改命令名、描述或参数后,必须重新运行
sync()—— Discord 不支持热更新。
? 验证是否成功
- 刷新 Discord 后,在任意文本频道输入
/,检查是否出现echo命令; - 若仍不显示,请确认:
- Bot 已通过带
applications.commandsscope 的链接邀请(如:https://discord.com/api/oauth2/authorize?client_id=YOUR_ID&permissions=0&scope=bot%20applications.commands); - 你所在的服务器已启用开发者模式,并确认 Bot 拥有
Use Application Commands权限(通常随Send Messages等基础权限自动赋予); - 终端日志中输出
"Slash commands synced successfully.",且无报错。
- Bot 已通过带
完成以上步骤后,你的 /echo 命令即可正常响应交互,无需重启 Bot 即可快速迭代调试。










