如何无需踢除重邀各服务器内机器人,为公共Discord Bot新增斜杠命令
公共Discord Bot斜杠命令自动生效解决方案
核心认知纠正
首先明确一个常见误区:不填guild_ids参数注册的是全局斜杠命令,不需要将机器人踢除重新邀请就能生效。Discord官方对全局斜杠命令的缓存同步周期最长为1小时,新注册的命令会在缓存更新后自动推送到所有已加入的服务器,只是不会立刻显示。你之前遇到的“需要重邀”的情况本质是等不及缓存自动更新。
即时生效实现方案
如果要实现用户邀请机器人后斜杠命令立刻可用的效果,可以通过按需手动单服同步的方式实现,完全不需要提前收集所有服务器ID,方案代码如下:
1. 初始化斜杠命令组件
关闭默认的自动全局同步,避免启动时浪费资源触发全量同步:
from discord_slash import SlashCommand, SlashContext # 关闭默认自动同步 slash = SlashCommand(bot, sync_commands = False)
2. 注册全局命令模板
正常注册命令,不需要加guild_ids参数:
@slash.slash(name='command name', description='command description') async def your_command(ctx: SlashContext): # 你的命令逻辑代码 await ctx.send("命令执行成功")
3. 新加入服务器触发即时同步
在on_guild_join事件中手动触发新服务器的命令同步,单服同步是即时生效的,没有缓存延迟:
@bot.event async def on_guild_join(guild): # 将全局命令同步到当前新加入的服务器 await slash.sync_all_commands(guild_id=guild.id)
4. 启动时补同步存量服务器
如果需要在机器人启动时给已经加入的所有服务器补同步,可以在on_ready事件中增加一次性同步逻辑:
init_sync_done = False @bot.event async def on_ready(): global init_sync_done if not init_sync_done: # 只在首次启动时同步所有已加入服务器,避免重连时重复触发 for guild in bot.guilds: await slash.sync_all_commands(guild_id=guild.id) init_sync_done = True print(f"机器人登录成功: {bot.user}")
优化建议
- 如果你的命令数量不超过100个(Discord全局命令数量上限),且不需要极致的即时性,完全可以直接用默认全局命令注册,不需要额外写同步逻辑,大部分情况下用户邀请后10分钟内就能看到命令。
- 注意不要频繁调用命令同步接口,Discord对该接口有频率限制,短时间内大量同步会被限制请求。
内容的提问来源于stack exchange,提问作者CatsRdeBest2018
相关产品推荐
相关产品推荐

