Discord.js v14机器人仅响应私信,服务器命令无响应求助
问题:Discord.js v14机器人仅在私信响应命令,服务器内无反应
我正在使用JavaScript和discord.js v14开发首个Discord机器人,目前它仅在私信中响应命令,在服务器中不会回复消息,恳请技术帮助。
我尝试重新安装discord.js,也安装过旧版本,但问题似乎不在库本身,因为它在私信中可以正常工作。
我的代码
//npm é um gerenciador de pacotes const { Client, GatewayIntentBits, Partials } = require('discord.js'); const config = require('./config.json'); const { Guilds, GuildMembers, DirectMessages } = GatewayIntentBits; const { Channel, GuildMember, Message, User, Reaction } = Partials; const client = new Client({ intents: [Guilds, GuildMembers, DirectMessages], partials: [Channel, GuildMember, Message, User, Reaction], }); client.on('ready', () => { console.log( `Bot foi iniciado, com ${client.users.cache.size} usuários, em ${client.channels.cache.size} canais, em ${client.guilds.cache.size} servidores.`, ); client.user.setActivity( `Eu estou em ${client.guilds.cache.size} servidores.`, ); //atualiza status do bot }); client.on('guildCreate', (guild) => { console.log( `O bot entrou nos servidores: ${guild.cache.name} (id: ${guild.cache.id}). População: ${guild.cache.memberCount} membros.`, ); client.user.setActivity(`Estou em ${client.guilds.cache.size} servidores!`); }); //toda vez q o bot entra num server, esse comando é executado e atualiza o status do bot client.on('guildDelete', (guild) => { console.log( `O bot foi removido do servidor: ${guild.cache.name} (id: ${guild.cache.id}).); client.user.setActivity(Serving ${client.guilds.cache.size} servers!`, ); }); //avisa caso o bot seja excluido de um servidor client.on('messageCreate', async (message) => { let prefix = config.prefix; //liga o prefixo do arquivo config para comando if (message.author.bot) return; //nao responda outros bots if (!message.content.startsWith(config.prefix)) return; //if(message.channel.type === "dm") return; //nao responda por DM const args = message.content.slice(config.prefix.length).trim().split(/ +/g); //liga o prefix do config para comando const comando = args.shift().toLowerCase(); //parametros do comando if (comando === 'ping') { //define o comando depois do prefixo digitado pelo usuario const m = await message.channel.send('Ping?'); //mensagem m.edit( `:ping_pong: Pong! A latencia é ${ m.createdTimestamp - message.createdTimestamp } ms. A latencia da API é ${Math.round(client.ws.ping)} ms`, ); //edita a propria mensagem 'm' } }); //evento de mensagem do bot client.login(config.token); //liga o bot
问题原因及修复方案
1. 缺少服务器消息相关的Intent权限
discord.js v14要求必须显式声明需要的Intent才能接收对应事件。你的机器人收不到服务器消息,是因为没有开启GuildMessages(接收服务器消息事件)和MessageContent(读取消息内容)这两个关键Intent。
修改Client初始化的intents配置:
const { Guilds, GuildMembers, DirectMessages, GuildMessages, MessageContent } = GatewayIntentBits; const client = new Client({ intents: [Guilds, GuildMembers, DirectMessages, GuildMessages, MessageContent], partials: [Channel, GuildMember, Message, User, Reaction], });
同时,需在Discord开发者后台的机器人页面,开启Message Content Intent开关(位于Privileged Gateway Intents板块下),否则MessageContentIntent不会生效。
2. 代码中的语法错误
代码存在几处语法错误,会导致机器人运行异常:
guildCreate和guildDelete事件中,错误使用guild.cache.name、guild.cache.id,guild参数本身就是Guild实例,直接用guild.name、guild.id、guild.memberCount即可,guild.cache是不存在的属性。guildDelete事件的console.log字符串未闭合,且client.user.setActivity的参数未加引号,会直接导致语法报错。
修正后的完整代码
//npm é um gerenciador de pacotes const { Client, GatewayIntentBits, Partials } = require('discord.js'); const config = require('./config.json'); const { Guilds, GuildMembers, DirectMessages, GuildMessages, MessageContent } = GatewayIntentBits; const { Channel, GuildMember, Message, User, Reaction } = Partials; const client = new Client({ intents: [Guilds, GuildMembers, DirectMessages, GuildMessages, MessageContent], partials: [Channel, GuildMember, Message, User, Reaction], }); client.on('ready', () => { console.log( `Bot foi iniciado, com ${client.users.cache.size} usuários, em ${client.channels.cache.size} canais, em ${client.guilds.cache.size} servidores.`, ); client.user.setActivity( `Eu estou em ${client.guilds.cache.size} servidores.`, ); //atualiza status do bot }); client.on('guildCreate', (guild) => { console.log( `O bot entrou nos servidores: ${guild.name} (id: ${guild.id}). População: ${guild.memberCount} membros.`, ); client.user.setActivity(`Estou em ${client.guilds.cache.size} servidores!`); }); //toda vez q o bot entra num server, esse comando é executado e atualiza o status do bot client.on('guildDelete', (guild) => { console.log( `O bot foi removido do servidor: ${guild.name} (id: ${guild.id}).` ); client.user.setActivity(`Estou em ${client.guilds.cache.size} servidores!`); }); //avisa caso o bot seja excluido de um servidor client.on('messageCreate', async (message) => { let prefix = config.prefix; //liga o prefixo do arquivo config para comando if (message.author.bot) return; //nao responda outros bots if (!message.content.startsWith(config.prefix)) return; //if(message.channel.type === "dm") return; //nao responda por DM const args = message.content.slice(config.prefix.length).trim().split(/ +/g); //liga o prefix do config para comando const comando = args.shift().toLowerCase(); //parametros do comando if (comando === 'ping') { //define o comando depois do prefixo digitado pelo usuario const m = await message.channel.send('Ping?'); //mensagem m.edit( `:ping_pong: Pong! A latencia é ${ m.createdTimestamp - message.createdTimestamp } ms. A latencia da API é ${Math.round(client.ws.ping)} ms`, ); //edita a propria mensagem 'm' } }); //evento de mensagem do bot client.login(config.token); //liga o bot
内容的提问来源于stack exchange,提问作者Arthur Jacintho de Oliveira Sa
相关产品推荐
相关产品推荐

