You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:27:25