Discord.js开发成员验证Bot时无法收集用户DM消息问题排查求助
问题原因及修复方案
1. 收集器过滤器逻辑错误
你当前的过滤器仅判断当前频道为DM频道,没有限制消息发送者为发起验证的用户,该判断对收集逻辑没有实际作用,甚至会导致无关消息触发收集事件。请将过滤器修改为仅捕获发起验证用户的消息:
const filter = m => m.author.id === message.author.id;
2. 缺少必要的网关意图与部分配置
discord.js v13及以上版本需要显式开启对应权限才能接收消息内容和DM频道消息,你需要在客户端初始化时添加如下配置:
const { Client, GatewayIntentBits, ChannelType } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, // 必需,用于读取消息内容 GatewayIntentBits.DirectMessages // 必需,用于接收DM频道消息 ], partials: ['CHANNEL'] // 必需,用于正常识别DM频道 });
3. 频道类型判断语法过时
你代码中使用的message.channel.type != "dm"是v12及更早版本的写法,v13以后已改为枚举值判断,需要替换为:
if(message.channel.type !== ChannelType.DM) { // 原有逻辑 }
4. 缺少异常捕获逻辑
如果用户关闭了陌生人DM权限,message.author.send会抛出异常导致机器人崩溃,建议添加try catch进行异常处理。
修复后完整代码
const { Client, GatewayIntentBits, ChannelType } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.DirectMessages ], partials: ['CHANNEL'] }); client.on('messageCreate', async message => { if(message.author.id === botId) return; if(message.channel.type !== ChannelType.DM) { if(message.channelId == verifyChannelId && message.content == "verify") { try { // 发送初始DM消息 const dmMsg = await message.author.send('Hello, I\'m gonna asking you a few questions..'); const appChannel = dmMsg.channel; await appChannel.send('Are you on european server? (Yes/No)'); // 过滤器仅捕获发起验证的用户消息 const filter = m => m.author.id === message.author.id; const collector = appChannel.createMessageCollector({ filter, time: 15000 }); collector.on('collect', m => { console.log(`Collected ${m.content}`); }); collector.on('end', collected => { console.log(`Collected ${collected.size} items`); }); await message.delete({ timeout: 1000 }); } catch (err) { // 处理用户关闭DM的情况 await message.reply('请先开启陌生人DM权限后再发起验证').then(msg => setTimeout(() => msg.delete(), 3000)); await message.delete(); } } else { message.delete({ timeout: 1000 }); } } });
内容的提问来源于stack exchange,提问作者Dushy
相关产品推荐
相关产品推荐

