JavaScript编写DiscordBot如何读取用户内容并响应表情交互
Discord.js v13 帮助机器人功能补全方案
现有代码已实现!help指令触发私信的基础能力,补全私信应答、表情反应交互两个功能,按以下步骤修改即可:
前置配置调整
- 补全权限意图:新增
GUILD_MESSAGE_REACTIONS、DIRECT_MESSAGE_REACTIONS两个Intents,否则无法接收表情交互事件 - 新增Partials配置:加载
CHANNEL、MESSAGE、REACTION、USER四类Partials,解决私信、未缓存消息的事件丢失问题 - 记得去Discord开发者后台的机器人设置页,打开所有用到的Intents开关,否则代码配置不生效
功能实现逻辑
- 私信内容应答:在原有
messageCreate事件中新增分支,区分服务器频道消息和私信消息,过滤机器人自身发送的内容后,通过关键词映射表匹配用户输入,返回预设应答 - 表情反应交互:机器人发送帮助私信Embed后,主动为该条消息添加预设引导表情;新增
messageReactionAdd事件监听,过滤机器人自身操作,校验反应对应的消息为帮助菜单、操作者为目标用户后,根据表情类型返回对应内容
完整修改后代码
const {Client, Intents, MessageEmbed, Partials} = require('discord.js'); const bot = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.DIRECT_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS, Intents.FLAGS.DIRECT_MESSAGE_REACTIONS ], partials: [Partials.CHANNEL, Partials.MESSAGE, Partials.REACTION, Partials.USER] }); const token = '替换为你的机器人TOKEN'; const PREFIX = '!'; // 私信关键词应答映射,可自行增删修改 const dmKeywordMap = new Map([ ['权限', '服务器权限说明:普通用户仅可在指定频道发送指令,管理员可调整机器人配置参数'], ['指令', '当前可用指令:!help 呼出帮助菜单,!ping 查看机器人运行延迟'], ['报错', '遇到功能异常请先检查机器人频道权限是否配置完整,确认问题后可在服务器反馈频道提交'] ]); // 表情反应应答映射,可自行增删修改 const reactionMap = new Map([ ['1️⃣', '对应功能1说明:这里替换为你要展示的第一个问题的解答内容'], ['2️⃣', '对应功能2说明:这里替换为你要展示的第二个问题的解答内容'], ['3️⃣', '对应功能3说明:这里替换为你要展示的第三个问题的解答内容'] ]); bot.on('ready', () => { console.log(`Logged in as ${bot.user.tag}!`); }) bot.on('messageCreate', async message => { // 跳过机器人自身发送的消息,避免循环触发 if (message.author.bot) return; // 处理服务器内的指令消息 if (message.guild) { if (!message.content.startsWith(PREFIX)) return; const args = message.content.substring(PREFIX.length).split(" "); switch (args[0]) { case 'help': const helpEmbed = new MessageEmbed() .setTitle("帮助菜单") .setColor(0xFF0000) .setDescription("你可以直接在本私信发送关键词提问,也可以点击下方表情快速获取对应解答:\n1️⃣ 功能1说明\n2️⃣ 功能2说明\n3️⃣ 功能3说明"); // 发送私信后自动添加预设反应 const helpDmMessage = await message.author.send({ embeds: [helpEmbed] }); for (const emoji of reactionMap.keys()) { await helpDmMessage.react(emoji); } break; } } // 处理用户私信消息 else { const userInput = message.content.trim(); if (dmKeywordMap.has(userInput)) { message.reply(dmKeywordMap.get(userInput)); } else { message.reply("未识别到对应问题,可发送【权限】【指令】【报错】关键词获取对应解答,或回到服务器发送!help呼出带表情交互的帮助菜单"); } } }); // 监听表情反应事件 bot.on('messageReactionAdd', async (reaction, user) => { // 跳过机器人自己添加的反应 if (user.bot) return; // 拉取未缓存的反应数据 if (reaction.partial) { try { await reaction.fetch(); } catch (err) { console.error('拉取反应数据失败:', err); return; } } // 校验场景为私信、消息为机器人发出的帮助菜单、表情在预设映射表中 if (!reaction.message.guild && reaction.message.author.id === bot.user.id && reactionMap.has(reaction.emoji.name)) { // 移除用户反应,支持重复点击 await reaction.users.remove(user.id); // 发送对应解答 user.send(reactionMap.get(reaction.emoji.name)); } }) bot.login(token);
自定义调整说明
- 两个Map结构里的键值对可以按需修改,新增关键词、表情对应应答直接加条目即可
- 如果需要限定只有指定频道能触发
!help指令,在处理服务器指令的分支里加一层频道ID判断即可 - 表情支持自定义服务器表情,直接把Map里的emoji键替换为对应自定义表情的标识符即可
内容的提问来源于stack exchange,提问作者SchraderNM
相关产品推荐
相关产品推荐

