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

_ 作者选择了 免费和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

[Discord] (https://discord.com/)是一种聊天应用程序,它允许全球数百万用户在被称作guilds或服务器的社区上在线信息和语音聊天. Discord还提供了广泛的API,开发者可以用来构建强大的Discord bots. Bots可以执行各种动作,例如向服务器发送消息,DM-ing用户,调制服务器,以及在语音聊天中播放音频. 这使得开发者可以设计出包括节制工具甚至游戏等先进而复杂的特性的强大的bots. 例如,公用botDyno服务于上百万盾并包含垃圾邮件保护,音乐播放器等实用功能,以及其他公用功能. 学会如何创建Discord bots 让你可以实现许多可能性, 每天有上千人可以和它们互动.

在本教程中,您将使用 Node.jsDiscord.js 库构建一个 Discord 机器人,允许用户直接与 Discord API 进行交互。

前提条件

在你开始之前,你需要以下几点:

  • 安装在开发机上的节点。 要在 macOS 或 Ubuntu 20.04 上安装,请遵循 [如何在 macOS (https://andsky.com/tech/tutorials/how-to-install-node-js-and-create-a-local-development-environment-on-macos) 上安装节点并创建本地开发环境(https://andsky.com/tech/tutorials/how-to-install-node-js-on-ubuntu-20-04) 或 使用节点源 PPA 部分的** Installing Node.js with Aptent Ubuntu 20.04 (https://andsky.com/tech/tutorials/how-to-install-node-js-on-ubuntu-20-04) 的步骤。
  • 联合国 您所选择的任何文本编辑器,例如[Visual Studio Code (https://code.visualstudio.com/),[Atom (https://atom.io),[Sublime (https://www.sublimetext.com/),或[nano (https://www.nano-editor.org/).
  • A [免费Discord account] (https://discord.com/register) 有经过验证的电子邮件账户和[免费Discord服务器] (https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server-) 您将用来测试您的Discord bot. .

步骤1 - 设置一个 Discord 机器人

在此步骤中,您将使用 Discord 开发者图形用户界面 (GUI) 来设置一个 Discord 机器人并获得机器人的代币,您将将其传输到您的程序中。

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

Image of the Discord application dashboard after first visiting https://discord.com/developers/applications

要开始,点击 新应用程序 . Discord 将要求您输入新应用程序的名称,然后点击** Create** 来创建应用程序。

Image of the prompt to create an application, with "Test Node.js Bot" entered as the name of the application

注意:您的应用程序的名称与机器人的名称无关,机器人不必与应用程序具有相同的名称。

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

Image of the bot tab of the application dashboard

点击添加机器人按钮,将机器人添加到应用程序中,点击Yes, do it!按钮,当它提示您进行确认时,您将出现在一个仪表板上,其中包含您的机器人名称、身份验证令牌和个人资料图像的详细信息。

Dashboard containing details of your bot

您可以在仪表板上修改您的机器人的名称或个人资料图像,您还需要通过点击 Click to Reveal Token 来复制机器人的身份验证令牌,并复制出现的令牌。

警告: 永远不要分享或上传你的机器人代币,因为它允许任何人登录你的机器人。

现在,你需要创建一个邀请函,将机器人添加到Discord盾中,在那里你可以测试. 首先,在应用仪表板的OAuth2 分页下浏览** URL生成器** 页. 要创建邀请, 向下滚动, 在** scopes** 下选择 ** bot** 。 您还必须设置权限来控制您的机器人在盾形上可以执行的动作 。 为此教程的目的, 请选择** 管理员 ** , 这将允许您以 盾 执行几乎所有动作 。 复制链接到** Copy** 按钮.

OAuth2 tab, with scope set to "bot" and permissions set to "administator"

接下来,将机器人添加到服务器中,然后跟随您刚刚创建的邀请链接,您可以将机器人添加到您所拥有的任何服务器上,或者从下载菜单中拥有管理员权限。

Page from following the invite link, allowing users to add the bot to servers

现在点击 Continue . 确保您在** Administrator** 旁边的标记框中标记 – 这将授予机器人管理员的权限。 然后点击** Authorize** . Discord 将要求您在机器人加入服务器之前解决一个 CAPTCHA

Members list of a Discord server with the newly created bot under the "offline" section of the members list

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

第2步:创建你的项目

在此步骤中,您将设置基本的编码环境,在那里您将建立您的机器人,并在程序上登录机器人。

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

创建您的项目文件夹:

1mkdir discord-bot

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

1cd discord-bot

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

1nano config.json

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

1[label discord-bot/config.json]
2{
3    "BOT_TOKEN": "YOUR BOT TOKEN"
4}

保存和退出文件。

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

1npm init

如果您想了解如何完成这些提示,您可以在 [如何使用 Node.js 模块与 npm 和 package.json] 中阅读这些提示(https://andsky.com/tech/tutorials/how-to-use-node-js-modules-with-npm-and-package-json# step-1-%E2%80%94-creating-a-packagejson-file)。

您现在将安装discord.js包,您将使用它与Discord API进行交互,您可以通过以下命令通过npm安装discord.js:

1npm install discord.js

现在你已经设置了配置文件并安装了必要的依赖性,你已经准备好开始构建你的机器人. 在现实世界的应用程序中,一个大机器人将被分割在许多文件中,但为本教程的目的,你的机器人的代码将位于一个文件中。

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

1nano index.js

开始编码机器人,要求discord.js依赖并使用机器人的代码配置文件:

1[label discord-bot/index.js]
2const Discord = require("discord.js");
3const config = require("./config.json");

接下来,添加以下两行代码:

1[label discord-bot/index.js]
2...
3const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
4
5client.login(config.BOT_TOKEN);

保存和退出您的文件。

准则一行创建了新的Discord'。 客户 " 并将其分配给经常的 " 客户 " 。 此客户端部分是您将如何与 Discord API 互动,以及Discord 将新消息等事件通知您 。 客户端实际上代表了Discord bot. 传入Client'构造器的物体指定了您的机器人的出入口意图。 这定义了WebSocket事件, 您的机器人会听 。 在此您指定了 GUILDSGUILD_MESSAGES , 以使机器人能够用盾接收消息事件 .

第二行代码使用客户端上的登录方法登录您创建的 Discord 机器人,使用config.json文件中的代码作为密码。

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

1node index.js

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

Image of the bot online

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

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

在此步骤中,您将创建一个可以处理用户命令的机器人,您将执行您的第一个命令ping,该命令将响应pong和响应命令所需的时间。

首先,您需要检测并接收用户发送的任何信件,以便您能够处理任何命令. Discord客户端使用on ' 方法,Discord将向您发送关于新事件的通知。 on ' 方法需要两个论据:等待事件的名称和每次事件发生的运行功能。 使用这种方法, 您可以等待message 事件, 每次发送信件到机器人有权限查看信件的盾时都会发生 。 因此,您将创建一个函数, 每次发送消息到处理命令时都会运行 .

首先打开你的文件:

1nano index.js

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

1[label discord-bot/index.js]
2...
3const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
4
5client.on("messageCreate", function(message) { 
6
7});                                      
8
9client.login(config.BOT_TOKEN);

这个函数运行在)实例的值,其中包含有关发送的消息和方法的信息,以帮助机器人响应。

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

1[label discord-bot/index.js]
2...
3client.on("messageCreate", function(message) {
4  if (message.author.bot) return;
5});
6...

此行检查消息的作者是否是机器人,如果是这样,就停止处理命令。这很重要,因为你通常不希望处理或响应机器人的消息。

现在你将写一个命令处理器. 要做到这一点,了解一个Discord命令的常见格式是很好的. 通常,一个Discord命令的结构包含以下三个部分:一个前缀,一个命令名称和(有时)命令参数。

An image of a typical Discord command reading "!add 1 2"

  • 前缀:前缀可以是任何东西,但一般是一个平分或抽象的短语,通常不会在消息开头. 这意味着当您在消息开头包含前缀时,bot会知道这个命令的意图是让一个bot处理它.
  • 命令名:用户想使用的命令名. 这意味着bot可以支持具有不同功能的多个命令,并且允许用户通过提供不同的命令名称来选择它们.
  • 参数:有时如果命令需要或使用用户的额外信息,用户可以在命令名后提供参数,每个参数由空格相隔. .

注:没有强制执行的命令结构,机器人可以随心所欲地处理命令,但这里呈现的结构是一个高效的结构,绝大多数机器人使用。

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

1[label discord-bot/index.js]
2...
3const prefix = "!";
4
5client.on("messageCreate", function(message) {
6  if (message.author.bot) return;
7  if (!message.content.startsWith(prefix)) return;
8});
9...

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

您添加的第二行代码会检查机器人正在处理的消息的内容是否始于您设置的序列,如果没有,则会阻止消息继续处理。

现在,您必须将消息的其余部分转换为命令名称以及可能存在的任何参数。

 1[label discord-bot/index.js]
 2...
 3client.on("messageCreate", function(message) {
 4  if (message.author.bot) return;
 5  if (!message.content.startsWith(prefix)) return;
 6
 7  const commandBody = message.content.slice(prefix.length);
 8  const args = commandBody.split(' ');
 9  const command = args.shift().toLowerCase();
10});
11...

您可以使用这里的第一个行从消息内容中删除前缀,并将结果分配到常数commandBody

第二行采用了删除前缀的消息,并使用了 split 方法在其上,以一个空间作为分离器。这将它分成一个子串的数组,在任何一个空间中进行分割。 这将导致一个包含命令名称的数组,然后,如果包含在消息中,任何参数。

第三行将第一个元素从),将其转换为下行,然后将其分配到常数命令

您已完成构建命令解析器,实施所需的前缀,并从消息中获取命令名称和任何参数。

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

 1[label discord-bot/index.js]
 2...
 3  const args = commandBody.split(' ');
 4  const command = args.shift().toLowerCase();
 5
 6  if (command === "ping") {
 7
 8  }                        
 9});
10...

if 声明检查您解析的命令名(分配给常态 命令)是否匹配 ping. 如果是,则表明用户希望使用 ping 命令。您将嵌入具体命令的代码在 if 命令块中。您将重复此模式,以便您想要执行的其他命令。

现在,你可以执行ping命令的代码:

1[label discord-bot/index.js]
2...
3  if (command === "ping") {
4    const timeTaken = Date.now() - message.createdTimestamp;
5    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
6  }
7...

保存和退出您的文件。

您添加了)(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now)在Date对象上的差异,以及在毫秒内创建消息时的时刻标记。

第二行在) pings(它通知用户并突出指定用户的信息) 引用指令的用户,然后是作为方法的第一个论据提供的内容. 您提供一个包含一个消息和计算出的ping的[template liter (https://andsky.com/tech/tutorials/understanding-template-literals-in-javascript)作为`reply'方法将使用的反应.

最后,执行ping命令。

使用下列命令运行你的机器人(与index.js 相同的文件夹):

1node index.js

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

Image of bot replying in Discord to "!ping" with "@T0M, Pong! This message had a latency of 1128ms."

你已经成功创建了一个可以处理用户命令的机器人,你已经实现了你的第一个命令。

步骤4 – 实施 Sum 命令

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

如果您的 Discord 机器人仍在运行,您可以用CTRL + C停止其进程。

再次打开 index.js 文件:

1nano index.js

要开始实施"!sum命令,你会使用一个else-if块。在检查 ping命令名后,它会检查命令名是否等于sum。你会使用一个else-if块,因为一次只有一条命令会处理,所以如果程序匹配命令名ping,它不需要检查sum命令。

 1[label discord-bot/index.js]
 2...
 3  if (command === "ping") {
 4    const timeTaken = Date.now() - message.createdTimestamp;
 5    message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
 6  }
 7
 8  else if (command === "sum") {
 9
10  }                            
11});
12...

您可以开始执行命令sum的代码,命令sum的代码将进入您刚刚创建的else-if块中。

1[label discord-bot/index.js]
2...
3  else if (command === "sum") {
4    const numArgs = args.map(x => parseFloat(x));
5    const sum = numArgs.reduce((counter, x) => counter += x);
6    message.reply(`The sum of all the arguments you provided is ${sum}!`);
7  }
8...

您使用参数列表中的 [映射法' (https://andsky.com/tech/tutorials/how-to-use-array-methods-in-javascript-iteration-methods# map( ) 创建新列表,方法是在 ) 函数。 这就产生了一个新的数组(指定为常数numArgs'),其中所有项目都是数字而不是字符串。 这意味着以后你可以通过加起来找到数字的总和.

第二行使用 reduce 方法在常数 numArgs 提供一个函数,将列表中的所有元素总和。

然后,您使用消息对象上的),其中包含用户发送给机器人的所有参数的总和。

