开发Discord机器人触发CLIENT_MISSING_INTENTS报错如何解决?
报错触发原因
- 你使用的是discord.js v13及以上版本,该版本开始Discord官方强制要求开发者在初始化客户端时明确声明网关意图(Intents),用于指定机器人需要接收哪些类别的事件数据,你当前代码初始化
Discord.Client时没有传入任何意图配置,直接触发该报错。 - 同时你的代码还存在两个隐性问题:
- v13及以上版本中原
message事件已被废弃,需替换为messageCreate事件才能正常监听消息 - comms.js文件中
comms_list数组的闭合语法错误,多写了半个无关的大括号,运行时会触发语法报错
- v13及以上版本中原
修复方案
1. 修正bot.js的客户端初始化配置和事件监听
将bot.js中初始化客户端的代码替换为带意图配置的版本,同时修改监听事件名:
const Discord = require('discord.js'); // 新增意图配置 const robot = new Discord.Client({ intents: [ Discord.GatewayIntentBits.Guilds, // 服务器基础访问权限 Discord.GatewayIntentBits.GuildMessages, // 接收服务器消息权限 Discord.GatewayIntentBits.MessageContent, // 读取消息内容权限 ] }); const comms = require("./comms.js"); const fs = require('fs'); let config = require('./config.json'); let token = config.token; let prefix = config.prefix; robot.on("ready", function() { console.log(robot.user.username + " запустился!"); }); // 将原来的message事件替换为messageCreate robot.on('messageCreate', (msg) => { if (msg.author.username != robot.user.username && msg.author.discriminator != robot.user.discriminator) { var comm = msg.content.trim() + " "; var comm_name = comm.slice(0, comm.indexOf(" ")); var messArr = comm.split(" "); for (comm_count in comms.comms) { var comm2 = prefix + comms.comms[comm_count].name; if (comm2 == comm_name) { comms.comms[comm_count].out(robot, msg, messArr); } } } }); robot.login(token);
如果你使用的是discord.js v13版本,将GatewayIntentBits替换为Intents.FLAGS即可。
2. 修正comms.js的语法错误
将comms.js中comms_list数组的错误闭合修正,删掉多余的大括号:
// 错误写法 var comms_list = [{ name: "test", out: test, about: "Тестовая команда" }, { name: "hello", out: hello, about: "Команда для приветствия!" } } // 正确写法 var comms_list = [{ name: "test", out: test, about: "Тестовая команда" }, { name: "hello", out: hello, about: "Команда для приветствия!" } ]
3. 开启Discord开发者后台特权意图
由于MessageContent属于特权意图,你需要登录Discord开发者平台,进入对应机器人的管理页面,找到「Privileged Gateway Intents」板块,开启Message Content Intent开关,否则机器人无法正常读取消息内容。
内容的提问来源于stack exchange,提问作者TCMbtw
相关产品推荐
相关产品推荐

