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

如何无需踢除重邀各服务器内机器人,为公共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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:15:07