You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Discord.py获取Slash Command的ID

解决Discord机器人Slash Command链接无法获取ID的问题

你遇到的问题是因为tree.get_command("rank")返回的是本地定义的命令对象,它还没和Discord服务器完成同步,所以不包含id属性。要生成可点击的Slash Command链接,必须获取Discord服务器上已同步命令的真实ID,以下是两种可行方案:

方案一:实时从Discord拉取命令ID

直接从Discord服务器获取已同步的命令列表,筛选出目标命令的ID:

全局命令(所有服务器可用)

# 获取所有全局同步的Slash命令
commands = await self.bot.tree.fetch_commands()
rank_command_id = None
for cmd in commands:
    if cmd.name == "rank":
        rank_command_id = cmd.id
        break

if rank_command_id:
    await message.reply(f"To view your rank, please click here </rank:{rank_command_id}> 🔍")
else:
    await message.reply("Rank command not found or not synced yet!")

服务器专属命令(仅特定服务器可用)

如果你的rank命令是仅在某个测试服务器同步的,需要指定服务器ID:

GUILD_ID = 123456789012345678  # 替换成你的服务器ID
commands = await self.bot.tree.fetch_commands(guild=discord.Object(id=GUILD_ID))
rank_command_id = None
for cmd in commands:
    if cmd.name == "rank":
        rank_command_id = cmd.id
        break

if rank_command_id:
    await message.reply(f"To view your rank, please click here </rank:{rank_command_id}> 🔍")
else:
    await message.reply("Rank command not found in this server or not synced yet!")

方案二:启动时缓存命令ID

在机器人启动并完成命令同步后,提前获取并缓存命令ID,后续直接使用缓存值,避免重复拉取:

# 在机器人启动逻辑中(比如on_ready事件里)
async def on_ready(self):
    await self.bot.wait_until_ready()
    # 同步命令(全局或指定服务器)
    await self.bot.tree.sync()  # 全局同步,或者加guild参数同步到指定服务器
    # 获取并缓存rank命令的ID
    self.rank_command_id = (await self.bot.tree.fetch_command("rank")).id
    print(f"Cached rank command ID: {self.rank_command_id}")

# 后续回复时直接用缓存的ID
await message.reply(f"To view your rank, please click here </rank:{self.rank_command_id}> 🔍")

注意事项

  • 确保你的机器人已经完成Slash命令的同步(调用tree.sync()),否则Discord服务器上不存在该命令,无法获取ID。
  • 服务器专属命令必须指定对应服务器ID才能拉取到,否则会默认拉取全局命令列表,导致找不到目标命令。

内容的提问来源于stack exchange,提问作者Aashish Vinu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:22:44