Discord.js 私聊场景下awaitMessages无法收集用户回复的API密钥
问题原因
- API版本不兼容:Discord.js v13及以上版本调整了
awaitMessages的入参规则,旧版v12将filter作为第一个参数的写法已失效,新版本需要将filter属性放到配置对象中作为唯一入参传入。 - 缺少网关意图:未在Client初始化时开启
DIRECT_MESSAGES私聊消息意图,v14及更高版本还需要额外开启MessageContent意图,同时在Discord开发者后台手动打开对应开关,否则机器人无法捕获私聊消息内容。 - 权限限制:用户屏蔽了机器人私信,或机器人未被授予私信相关权限,也会导致消息收集失败。
修正后代码示例
// 初始化Client阶段先配置所需网关意图 const { Client, IntentsBitField } = require('discord.js'); const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.DirectMessages, // 必选:开启私聊消息接收权限 IntentsBitField.Flags.MessageContent // v14+版本必选,需要开发者后台同步开启对应开关 ] }); async function takeApiSecret(msg) { try { const botMsg = await msg.author.send("Please provide your api secret"); // 调整awaitMessages的传参格式 const collected = await botMsg.channel.awaitMessages({ filter: collected => collected.author.id === msg.author.id, max: 1, time: 50000, errors: ['time'] }); // 提取用户提交的密钥 const apiSecret = collected.first().content; // 此处可添加后续密钥处理逻辑 } catch (e) { msg.author.send('Timeout'); } }
注:v14及以上版本使用消息内容相关能力,必须进入Discord开发者后台的Bot设置页,手动开启
Message Content Intent选项,否则机器人无法读取任何消息的文本内容。
内容的提问来源于stack exchange,提问作者Muhammad Mohsin Ajmal
相关产品推荐
相关产品推荐

