Discord机器人在新服务器无法注册斜杠命令,报Missing Access错误
我在一台服务器上搭建的Discord机器人,通过以下代码加载comandos文件夹中的JS命令文件并注册斜杠命令,在原服务器运行完全正常:
//Load commands Client.commands = new Discord.Collection(); fs.readdirSync("./comandos").forEach((commandfile) => { const command = require('./comandos/' + commandfile); Client.commands.set(command.data.name, command); }); //Register commands const REST = new Discord.REST().setToken(config.CLIENT_TOKEN); (async () => { try{ await REST.put( Discord.Routes.applicationGuildCommands(config.clientId, config.guildId), { body: Client.commands.map((cmd) => cmd.data.toJSON()), } ) } catch (e){ console.log(e); } })();
命令文件的常规结构如下:
const Discord = require("discord.js"); module.exports = { // datos data: new Discord.SlashCommandBuilder() .setName("test") .setDescription("Comando de prueba.") //ejecucion execute: async (interaction) => { //mensaje interaction .reply("Has ejecutado el comando de prueba.") .catch(console.error); } }
但将机器人部署到另一台服务器时,命令无法显示,且出现以下错误:
DiscordAPIError[50001]: Missing Access at handleErrors (C:\Users...@discordjs\rest\dist\index.js:727:13) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async SequentialHandler.runRequest (C:\Users...@discordjs\rest\dist\index.js:1128:23) at async SequentialHandler.queueRequest (C:\Users...@discordjs\rest\dist\index.js:959:14) at async _REST.request (C:\Users...@discordjs\rest\dist\index.js:1272:22)
at async C:\Users...\bot.js:36:9 { requestBody: { files: undefined, json: [ [Object], [Object], [Object], [Object] ] }, rawError: { message: 'Missing Access', code: 50001 }, code: 50001, status: 403, method: 'PUT', url: 'https://discord.com/api/v10/applications/1271441796953800794/guilds/1271149134589595683/commands' }
注:已为机器人配置applications.command、bot、Administrator权限,拥有目标服务器管理员权限,重启机器人、重新邀请均无效,原服务器无此问题。
排查与解决步骤
确认邀请链接的权限参数完整
重新生成邀请链接时,必须同时包含bot和applications.commands两个scope,正确的链接格式应包含:scope=bot+applications.commands,权限参数建议使用管理员权限的数字值permissions=8。很多时候重新邀请时容易遗漏applications.commands的scope,这是导致命令无法注册的常见原因。调整机器人角色的优先级
在目标服务器的「角色」设置中,将机器人的角色拖动到所有成员角色的上方。如果机器人角色位置过低,可能会被下级角色的权限设置覆盖,导致无法正常注册和使用命令。同时检查所有频道的权限设置,确保机器人没有被禁止使用应用命令。验证Guild ID与Client ID的正确性
核对代码中config.clientId和config.guildId的值,是否与目标服务器ID、机器人应用ID完全匹配。可以通过开启Discord开发者模式,右键服务器/机器人头像复制正确的ID,避免因ID错误导致请求发送到错误的资源路径。更新Discord.js到最新稳定版
检查当前使用的Discord.js版本是否与API版本(报错中为v10)兼容,版本过低可能引发API请求不兼容问题。执行以下命令更新:npm update discord.js测试全局命令注册
暂时将代码中的Discord.Routes.applicationGuildCommands(config.clientId, config.guildId)替换为Discord.Routes.applicationCommands(config.clientId),尝试注册全局命令。如果全局命令能正常显示,说明问题出在目标服务器的权限配置;如果仍报错,需检查机器人应用的令牌是否正确,或是否存在Discord平台级别的限制。
内容的提问来源于stack exchange,提问作者Raymond J.

