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

如何将Discord bot的slash commands注册到其加入的所有guild

斜杠命令全服务器注册方案

核心误区纠正

你之前找到的方案大概率是遍历Bot所在Guild逐个调用公会级命令注册接口,这个方案本身不符合Discord API设计规范,不仅容易触发速率限制,还会出现新加入Guild命令缺失、不同服务器命令版本不一致的问题,不需要适配这种错误逻辑。

官方标准实现路径

Discord原生提供全局斜杠命令能力,一次注册即可自动同步到Bot加入的所有Guild,不需要遍历任何服务器列表。

  • 两类注册接口的明确差异:
    • 公会级命令接口:仅对单个Guild生效,更新即时,仅适合开发测试场景
    • 全局命令接口:注册后自动覆盖所有Bot所在Guild,最长1小时缓存传播周期,适合生产环境

适配现有命令处理器的修改步骤

  1. 移除现有代码中遍历Guild列表逐个发起注册请求的逻辑,不需要提前拉取Bot所在的所有Guild列表
  2. 复用你现有命令收集逻辑,把所有斜杠命令的结构标准化为Discord API要求的JSON格式,校验name、description、options字段无非法值
  3. 调用v10版本的全局命令注册接口完成注册,鉴权逻辑和你现有Bot的请求鉴权完全复用

可直接复用的TS实现代码(适配discord.js v14+,兼容绝大多数自定义命令处理器)

import { REST, Routes } from 'discord.js';
import { readdirSync } from 'fs';
import { join } from 'path';

// 复用现有命令目录读取逻辑,不需要修改原有命令定义
const commands = [];
const commandDir = join(__dirname, 'commands');
const commandFiles = readdirSync(commandDir).filter(f => f.endsWith('.js') || f.endsWith('.ts'));

for (const file of commandFiles) {
  const cmd = require(join(commandDir, file));
  if (cmd.data?.toJSON && cmd.execute) commands.push(cmd.data.toJSON());
}

const rest = new REST({ version: '10' }).setToken(process.env.BOT_TOKEN);

// 执行全局注册
(async () => {
  const res = await rest.put(
    Routes.applicationCommands(process.env.CLIENT_ID),
    { body: commands }
  );
  console.log(`全局命令注册完成,共${(res as any[]).length}个命令,将在1小时内同步至所有服务器`);
})();

常见问题处理

  • 开发阶段需要即时预览命令效果:单独调用测试服务器的公会级注册接口即可,不要给所有服务器开公会级注册
  • 出现重复命令:之前注册过的公会级命令不会被全局命令自动覆盖,需要单独调用接口删除对应Guild下的冗余命令
  • 速率限制报错:全局命令注册每天仅需要在命令更新时调用1-2次即可,不需要频繁请求,接口本身的速率阈值完全足够正常使用
  • 新加入服务器命令不显示:用户第一次在新服务器触发交互时,Discord会自动拉取最新全局命令列表,不需要额外做注册操作

全局命令单应用上限为100个斜杠命令+5个用户上下文菜单+5个消息上下文菜单,满足绝大多数Bot的使用需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.11 16:16:23