【问题标题】:Discord JS v12: How do you get a message's content by it's ID?Discord JS v12:如何通过 ID 获取消息的内容?
【发布时间】:2021-04-19 05:36:01
【问题描述】:

我对 discord.js 比较陌生,我已经开始构建一个机器人项目,允许用户通过命令创建消息,将该消息存储在我的私人服务器上的隐藏通道中,然后说消息可以通过消息ID提取。

我有写入工作,它返回在隐藏通道中发送的消息的消息 ID,但我完全被 get 命令难住了。我尝试过在线搜索,但我尝试的每种方法都会返回错误,例如“无法读取未定义的属性 'fetch'”或“'channel' 未定义”。以下是我尝试过的一些示例,任何帮助将不胜感激。请注意,我的 args 已经准确,“args[0]”是命令后的第一个参数。 “COMMAND_CHANNEL”是执行命令的通道,而“MESSAGE_DATABASE”是存储目标消息的通道。

let msgValue = channel.messages.cache.get(args[0])
client.channels.cache.get(COMMAND_CHANNEL).send(msgValue.content)
let msgValue = msg.channel.message.fetch(args[0])
    .then(message => client.channels.cache.get(COMMAND_CHANNEL).send(msgValue.content))
    .catch(console.error);

我什至尝试使用 node-fetch 来调用 discord API 本身

const api = require("node-fetch")
let msgValue = api(`https://discordapp.com/api/v8/channels/${MESSAGE_DATABASE}/messages/${args[0]}`)
    .then(message => client.channels.cache.get(COMMAND_CHANNEL).send(msgValue.content))
    .catch(console.error);

是我遗漏了什么还是我犯了某种错误?

编辑:感谢您的帮助!我完成了我的机器人,它只是一个小实验机器人,它允许您创建只能在执行命令 :get_secret_message 时通过其 ID 查看的秘密消息。我在 top.gg 上发布了它,但它还没有被批准,所以在此期间,如果有人想弄乱它,这里是链接:https://discord.com/api/oauth2/authorize?client_id=800368784484466698&permissions=76800&scope=bot

命令列表:

:write_secret_message - 写一条秘密消息,执行后机器人会向你发送消息 ID。

:get_secret_message - 通过其 ID 获取秘密消息,执行时机器人将 DM 消息内容。

:invite - 获取机器人邀请链接。

注意:您的 DM 必须打开,否则机器人将无法 DM 任何信息。

我的测试消息ID:800372849155637290

【问题讨论】:

    标签: discord.js


    【解决方案1】:

    我认为您发布的第二次尝试非常接近,但您犯了一个错字并且您存储获取的消息的方式已关闭。

    错字是你写的msg.channel.message.fetch(args[0]),但它应该是msg.channel.messages.fetch(args[0])(错字是message之后缺少的s)。 See the messages property of a TextChannel.

    其次,但这只是一个猜测,因为我无法确定,因为您没有提供太多代码,当您尝试获取消息时,您是从错误的渠道获取的。您正在尝试从执行命令的通道(msg.channel)中获取具有给定 ID 的消息。除非此命令是从“MESSAGE_DATABASE”通道执行的,否则您需要按 ID 从“MESSAGE_DATABASE”通道而不是msg.channel 获取消息。

    第三,如果你获取一条消息,来自 Promise 的响应可以在 .then 方法中使用。您尝试使用let msgValue = msg.channel.message.fetch(args[0]) 将响应分配给变量msgValue,但这不会像您期望的那样。这实际上会将整个 Promise 分配给变量。我认为您想要做的只是直接在 .then 方法中使用来自 Promise 的响应。

    因此,请看下面代码的 sn-p,灵感来自 MessageManager .fetch examples。试试看它是否有效。

    // We no longer need to store the value of the fetch in a variable since that won't work as you expect it would.
    // Also we're now fetching the message from the MESSAGE_DATABASE channel.
    client.channels.cache.get(MESSAGE_DATABASE).fetch(args[0])
        // The fetched message will be given as a parameter to the .then method.
        .then(fetchedMessage => client.channels.cache.get(COMMAND_CHANNEL).send(fetchedMessage.content))
        .catch(console.error);
    

    【讨论】:

    • 所以我尝试使用你的代码,它在我的控制台窗口中返回了这个错误:``` DiscordAPIError: Cannot send an empty message at RequestHandler.execute (C:\Users\13605\Desktop\discord- bot\node_modules\discord.js\src\rest\RequestHandler.js:154:13) 在 processTicksAndRejections (internal/process/task_queues.js:97:5) 在异步 RequestHandler.push (C:\Users\13605\Desktop\ discord-bot\node_modules\discord.js\src\rest\RequestHandler.js:39:14) {方法:'post',路径:'/channels/799118129228939285/messages',代码:50006,httpStatus:400}`` `
    【解决方案2】:

    fetch 将结果作为 promise 返回,因此您需要使用 then 来访问该值,而不是将其分配给变量 (msgValue)。你也打错了(channel.message -> channel.messages)。
    我建议使用这样的东西:

    msg.channel.messages
        .fetch(args[0])
        .then(message => {
            client.channels
                .fetch(COMMAND_CHANNEL)
                .then(channel => channel.send(message.content))
                .catch(console.error)
        })
        .catch(console.error)
    

    【讨论】:

    • "ReferenceError: msg is not defined"
    • 编辑:没关系!我对您的代码进行了一些调整,以便可以从同一频道之外获取消息。原来我只需要用未定义问题的消息替换 msg,我很傻
    猜你喜欢
    • 2021-07-16
    • 2021-03-06
    • 1970-01-01
    • 2022-01-10
    • 2020-05-04
    • 1970-01-01
    • 2021-03-24
    • 2011-06-19
    • 2020-09-05
    相关资源
    最近更新 更多