如何使用 Node.js 构建 Discord 机器人

作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠

介绍

Discord是一个聊天应用程序,它允许全球数百万用户在称为公会或服务器的社区中进行在线消息和语音聊天Discord 还提供了广泛的 API,开发人员可以使用它来构建强大的 Discord 机器人。机器人可以执行各种操作,例如向服务器发送消息、向用户发送 DM、管理服务器以及在语音聊天中播放音频。这使开发人员可以制作强大的机器人,其中包括高级、复杂的功能,例如审核工具甚至游戏。例如,实用机器人Dyno为数以百万计的公会提供服务,并包含有用的功能,例如垃圾邮件防护、音乐播放器和其他实用功能。学习如何创建 Discord 机器人可以让您实现许多可能性,每天都有成千上万的人与之互动。

在本教程中,您将使用Node.jsDiscord.js从头开始构建一个 Discord 机器人,它允许用户直接与 Discord API 交互。您将为 Discord 机器人设置配置文件,为机器人获取身份验证令牌,并对机器人进行编程,使其能够处理来自用户的带参数的命令。

先决条件

在开始之前,您将需要以下内容:

步骤 1 — 设置 Discord 机器人

在这一步中,您将使用 Discord 开发人员 GUI 来设置 Discord 机器人并获取机器人的令牌,您将将该令牌传递到您的程序中。

为了在 Discord 平台上注册机器人,请使用Discord 应用程序仪表板开发人员可以在这里创建包括 Discord 机器人在内的 Discord 应用程序。

首次访问 https://discord.com/developers/applications 后 Discord 应用程序仪表板的图像

要开始,请单击“新建应用程序”Discord 会要求您输入新应用程序的名称。然后单击创建以创建应用程序。

创建应用程序的提示图像,其中输入了“Test Node.js Bot”作为应用程序的名称

注意:您的应用程序的名称独立于机器人的名称,并且机器人不必与应用程序具有相同的名称。

现在打开您的应用程序仪表板。要将机器人添加到应用程序,请导航到左侧导航栏上的机器人”选项卡。

应用程序仪表板的机器人选项卡的图像

单击添加机器人按钮将机器人添加到应用程序。单击是,执行!按钮,当它提示您确认时。然后,您将进入包含机器人名称、身份验证令牌和个人资料图片的详细信息的仪表板。

包含机器人详细信息的仪表板

您可以在仪表板上修改机器人的名称或个人资料图片。您还需要通过单击“单击以显示令牌”并复制出现的令牌来复制机器人的身份验证令牌

警告:切勿共享或上传您的机器人令牌,因为它允许任何人登录您的机器人。

现在您需要创建一个邀请,允许您添加机器人 Discord 公会,您可以在其中测试机器人。首先,导航到应用程序仪表板OAuth2选项卡。要创建邀请,请向下滚动并选择scopes下的bot您还必须设置权限以控制您的机器人可以在公会中执行的操作。出于本教程的目的,选择Administrator,这将授予您的机器人在公会中执行几乎所有操作的权限。使用复制按钮复制链接。

OAuth2 选项卡,范围设置为“bot”,权限设置为“administator”

接下来,将机器人添加到服务器。按照您刚刚创建的邀请链接。您可以从下拉菜单中将机器人添加到您拥有或拥有管理员权限的任何服务器。

跟随邀请链接的页面,允许用户将机器人添加到服务器

现在点击继续确保您勾选了管理员旁边的复选框——这将授予机器人管理员权限。然后点击授权在机器人加入服务器之前,Discord 会要求您解决验证码现在你必须在服务器添加的僵尸下的成员名单上的龃龉机器人离线

Discord 服务器的成员列表,在成员列表的“离线”部分下有新创建的机器人

您已成功创建 Discord 机器人并将其添加到服务器。接下来,您将编写一个程序来登录机器人。

第 2 步 – 创建您的项目

在此步骤中,您将设置基本编码环境,您将在其中构建机器人并以编程方式登录机器人。

首先,您需要为机器人设置一个项目文件夹和必要的项目文件。

创建您的项目文件夹:

  • mkdir discord-bot

移动到您刚刚创建的项目文件夹中:

  • cd discord-bot

接下来,使用您的文本编辑器创建一个名为的文件,config.json用于存储您的机器人的身份验证令牌:

  • nano config.json

然后将以下代码添加到配置文件中,用机器人的身份验证令牌替换突出显示的文本:

配置文件
{
    "BOT_TOKEN": "YOUR BOT TOKEN"
}

保存并退出文件。

接下来,您将创建一个package.json文件,该文件将存储您的项目的详细信息以及有关您将用于该项目的依赖项的信息。您将package.json通过运行以下npm命令来创建一个文件

  • npm init

npm将询问您有关项目的各种详细信息。如果您需要有关完成这些提示的指导,您可以在How To Use Node.js Modules with npm 和 package.json 中阅读它们

您现在将安装discord.js用于与 Discord API 交互包。您可以discord.js使用以下命令通过 npm安装

  • npm install discord.js

