当前位置: 首页 > 知识库问答 >
问题:

Discord JSV12:如何通过消息的ID获取消息的内容?

云宏儒
2023-03-14

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

我使用了write,它返回在隐藏通道中发送的消息的消息ID,但我完全被get命令难住了。我试过在网上搜索,但我尝试的每个方法都会返回错误,如“无法读取未定义的属性'fetch'”或“'channel'未定义”。这里是我尝试的一些例子,任何帮助将是感激的。注意,我的args已经很准确了,“args[0]”是命令后面的第一个参数。“command_channel”是执行命令的通道,而“message_database”是存储目标消息的通道。

js prettyprint-override">let msgValue = channel.messages.cache.get(args[0])
client.channels.cache.get(COMMAND_CHANNEL).send(msgValue.content)
js prettyprint-override">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);

我是错过了什么还是犯了什么错误?

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

命令列表:

:write_secret_message--写一个秘密消息,在执行时bot会给你消息ID。

:get_secret_message -根据其ID获取一个秘密消息,执行时bot将向您提供消息内容。

:invite-获取bot invite链接。

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

我的测试消息ID:800372849155637290

共有2个答案

吴浩皛
2023-03-14

我认为您与您发布的第二次尝试相当接近,但是您犯了一个错误,并且您存储获取的消息的方式是关闭的。

错误是您编写的msg.channel.message.fetch(args[0])但应该是msg.channel.message.fetch(args[0])(错误是消息后面缺少s)。请参阅TextChannel的messages属性。

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

第三,如果获取消息,则来自Promise的响应可以在.then方法中使用。您尝试将响应赋给变量msgValue,使用letmsgvalue=msg.channel.message.fetch(args[0]),但这不会达到您期望的效果。这将实际将整个承诺赋给变量。我认为您想要做的只是直接在.then方法中使用来自承诺的响应。

因此,请看下面的代码片段,其灵感来自MessageManager.fetch示例。试一试,看看是否管用。

// 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);
管杜吟
2023-03-14

fetch按承诺返回结果,因此您需要使用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)
 类似资料:
  • 注意:我使用的是discord.jsV11,我知道我打算下个月在我解开我的意大利面条代码之后将它更新到V12。 所以我不知道如何从一条消息中获取messageID,而这条消息已经在机器人中引发了反应。 我希望它的工作方式如下:一个用户对一个消息做出反应,任何消息,反应在bot中编程。然后,bot获取给出该反应的消息url,然后向发送消息。 所以我尝试使用这段代码,但真的无法达到我需要达到的目的:

  • 我正在尝试使用TwilioAPI,我想使用消息内容作为过滤器。所以我想提出一个要求https://api.twilio.com/2010-04-01/Accounts/AccSID/Messages.json?body=“test”,它将包括所有正文中包含单词“test”的消息,无论是入站消息还是出站消息。 在Twilio文档中,我只能找到按发送日期过滤的邮件。上述用例可以通过Twilio实现吗?

  • 问题内容: 在运行存储过程时,该过程可能会引发警告消息。 有什么办法可以在Golang中使用Postgresql驱动程序(https://github.com/lib/pq)获取这些消息? 问题答案: 答案似乎是否定的。 在我的测试中,Postgres服务器似乎没有发送警告和结果。即使这样做,返回错误以及sql.Result充其量也将造成混乱,并且需要进行修改。在函数 中 引发错误 确实 返回了错

  • 我有一个由IOThub触发的Azure函数。所以在Azure函数中,我有 如何从事件数据中获取设备id。 我试过了 它给出了一个错误的说法 以下文件说:https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-messages-construct ConnectionDeviceId包含设备ID。是否有人知道如何从EventDa