如何让 DIScord.js 机器人真正回复消息?

Posted

技术标签:

【中文标题】如何让 DIScord.js 机器人真正回复消息?【英文标题】:How do I make a DIscord.js bot actually reply to a message? 【发布时间】:2021-06-26 08:43:52 【问题描述】:

我一直在制作一个支持“say”命令类型的 Discord.js (V12) 机器人(请注意我是新手),但是当我使用这个“say”命令并单击“reply”时在特定消息中,它只发送我写的消息,根本不显示我正在回复的原始消息。 Here is what I wrote with the bot 和 here the result。

我的“说”命令代码很简单,因为我找不到实际的回复功能,所以我无法添加它(我不得不删除内容以便更准确)。

client.on('message', (message) => 
    if (message.content.startsWith('p:')) 
      //This line reads the content of the message, creates the variable "say" for it.
        var say = message.content;
      //This removes my message, so it can be replaced by bot's one.
        message.delete();
      //This line deletes the prefix from "say" and sends the rest of the message.
        message.channel.send(say.replace('p:', '')
    .catch(() => console.error('Failed to send - Can\'t send empty messages!'));
    
);

我发现还有另一种回复方式。 Here the two: The first one is the normal and the other is by a Tupperhook (Webhook) created by the bot Tupperbox.

有没有办法为机器人制作至少一个版本的 Webhook 回复?

在 Webhook 方法可以工作的情况下,我已经有办法跳转到一个消息(在这个例子中,原始消息正在触发一个特定的命令 - 这将被更改为跳转到回复的消息)嵌入,这是它的代码。

//These should be in the embed command.
//This line recognizes the servers the bot is in.
  var guild = message.guild
//This other line recognizes the channels of the servers.
  var channel = message.channel
//This one sends the word "Message" and includes a link to the message that triggered this command.
  `[Message](https://discordapp.com/channels/$guild.id/$channel.id/$message.id)`

是否可以使我的代码适应任何这些回复功能?我发誓我从一个月开始就在尝试这个。任何答案都非常感谢!

【问题讨论】:

this 回答你的问题了吗? 哇,谢谢你的回答!此外,该线程正在解释没有办法让机器人发送正常回复......所以我可以把那部分放在一边,现在我想知道 Webhook 方法是否最初是由机器人的创建者编码的使用那些 Webhook,如果是这种情况,我想我不能做任何其他事情,我几乎不知道编码......我可以尝试制作自己的方法,但由于我是新人,这将很难 - 以防万一Webhooks 有一种已知的方法,我可以为我的机器人制作一个,我会尝试进行更多调查! 【参考方案1】:

在 v12 中无法做到这一点,但可以通过更具体的 API 请求 Create Message 来实现。

而允许我们回复消息的字段是message_reference

const fetch = require('node-fetch')
client.on("message", (message) => 
  if (message.author.bot) return;
  const url = `https://discord.com/api/v8/channels/$message.channel.id/messages`;
  var payload = 
    content: "Hello, World!",
    tts: false,
    message_reference: 
      message_id: message.id
    
  ;
   fetch(url, 
    method: "POST",
    body: JSON.stringify(payload),
    headers: 
      Authorization: `$client.user?.bot ? "Bot " : ""$client.token`,
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    ,
  ).catch(() =>  );
);

【讨论】:

你不能只使用client.api.channels[channeID].messages.post() 而不是node-fetch 吗?【参考方案2】:

我使用 discord.js v12 的包来回复消息。

如果我理解正确,你想做这样的事情吗?

The result

在 npm 中,安装一个名为“discord-reply”的包。

npm i discord-reply

然后,在您定义 discord.js 的地方,需要 discord-reply 包。这样做:

const discord = require('discord.js');
require('discord-reply'); //IMPORTANT: put this before defining the client
const client = new discord.Client();

然后,而不是 message.send 或 message.reply 只需使用:

message.lineReply('Text goes here')

但是,如果您不想在回复中提及用户,请使用:

message.lineReplyNoMention('Text goes here');

就这么简单!

【讨论】:

以上是关于如何让 DIScord.js 机器人真正回复消息?的主要内容,如果未能解决你的问题,请参考以下文章

从 discord.js 中的消息中获取 Emoji url

即使没有任何错误,我的 discord.js 机器人也不会回复用户消息 [重复]

当有人对消息做出反应时,我如何让我的 discord.js 机器人添加角色?

如何让我的 Discord.JS 机器人对其自己的直接消息做出反应?

如果用户具有特定角色,discord.js 机器人会回复

如何让 discord.js 机器人在不包含前缀和命令名称的情况下重复用户的消息?