现在您已经设置了配置文件并安装了必要的依赖项,您可以开始构建您的机器人了。在实际应用程序中,一个大型机器人将被拆分为多个文件,但就本教程而言,机器人的代码将位于一个文件中。

首先,在代码文件夹中创建一个名为index.jsdiscord-bot文件:

  • nano index.js

通过要求discord.js依赖项和带有机器人令牌的配置文件开始对机器人进行编码

索引.js
const Discord = require("discord.js");
const config = require("./config.json");

在此之后,添加接下来的两行代码:

索引.js
...
const client = new Discord.Client();

client.login(config.BOT_TOKEN);

保存并退出您的文件。

第一行代码创建一个 newDiscord.Client并将其分配给常量client该客户端部分是您将如何与 Discord API 交互以及 Discord 如何通知您新消息等事件的方式。实际上,客户端代表 Discord 机器人。

第二行代码使用 上的login方法client登录您创建的 Discord 机器人,使用config.json文件中的令牌作为密码。该令牌让 Discord API 知道该程序适用于哪个机器人,并且您已获得使用该机器人的身份验证。

现在,index.js使用 Node执行文件:

  • node index.js

您的机器人在您添加到的 Discord 服务器中的状态将更改为在线。

机器人在线图像

您已成功设置编码环境并创建用于登录 Discord 机器人的基本代码。在下一步中,您将处理用户命令并让您的机器人执行操作,例如发送消息。

第 3 步 – 处理您的第一个用户命令

在这一步中,您将创建一个可以处理用户命令的机器人。您将实现您的第一个 command ping,它将响应"pong"该命令以及响应该命令所花费的时间。

首先,您需要检测并接收用户发送的任何消息,以便您可以处理任何命令。使用onDiscord 客户端上方法,Discord 将向您发送有关新事件的通知。on方法有两个参数:要等待的事件的名称和每次该事件发生时要运行的函数。使用此方法,您可以等待事件message— 每次将消息发送到机器人有权查看消息的公会时,都会发生这种情况。因此,让我们创建一个函数,该函数在每次发送消息时运行,以处理命令。

首先打开你的文件:

  • nano index.js

将以下代码添加到您的文件中:

索引.js
...
const client = new Discord.Client();


client.on("message", function(message) { 
                                         
});                                      

client.login(config.BOT_TOKEN);

这个在message事件上运行的函数接受message一个参数。message将具有Discord.js 消息实例的值,其中包含有关已发送消息和帮助机器人响应的方法的信息。

现在将以下代码行添加到您的命令处理函数中:

索引.js
...
client.on("message", function(message) {
  if (message.author.bot) return;
});
...

此行检查消息的作者是否是机器人,如果是,则停止处理命令。这很重要,因为通常您不想处理或响应机器人的消息。机器人通常不需要或不想使用我们的机器人,因此忽略它们的消息可以节省处理能力并有助于防止意外回复。

现在您将编写一个命令处理程序。为此,最好了解 Discord 命令的常用格式。通常,Discord 命令的结构包含按以下顺序排列的三个部分:前缀、命令名称和(有时)命令参数。

典型的 Discord 命令读取“!add 1 2”的图像

  • 前缀:前缀可以是任何东西,但通常是一段通常不会出现在消息开头的标点符号或抽象短语。这意味着当您在消息的开头包含前缀时,机器人将知道此命令的意图是让机器人处理它。

  • 命令名称:用户要使用的命令的名称。这意味着机器人可以支持具有不同功能的多个命令,并允许用户通过提供不同的命令名称在它们之间进行选择。

  • 参数:有时如果命令需要或使用来自用户的额外信息,用户可以在命令名称后提供参数,每个参数用空格分隔。

注意:没有强制的命令结构,机器人可以按照他们喜欢的方式处理命令,但这里介绍的结构是绝大多数机器人使用的有效结构。

要开始创建处理此格式的命令解析器,请将以下代码行添加到消息处理函数中:

索引.js
...
const prefix = "!";

client.on("message", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;
});
...

您添加第一行代码以将值分配给"!"常量prefix,您将使用它作为机器人的前缀。

您添加的第二行代码检查机器人正在处理的消息内容是否以您设置的前缀开头,如果不是,则停止继续处理消息。

现在您必须将消息的其余部分转换为命令名称和消息中可能存在的任何参数。添加以下突出显示的行:

索引.js
...
client.on("message", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const commandBody = message.content.slice(prefix.length);
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();
});
...

您使用此处的第一行从消息内容中删除前缀并将结果分配给常量commandBody这是必要的,因为您不想在解析的命令名称中包含前缀。

第二行采用删除前缀的消息并在其上使用split方法,以空格作为分隔符。这将其拆分为一个子字符串数组,在有空格的地方进行拆分。这会产生一个包含命令名称的数组,如果包含在消息中,则包含任何参数。您将此数组分配给常量args

第三行从args数组中删除第一个元素(将是提供的命令名称),将其转换为小写,然后将其分配给常量command这允许您隔离命令名称并仅在数组中保留参数。您还可以使用该方法,toLowerCase因为 Discord 机器人中的命令通常不区分大小写。

