如何使用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
相关产品推荐
相关产品推荐

