DiscordJS交互消息收集器无法收集消息问题求助
DiscordJS 交互消息/反应收集器无法收集内容的解决方案
问题分析
你的两段代码都存在逻辑错误,导致收集器无法捕获目标用户的操作:
第一段反应收集器的错误
filter 中判断 user.id === message.author.id,这里的 message 是机器人发送的回复消息,message.author 是机器人自身ID,永远匹配不上发起命令的用户。
第二段消息收集器的错误
awaitMessages在DiscordJS v14+中已被废弃,官方推荐使用createMessageCollector- 未添加过滤条件,即使不废弃也会收集频道内所有消息,且没有限定发起命令的用户
修正后的反应收集器代码
const { EmbedBuilder, MessageReaction } = require("discord.js"); const { registerFont, createCanvas, loadImage } = require('canvas'); const scale = 20; const canvas = createCanvas(171*scale,138*scale); const fs = require('fs'); const sql = require('./../self-modules/sql.js'); exports.run = async (client, interaction, dbcon) => { const replyMessage = await interaction.reply({ content: "请点击👍回应", fetchReply: true }); // 过滤条件:只收集发起命令用户的👍反应 const filter = (reaction, user) => { return reaction.emoji.name === '👍' && user.id === interaction.user.id; }; const collector = replyMessage.createReactionCollector({ filter, time: 15000 }); collector.on('collect', (reaction, user) => { console.log(`收集到${reaction.emoji.name},来自用户${user.tag}`); }); collector.on('end', collected => { console.log(`共收集到${collected.size}个反应`); if (collected.size > 0) { interaction.followUp("已收到你的回应!"); } else { interaction.followUp("超时未收到回应"); } }); }
修正后的消息收集器代码
const { EmbedBuilder, MessageReaction } = require("discord.js"); const { registerFont, createCanvas, loadImage } = require('canvas'); const scale = 20; const canvas = createCanvas(171*scale,138*scale); const fs = require('fs'); const sql = require('./../self-modules/sql.js'); exports.run = async (client, interaction, dbcon) => { await interaction.reply({ content: "请发送包含「discord」的消息", fetchReply: true }); // 过滤条件:只收集发起命令用户的消息,且内容包含discord const filter = (msg) => { return msg.author.id === interaction.user.id && msg.content.includes('discord'); }; const collector = interaction.channel.createMessageCollector({ filter, max: 1, time: 30000 }); collector.on('collect', (msg) => { interaction.followUp(`${msg.author} 回答正确!`); }); collector.on('end', collected => { console.log(`共收集到${collected.size}条消息`); if (collected.size === 0) { interaction.followUp("超时未收到正确回答"); } }); }
额外注意事项
- 确保机器人拥有读取消息历史和添加反应的频道权限
- 如果使用DiscordJS v13及以下版本,部分API参数可能略有差异,请对应调整
- 避免混用回调和async/await,统一用async/await代码更清晰
内容的提问来源于stack exchange,提问作者SchinkTasia
相关产品推荐
相关产品推荐