您已经完成了命令解析器的构建、实现所需的前缀以及从消息中获取命令名称和任何参数。您现在将实现并创建特定命令的代码。

添加以下代码以开始执行ping命令:

索引.js
...
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();

  if (command === "ping") {
                           
  }                        
});
...

if语句检查您解析的命令名称(分配给常量command)是否匹配"ping"如果是,则表明用户想要使用该"ping"命令。您将在if语句块中嵌套特定命令的代码您将对要实现的其他命令重复此模式。

现在,您可以实现"ping"命令的代码

索引.js
...
  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
  }
...

保存并退出您的文件。

您添加"ping"命令块,用于计算当前时间(使用对象上的now方法找到)Date与创建消息时的时间戳(以毫秒为单位)之间的差异这会计算消息处理所需的时间和"ping"机器人的时间。

第二行使用常量reply上的方法响应用户的命令messagereply方法ping(通知用户并突出显示指定用户的消息)调用该命令的用户,然后是作为该方法的第一个参数提供的内容。您提供一个模板文字,其中包含一条消息和计算出的 ping 作为该reply方法将使用的响应

执行"ping"命令到此结束

使用以下命令运行您的机器人(在与 相同的文件夹中index.js):

  • node index.js

您现在"!ping"可以在机器人可以查看和发送消息的任何渠道中使用该命令,从而产生响应。

机器人在 Discord 中用“@T0M,Pong!这条消息的延迟为 1128 毫秒”回复“!ping”的图像。

您已经成功创建了一个可以处理用户命令的机器人,并且您已经实现了您的第一个命令。在下一步中,您将通过实施 sum 命令继续开发您的机器人。

第 4 步 – 实现 Sum 命令

现在您将通过执行"!sum"命令来扩展您的程序该命令将接受任意数量的参数并将它们加在一起,然后将所有参数的总和返回给用户。

如果您的 Discord 机器人仍在运行,您可以使用CTRL + C.

index.js再次打开您的文件:

  • nano index.js

要开始执行该"!sum"命令,您将使用一个else-if块。检查 ping 命令名称后,它将检查命令名称是否等于"sum"我们使用一个else-if块,因为一次只处理一个命令,所以如果程序与命令名称匹配"ping",它就不必检查"sum"命令。将以下突出显示的行添加到您的文件中:

索引.js
...
  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
  }

  else if (command === "sum") {
                               
  }                            
});
...

您可以开始实现"sum"命令的代码"sum"命令的代码将放入else-if您刚刚创建块中。现在,添加以下代码:

索引.js
...
  else if (command === "sum") {
    const numArgs = args.map(x => parseFloat(x));
    const sum = numArgs.reduce((counter, x) => counter += x);
    message.reply(`The sum of all the arguments you provided is ${sum}!`);
  }
...

您可以使用参数列表上map方法通过parseFloatargs数组中的每个项目上使用该函数来创建新列表这将创建一个新数组(分配给常量numArgs),其中所有项都是数字而不是字符串。这意味着稍后您可以通过将它们相加来成功找到数字的总和。

第二行使用了常量reduce方法numArgs提供了一个对列表中所有元素求和的函数。您将所有元素的总和分配给numArgs常量sum

然后,您可以使用reply消息对象上方法使用模板文字回复用户的命令,该模板文字包含用户发送给机器人的所有参数的总和。

执行"sum"命令到此结束现在使用以下命令(在与 相同的文件夹中index.js运行机器人

  • node index.js

您现在"!sum"可以在机器人可以查看和发送消息的任何渠道中使用该命令。

机器人回复“您提供的所有参数之和为 6!”的图片  到“!sum 1 2 3”,然后回复“您提供的所有参数的总和是 13!”到“!sum 1.5 1.5 10”

以下是index.js机器人脚本的完整版本

索引.js
const Discord = require("discord.js");
const config = require("./config.json");

const client = new Discord.Client();

const prefix = "!";

client.on("message", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const commandBody = message.content.slice(prefix.length);
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();

  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
  }

  else if (command === "sum") {
    const numArgs = args.map(x => parseFloat(x));
    const sum = numArgs.reduce((counter, x) => counter += x);
    message.reply(`The sum of all the arguments you provided is ${sum}!`);
  }
});

client.login(config.BOT_TOKEN);

在这一步中,您通过执行sum命令进一步开发了 Discord 机器人

结论

您已经成功实现了一个 Discord 机器人,它可以处理多个不同的用户命令和命令参数。如果你想扩展你的机器人,你可以实现更多的命令或尝试更多的 Discord API 部分来制作一个强大的 Discord 机器人。您可以查看Discord.js 文档Discord API 文档以扩展您对 Discord API 的了解。

在创建 Discord 机器人时,您必须始终牢记Discord API 服务条款,其中概述了开发人员必须如何使用 Discord API。您还可以阅读这组关于如何最好地实施 Discord 机器人的指南,并提供有关如何设计 Discord 机器人的提示。如果您想了解有关 Node.js 的更多信息,请查看我们的如何在 Node.js 系列中编码

觉得文章有用?

点个广告表达一下你的爱意吧 !😁