现在运行机器人使用以下命令(在同一个文件夹中作为index.js):

1node index.js

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

Image of bot replying "The sum of all the arguments you provided is 6!" to "!sum 1 2 3", then replying "The sum of all the arguments you provided is 13! to "!sum 1.5 1.5 10"

以下是index.js bot 脚本的完整版本:

 1[label discord-bot/index.js]
 2const Discord = require("discord.js");
 3const config = require("./config.json");
 4
 5const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
 6
 7const prefix = "!";
 8
 9client.on("messageCreate", function(message) {
10  if (message.author.bot) return;
11  if (!message.content.startsWith(prefix)) return;
12
13  const commandBody = message.content.slice(prefix.length);
14  const args = commandBody.split(' ');
15  const command = args.shift().toLowerCase();
16
17  if (command === "ping") {
18    const timeTaken = Date.now() - message.createdTimestamp;
19    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
20  }
21
22  else if (command === "sum") {
23    const numArgs = args.map(x => parseFloat(x));
24    const sum = numArgs.reduce((counter, x) => counter += x);
25    message.reply(`The sum of all the arguments you provided is ${sum}!`);
26  }
27});
28
29client.login(config.BOT_TOKEN);

在此步骤中,您通过执行sum命令来进一步开发您的 Discord 机器人。

结论

您已经成功执行了一个Discord bot, 它可以处理多个不同的用户命令和命令参数 。 如果您想要扩展您的机器人, 您可以执行更多命令, 或者尝试更多 Discord API 的部分来设计一个强大的 Discord 机器人 。 您可以审查Discord.js文档Discord API文档,以扩展你对Discord API的知识. 特别是,您可以将您的机器人命令转换为 [slash 命令 (https://discordjs.guide/interactions/registering-slash-commands.html guild-commands),这是Discord.js v13的最佳做法.

在创建 Discord 机器人时,您必须始终记住 Discord API 服务条款,它概述了开发人员应该如何使用 Discord API。 如果您想了解更多关于 Node.js 的信息,请查看我们的 如何在 Node.js 系列中编码

Published At
Categories with 技术
comments powered by Disqus