介绍
Discord 是一款聊天应用,全球数百万用户可以通过它在线发送消息和语音聊天,这些聊天室被称为公会或服务器。Discord 还提供丰富的 API,开发者可以利用这些 API 构建功能强大的 Discord 机器人。机器人可以执行各种操作,例如向服务器发送消息、私信用户、管理服务器以及在语音聊天中播放音频。这使得开发者能够构建具有高级复杂功能的强大机器人,例如管理工具或游戏。例如,Dyno Tool 机器人服务于数百万个社区,并拥有垃圾邮件防护、音乐播放器等实用功能。学习创建 Discord 机器人将使您能够实现各种各样的功能,这些功能每天都会与成千上万的用户互动。.
在本教程中,您将使用 Node.js 和 Discord.js 库从零开始构建一个 Discord 机器人,该库允许用户直接与 Discord API 交互。您将为 Discord 机器人设置配置文件,获取机器人的身份验证令牌,并编写程序使机器人能够处理带有用户参数的命令。.
先决条件
开始之前,您需要准备:
- 您的开发机器上已安装Node.js。.
- 您可以选择任何文本编辑器,例如 Visual Studio Code、Atom、Sublime 或 Nano。.
- 一个免费的 Discord 账号(需已验证邮箱账号)和一个免费的 Discord 服务器,用于测试您的 Discord 机器人。.
步骤 1 – 设置 Discord 机器人
在此步骤中,您可以使用 Discord 开发者图形用户界面 (GUI) 启动 Discord 机器人并获取机器人令牌,然后将其传递给您的应用程序。.
要在 Discord 平台上注册机器人,请使用 Discord 应用控制面板。开发者可以在这里创建 Discord 应用,包括 Discord 机器人。.
首先,点击“新建应用”。Discord 会要求你为新应用输入名称。然后点击“创建”即可创建应用。.
注意:您的应用程序名称与机器人名称无关,机器人名称也不一定是应用程序的名称。.
现在打开您的应用控制面板。要向您的应用添加机器人,请转到左侧导航栏中的“机器人”选项卡。.
点击“添加机器人”按钮,将机器人添加到应用中。当系统提示您确认时,点击“是,执行!”。之后,您将进入一个控制面板,其中包含机器人名称、身份验证令牌和您的个人资料图片等详细信息。.
您可以在此控制面板中更改机器人名称或头像。您还需要复制机器人身份验证令牌,方法是点击“点击显示令牌”并复制显示的令牌。.
警告:切勿分享或上传您的机器人令牌,因为这将允许任何人登录您的机器人。.
现在你需要创建一个邀请,将机器人添加到 Discord 社群进行测试。首先,前往应用控制面板 OAuth2 选项卡下的 URL 生成器页面。要创建邀请,请向下滚动并在“权限范围”下选择机器人。你还需要设置权限来控制机器人在社群中可以执行的操作。在本教程中,选择“管理员”权限,这将允许你的机器人在公会中执行几乎所有操作。点击“复制”按钮复制链接。.
然后将机器人添加到服务器。点击您创建的邀请链接。您可以将机器人添加到您拥有的任何服务器,或者在下拉菜单中选择具有管理员权限的服务器。.
现在点击“继续”。请务必勾选“管理员”旁边的复选框——这将授予机器人管理员权限。然后点击“授权”。Discord 会要求您完成验证码验证,机器人才能加入服务器。现在,您将在添加机器人的服务器成员列表中看到该 Discord 机器人,其状态将显示为“离线”。.
您已成功创建了一个 Discord 机器人并将其添加到服务器。接下来,您将编写一个程序来登录该机器人。.
步骤 2 – 创建您的项目
在此步骤中,您将设置初始编码环境,在其中构建您的机器人并以编程方式进入机器人。.
首先,你需要为机器人设置一个项目文件夹和必要的项目文件。.
创建项目文件夹:
mkdir discord-bot
转到您创建的项目文件夹:
cd discord-bot
接下来,使用文本编辑器创建一个名为 config.json 的文件,用于存储机器人的身份验证密码:
nano config.json
然后将以下代码添加到配置文件中,并将高亮显示的文本替换为您的机器人身份验证令牌:
{
"BOT_TOKEN": "YOUR BOT TOKEN"
}
保存文件并退出。.
接下来,您需要创建一个 package.json 文件,用于存储项目的详细信息以及项目所使用的依赖项信息。您可以通过运行以下 npm 命令来创建 package.json 文件:
npm init
npm 会询问您有关项目的各种详细信息。.
现在您需要安装 discord.js 包,该包将用于与 Discord API 进行交互。您可以使用以下命令通过 npm 安装 discord.js:
npm install discord.js
现在您已经设置好了配置文件并安装了必要的依赖项,可以开始构建您的机器人了。在实际应用中,大型机器人通常会分布在多个文件中,但在本教程中,您的机器人代码将放在一个单独的文件中。.
首先,在 discord-bot 文件夹中创建一个名为 index.js 的文件,用于存放代码:
nano index.js
首先,引入 discord.js 依赖项,并添加一个包含机器人令牌的配置文件,即可开始编写机器人代码:
const Discord = require("discord.js");
const config = require("./config.json");接下来,添加以下两行代码:
...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.login(config.BOT_TOKEN);保存文件并退出。.
第一行代码创建了一个新的 Discord 客户端并将其分配给指定的客户端。该客户端是与 Discord API 交互以及 Discord 接收新消息等事件通知的部分方式。客户端实际上代表了 Discord 机器人。传递给 Client 构造函数的对象指定了机器人的网关意图。这指定了机器人将监听哪些 WebSocket 事件。这里您指定了 GUILD_MESSAGES,以便机器人可以接收论坛中的消息事件。.
第二行代码使用客户端登录方法登录您创建的 Discord 机器人,密码为 config.json 文件中的密码。令牌让 Discord API 知道该应用程序是为哪个机器人设计的,以及您已通过身份验证可以使用该机器人。.
现在使用Node运行index.js文件:
node index.js
您的机器人会在您添加它的 Discord 服务器上变为在线状态。.
您已成功搭建编码环境并创建了登录 Discord 机器人的基本代码。接下来,您将处理用户命令并让您的机器人执行诸如发送消息之类的操作。.
步骤 3 – 处理用户的第一个命令
在这一步中,您将创建一个可以处理用户命令的机器人。您执行第一个 ping 命令,该命令会返回“ping”以及响应命令所花费的时间。.
首先,你需要检测并接收用户发送的消息,以便处理各种命令。Discord 客户端的 `on` 方法会向你发送新事件的通知。`on` 方法接受两个参数:要等待的事件名称和一个每次事件发生时都会执行的函数。通过这个方法,你可以等待事件消息——每当机器人有权查看的论坛收到消息时,就会触发此事件。因此,你需要创建一个函数,该函数会在每次收到消息时执行,以处理命令。.
首先,打开你的文件:
nano index.js
将以下代码添加到您的文件中:
...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.on("messageCreate", function(message) {
});
client.login(config.BOT_TOKEN);此函数在 messageCreate 事件中运行,并将消息作为参数。消息将是一个 Discord.js 消息实例,其中包含有关所发送消息的信息以及帮助机器人响应的方法。.
现在将以下代码行添加到您的命令控制函数中:
...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
});
...这行代码会检查消息的发送者是否是机器人,如果是,则停止处理该命令。这一点很重要,因为通常情况下,我们不希望处理或回复机器人发送的消息。机器人通常不需要使用来自其他机器人的信息,因此忽略它们的消息可以节省处理能力并防止出现随机响应。.
现在你要编写一个控制器命令。为此,最好先了解一下 Discord 命令的典型格式。通常,Discord 命令的结构由三部分组成,顺序如下:前缀、命令名称,以及(有时)命令参数。.
- 前缀:前缀可以是任何内容,但通常是标点符号或抽象短语,一般不会出现在消息开头。这意味着,当您在消息开头输入前缀时,机器人会理解此命令旨在由机器人处理。.
- 命令名称:用户想要使用的命令名称。这意味着机器人可以支持多个具有不同功能的命令,并允许用户通过提供不同的命令名称来选择要使用的命令。.
- 参数:有时,如果命令需要或使用用户提供的附加信息,用户可以在命令名称后提供参数,每个参数之间用空格分隔。.
注意:没有强制性的命令结构,机器人可以按照自己的方式处理命令,但这里提供的结构是绝大多数机器人都在使用的可行结构。.
要开始创建能够处理此格式的命令解析器,请将以下代码行添加到消息处理函数中:
...
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
});
...您将代码的第一行添加到值“!”中,并将其添加到您将用作机器人前缀的常量前缀中。.
你添加的第二行代码会检查机器人正在处理的消息内容是否以你设置的前缀开头,如果不是,则停止处理该消息。.
现在,您需要将消息的其余部分转换为命令名称及其所有参数。添加以下高亮显示的行:
...
client.on("messageCreate", 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();
});
...这里的第一行代码用于从消息内容中移除前缀,并将结果赋值给常量命令体。这是必要的,因为您不希望解析后的命令名称中包含前缀。.
第二行代码获取去除前缀后的消息,并使用 split 方法以空格作为分隔符将其分割成子字符串数组。分割操作会在空格处进行。最终得到的数组包含命令名称,以及消息中包含的任何参数。将此数组赋值给常量 args。.
第三行代码从 args 数组中移除第一个元素(即提供的命令名称),将其转换为小写,然后赋值给常量 command。这样可以提取命令名称,数组中只保留参数。之所以使用 toLowerCase 方法,是因为 Discord 机器人中的命令通常不区分大小写。.
您已完成命令解析器的构建,实现了所需的前缀,并从消息中检索了命令名称及其所有参数。现在,您将实现并生成特定命令的代码。.
添加以下代码以启动 ping 命令:
...
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {
}
});
...这条 if 语句检查你解析出的命令名称(已分配给常量命令)是否与“ping”匹配。如果匹配,则表示用户想要使用“ping”命令。你需要将具体的命令代码放在 if 语句块中。对于其他要执行的命令,你需要重复此模式。.
现在你可以实现“ping”命令代码了:
...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
...保存文件并退出。.
您可以添加一个“ping”命令块,该命令块会计算当前时间(使用Date对象的new方法获取)与已创建消息的时间戳之间的毫秒差。此计算结果即为处理消息并“ping”机器人所花费的时间。.
第二行使用消息常量中的 reply 方法响应用户的命令。reply 方法会向调用命令的用户发送 ping 消息(通知该用户并高亮显示该用户的消息),然后发送作为该方法第一个参数提供的内容。您需要提供一个包含消息和计算出的 ping 值的字面模式,作为 reply 方法将使用的响应。.
至此,“ping”命令的执行结束。.
使用以下命令运行您的机器人(位于与 index.js 相同的文件夹中):
node index.js
现在,您可以在机器人可以看到并发送消息的任何频道上使用“!ping”命令,并获得相应的响应。.
您已成功创建了一个可以处理用户命令的机器人,并执行了您的第一个命令。接下来,您将通过执行求和命令来继续开发您的机器人。.
步骤 4 – 执行求和命令
现在,您将运行“!sum”命令来扩展您的程序。该命令接受任意数量的参数,并将它们相加,然后将所有参数的总和返回给用户。.
如果你的 Discord 机器人仍在运行,你可以使用 CTRL + C 停止其进程。.
重新打开 index.js 文件:
nano index.js
您使用 else-if 代码块来开始执行“!sum”命令。在检查命令名称是否为“ping”之后,程序会检查命令名称是否等于“sum”。之所以使用 else-if 代码块,是因为程序一次只能处理一个命令,所以如果程序匹配到命令名称“ping”,则无需检查“sum”命令。请将以下高亮显示的行添加到您的文件中:
...
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代码块中。现在添加以下代码:
...
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 方法,通过对 args 数组中的每个元素调用 parseFloat 函数来创建一个新列表。这将创建一个新数组(赋值为常量 numArgs),其中所有元素都是数字而不是字符串。这意味着之后您可以通过将这些数字相加来成功计算出它们的总和。.
第二行代码对常量 numArgs 使用了 reduce 方法,该方法提供了一个函数,用于计算列表中所有元素的总和。您将 numArgs 中所有元素的总和赋值给常量 sum。.
然后,您可以使用消息对象的回复方法来响应用户的命令,该回复使用实际模式,其中包括用户发送给机器人的所有参数的总和。.
“sum”命令执行完毕。现在使用以下命令运行机器人(在同一个index.js文件夹中):
node index.js
现在,您可以在机器人可以查看和发送消息的任何频道中使用“!sum”命令。.
以下是 index.js 机器人脚本的完整版本:
const Discord = require("discord.js");
const config = require("./config.json");
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
const prefix = "!";
client.on("messageCreate", 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 机器人。.




















