Discord.js开发:message.author.dmChannel.awaitMessages无法捕获用户DM消息
解决方案
1. 配置所需的网关权限与意图
discord.js v13及以上版本要求显式配置消息相关权限才能正常读取私信内容:
- 进入Discord开发者后台的机器人应用页,切换到「Bot」标签,找到Privileged Gateway Intents区域,开启
Message Content Intent和Direct Messages Intent两个特权权限 - 初始化Client时添加对应意图和partial配置,示例代码:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.DirectMessages, GatewayIntentBits.MessageContent ], partials: ['CHANNEL'] // 未缓存的私信频道需要配置该项才能正常接收消息 });
2. 修复代码逻辑与语法错误
你提供的代码存在三个核心问题:
- 旧版本语法适配问题:discord.js v13+ 仅支持将filter放入配置对象的传参方式,第一种传参写法已经废弃
- 返回值类型错误:
awaitMessages返回的是消息集合Collection,不是单条消息对象,需要调用.first()取出实际消息才能调用reply方法 - 过滤器逻辑缺陷:未过滤发送者身份,可能匹配到机器人自己发送的消息,同时原代码存在括号未配对的语法错误
修正后的可运行代码如下:
// 仅匹配触发初始命令的用户发送的消息,避免误匹配 const filter = m => m.author.id === message.author.id; message.author.dmChannel.awaitMessages({ filter, max: 1, time: 60000, errors: ["time"] }).then(collected => { // 从返回的消息集合中取出第一条收到的消息 const userMsg = collected.first(); userMsg.reply("message collected message"); }).catch(() => message.author.send("ran out of time message"));
3. 异常场景排查
- 确认测试时发送的私信包含文本内容,若保留
m.content的过滤逻辑,纯图片、纯表情包等无文本内容的消息会被过滤器拦截 - 确认机器人未被测试用户拉黑,且机器人的隐私设置中允许接收服务器成员的私信
- 可在filter中添加打印逻辑
console.log(m.content, m.author.id),排查消息是否被过滤器误拦截
内容的提问来源于stack exchange,提问作者Ianthecoder
相关产品推荐
相关产品推荐

