Discord.js v14机器人无法接收DM消息的问题排查
问题排查与修复方案
核心问题分析
你的代码存在4个关键问题:
client未传入执行函数:execute仅接收message参数,调用client.channels.get时client未定义,无法获取目标频道。- 频道获取方式过时:Discord.js v13及以上版本已废弃
channels.get(),需改用channels.fetch()确保能正确获取频道数据。 - 直接转发
message对象错误:channel.send()不能直接传入原始message对象,需提取消息内容、附件等信息构造新消息。 - Intents权限缺失:机器人未开启必要的意图权限,无法接收DM消息。
修复步骤
1. 补充client参数到执行函数
修改事件文件的execute方法,同时接收client和message:
module.exports = { name: 'messageCreate', // 新增client参数 execute(client, message) { // 后续代码... } };
同时在加载事件的核心文件(如index.js/main.js)中,触发事件时传入client:
// 示例事件加载逻辑 client.on(event.name, (...args) => event.execute(client, ...args));
2. 修正频道获取与消息转发逻辑
改用fetch()获取频道,并正确转发DM内容及附件:
module.exports = { name: 'messageCreate', async execute(client, message) { // 过滤机器人自身消息,仅处理用户DM if (message.channel.type === 'DM' && !message.author.bot) { console.log('DM received'); try { // 获取管理员频道 const adminChannel = await client.channels.fetch('1026279100626767924'); // 转发带发送者信息的消息内容 await adminChannel.send(`收到来自 ${message.author.tag} 的DM:\n${message.content}`); // 如有附件,一并转发 if (message.attachments.size > 0) { const attachmentUrls = message.attachments.map(att => att.url); await adminChannel.send(`附件:\n${attachmentUrls.join('\n')}`); } } catch (error) { console.error('转发DM失败:', error); } } } };
3. 开启必要的Intents权限
在机器人客户端初始化代码中,开启DirectMessages和MessageContent意图(v14+版本必须开启MessageContent才能读取消息内容):
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.DirectMessages, GatewayIntentBits.MessageContent ] });
同时需前往Discord开发者后台的机器人页面,在Privileged Gateway Intents下开启Message Content Intent权限。
4. 验证机器人频道权限
确保机器人在管理员频道拥有发送消息和上传文件(如需转发附件)的权限。
内容的提问来源于stack exchange,提问作者Gamby1223
相关产品推荐
相关产品推荐

