Discord Bot如何获取已加入全部服务器的guild ID?
实现方法
1. 获取机器人已加入的所有服务器Guild ID
client.guilds.cache是discord.js封装的服务器集合对象,直接调用map方法即可提取所有服务器ID:
// 放在ready事件内执行 const allGuildIds = client.guilds.cache.map(guild => { console.log(`服务器名称:${guild.name},ID:${guild.id}`) return guild.id }) console.log('所有已加入服务器ID列表:', allGuildIds)
如果你只是需要单个测试服务器的ID,也可以直接在Discord客户端开启开发者模式后,右键服务器图标选择「复制ID」直接填写。
2. 更简便的命令注册实现
首先明确两种命令的区别:
- 公会命令:仅在指定服务器生效,注册后立即同步,适合开发测试
- 全局命令:所有加入的服务器都生效,注册后最长需要1小时同步,适合正式上线
场景1:开发阶段快速注册单公会测试命令
如果你的机器人仅加入了一个测试服务器,可以直接提取缓存中的第一个服务器,不需要手动填写ID:
client.once('ready', async () => { console.log("STARTTTTTTT"); // 直接取第一个已加入的服务器,无需手动填ID const guild = client.guilds.cache.first() const commands = guild ? guild.commands : client.application?.commands // 注册前可以先清空旧命令,避免重复 await commands?.set([ { name: "lena", description: "LENAAAAAAAAAA", options: [ { name: 'name', description: "LENAAAAAAA", required: true, type: Discord.Constants.ApplicationCommandOptionTypes.STRING }, { name: 'text', description: "LENAAA", required: false, type: Discord.Constants.ApplicationCommandOptionTypes.STRING }, ] } ]) console.log('命令注册完成') })
场景2:批量给所有已加入服务器注册命令
需要遍历所有服务器逐一注册:
client.once('ready', async () => { console.log("STARTTTTTTT"); const commandData = { name: "lena", description: "LENAAAAAAAAAA", options: [ { name: 'name', description: "LENAAAAAAA", required: true, type: Discord.Constants.ApplicationCommandOptionTypes.STRING }, { name: 'text', description: "LENAAA", required: false, type: Discord.Constants.ApplicationCommandOptionTypes.STRING }, ] } // 遍历所有服务器注册命令 for (const guild of client.guilds.cache.values()) { await guild.commands.set([commandData]) console.log(`已为服务器${guild.name}注册命令`) } console.log('全部命令注册完成') })
场景3:正式上线直接用全局命令
不需要处理任何Guild ID,直接注册全局命令即可自动同步到所有已加入服务器:
client.once('ready', async () => { console.log("STARTTTTTTT"); await client.application?.commands.set([ { name: "lena", description: "LENAAAAAAAAAA", options: [ { name: 'name', description: "LENAAAAAAA", required: true, type: Discord.Constants.ApplicationCommandOptionTypes.STRING }, { name: 'text', description: "LENAAA", required: false, type: Discord.Constants.ApplicationCommandOptionTypes.STRING }, ] } ]) console.log('全局命令注册完成,最长1小时后同步到所有服务器') })
注意事项
- 用
set()方法代替create()方法可以直接覆盖已有命令,避免重复注册生成多个同名命令 - 开发阶段优先用单公会命令,测试无误后再注册全局命令减少同步等待时间
内容的提问来源于stack exchange,提问作者user16114628
相关产品推荐
相关产品推荐

