Discord.JS(NodeJS)如何获取回复关联的原消息及回复消息信息
Discord回复类命令消息采集实现方案
需求场景
- 用户1在Discord频道发送普通文本消息,例:内容为
Thanks - 用户2针对用户1的上述消息使用Discord原生回复功能,发送携带前缀命令与频道ID的内容
- 开发的Discord机器人需自动采集对应关联消息的指定字段
需采集的核心信息
- 用户1发送的原消息的
messageID - 原消息的完整文本内容
- 回复者用户2所发消息的
messageID - 用户2发送的携带前缀命令的完整消息内容
现有代码问题
根据零散技术资料得知该功能可通过reference与resolved属性实现,但编写如下代码后reference返回undefined,功能无法正常运行:
if (message.reference?.resolved) { var old_message = await message.channel.fetch_message(message.reference.messageId) }
问题原因与修正代码
核心原因
message.reference.resolved字段仅在被引用消息与当前消息同频道、且消息已存在本地缓存时才会有值,跨频道引用、缓存未命中场景下该字段为空,不能作为判断是否存在引用的前置条件- 低版本discord.js(v12及以下)对消息引用字段的支持不完整,会出现
reference字段整体缺失的情况 - 若未开启机器人的消息内容特权意图,会出现消息字段读取异常的问题
可直接运行的修正代码
// 仅判断reference字段是否存在即可,用户使用原生回复发消息时该字段必然存在 if (message.reference) { try { // 同频道场景下直接通过引用携带的messageId拉取原消息 const originalMessage = await message.channel.messages.fetch(message.reference.messageId); // 四个目标信息可直接读取使用 const originalMsgId = originalMessage.id; // 用户1原消息ID const originalMsgContent = originalMessage.content; // 用户1原消息内容 const replyMsgId = message.id; // 用户2回复消息ID const replyMsgContent = message.content; // 用户2携带命令的消息内容 // 后续命令处理逻辑写在这里 } catch (error) { // 处理原消息被删除、无频道访问权限等异常场景 console.error('拉取被引用原消息失败:', error); } }
额外注意事项
- 若支持跨频道回复场景,不要直接用当前消息的channel对象拉取原消息,需先通过
message.reference.channelId获取原消息所属频道对象,再调用消息拉取方法 - 必须在Discord开发者后台开启机器人的Message Content Intent(消息内容特权意图),否则所有消息的
content字段都会返回空值 - discord.js v14版本中消息拉取方法挂载在
channel.messages对象下,不要使用旧版本的channel.fetch_message写法,否则会报方法不存在的错误
内容的提问来源于stack exchange,提问作者chrijdal
相关产品推荐
相关产品推荐

