discord.js开发:如何实现Discord bot与用户的双向私信通信
Discord.js 实现私信双向通信的解决方案
前置依赖配置(必做)
discord.js v14及以上版本需要主动配置网关权限和部分结构解析,否则无法监听到私信消息:
- 首先进入Discord开发者后台的Bot管理页,开启
Message Content Intent权限开关 - 初始化Client时配置对应的意图和partial属性,代码示例:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 服务器基础权限 GatewayIntentBits.GuildMessages, // 监听服务器公频消息 GatewayIntentBits.DirectMessages, // 监听私信消息 GatewayIntentBits.MessageContent, // 读取消息内容权限 ], // 私信频道属于偏结构,必须配置才能正常获取消息对象 partials: ['CHANNEL', 'MESSAGE'] });
核心逻辑实现
discord.js的messageCreate事件会默认监听所有来源的消息,你只需要通过msg.guild属性判断消息来源即可:msg.guild有值时是服务器公频消息,无值时是私信消息。
完整示例代码如下:
// 可选:存储用户会话状态,实现多轮上下文对话,大流量场景建议替换为Redis/数据库 const userSessions = new Map(); client.on('messageCreate', async (msg) => { // 必须加:过滤bot自身发送的消息,避免循环触发 if (msg.author.bot) return; // 场景1:处理服务器公频消息,主动给用户发私信 if (msg.guild) { try { await msg.author.send("I am the bot, and sending you this message as DM"); // 初始化用户会话状态,用于后续多轮对话识别 userSessions.set(msg.author.id, 'INIT'); } catch (err) { // 捕获用户关闭私信权限的异常,可选在公频提示用户 await msg.reply("无法向你发送私信,请检查你的Discord隐私设置是否允许陌生人发私信"); } return; } // 场景2:处理用户发来的私信消息 if (!msg.guild) { const userId = msg.author.id; const currentStage = userSessions.get(userId) || 'INIT'; // 根据会话阶段执行对应业务逻辑,示例如下: switch(currentStage) { case 'INIT': await msg.reply("你好呀,请问有什么可以帮到你的?"); userSessions.set(userId, 'WAITING_INPUT'); break; case 'WAITING_INPUT': await msg.reply(`我收到了你的消息:${msg.content},相关需求已经记录~`); // 业务处理完成后可清除会话,也可保留实现多轮对话 userSessions.delete(userId); break; default: await msg.reply("不好意思,我没明白你的意思,请重新描述需求"); } } });
注意事项
- 内存存储的会话状态会在bot重启后丢失,生产环境建议使用持久化存储方案
- 私信发送前捕获异常可以避免程序因用户权限问题崩溃
- 可以根据业务需要扩展会话状态的字段,存储更多上下文信息
内容的提问来源于stack exchange,提问作者Nika Kurashvili
相关产品推荐
相关产品推荐

