构建和部署 Discord 机器人的步骤
在本文中,您将使用 Node.js、官方 discord.js 库和 Back4app 容器构建并部署一个 Discord 机器人。
Discord 机器人是在 Discord 上执行自动任务的程序。这些机器人可以与用户互动、管理社区行为,并提供 Discord 默认情况下无法提供的额外功能,如播放音乐、管理内容、组织投票以及与外部服务或 API 集成。
Contents
设置开发环境
本文将介绍一个 Discord 机器人,它能根据用户在 Discord 服务器上偏好的难度和问题类型,为用户提供小问题答案。
要学习本教程,您需要具备以下条件:
运行下面的命令来设置项目目录:
mkdir discord-bot && cd discord-bot && npm init -y
上述命令创建了一个discord-bot
目录,并在其中初始化了 npm。
接下来,导航到package.json
文件,添加下面的启动
脚本:
"start": "node server.js"
然后,运行下面的命令安装项目所需的依赖项:
npm install discord.js axios dotenv
您在上面安装的依赖项包括以下内容:
- discord.js:该库允许您在 Node.js 应用程序中与 Discord API 交互。
- dotenv:该软件包可帮助您管理机器人令牌等敏感数据。
- axios:该软件包允许您请求 Trivia API。
现在,您已经建立了开发环境并安装了所需的依赖项。接下来,您将创建一个 Discord 机器人账户。
创建 Discord Bot 账户
Discord Bot 帐户是为运行机器人而创建的 Discord 帐户。与由人类用户控制的普通用户账户不同,机器人账户由软件控制。
该账户将充当网关,授予机器人访问服务器资源、响应事件和在 Discord 社区内执行操作的必要权限。
要创建 Discord 机器人账户,必须先创建一个 Discord 应用程序。要创建应用程序,请访问Discord 的开发人员门户,然后单击 “创建应用程序 “按钮,如下图所示。
单击该按钮将提示您登录 Discord 帐户。登录后,为您的应用程序命名,然后点击 “创建 “按钮,如下图所示。
接下来,将 “公共机器人 “开关切换为关闭,以确保只有您可以将机器人添加到服务器。
然后,通过切换所有 “特权网关意图 “来配置机器人的权限,以确保它能访问服务器活动的实时更新,如成员存在情况。
接下来,导航到左侧边栏的 “OAuth2 “选项卡。在 “SCOPES “部分,勾选机器人和应用程序命令复选框,如下图所示。
选择机器人作用域可让 Discord 将您的应用程序识别为机器人,而application.commands作用域可让您创建机器人将监听的斜线命令。
勾选机器人复选框后,将打开 “BOT PERMISSIONS(机器人权限)”部分。在 “BOT PERMISSIONS(机器人权限)”部分,勾选管理员复选框,如下图所示。
选中该复选框可授予机器人在服务器中的所有权限。这些权限包括管理消息和频道的能力。
在 “BOT PERMISSIONS(机器人许可)”下面,Discord 会生成一个 URL,供你将机器人添加到服务器。将 URL 粘贴到浏览器中,然后选择要添加机器人的服务器。
接下来,在 “机器人 “选项卡中点击“重置令牌“按钮,获取机器人令牌,如下图所示。
首次点击该按钮将重置机器人的默认令牌,并为您提供一个新令牌。复制并安全地保存令牌。如果令牌丢失,您必须重新设置,因为令牌只显示一次。
创建一个.env
文件,添加机器人令牌等环境变量和其他数据,如添加机器人的 公会 ID和机器人的客户端 ID:
TOKEN = "<BOT TOKEN>"
GUILD_ID = "<GUILD ID>"
CLIENT_ID = "<BOT'S CLIENT ID>"
现在您已经建立了 Discord Bot 账户。接下来,您将构建 Discord 机器人。
使用 Node.js 构建您的 Discord 机器人项目
本节将引导您创建 Discord 问答机器人,并集成您安装的软件包,以便在 Discord 注册机器人斜线命令,并处理机器人与公会成员的互动。
按照本教程的要求,将您的项目目录结构与下面的目录结构类似。
quiz-bot/
│
├── src/
│ ├── register-commands.js # Script to register slash commands with Discord
│ └── quiz-bot.js # Script for message handling and fetching questions
│
├── server.js # Entry point for your bot and script for running a server
├── node_modules/ # Node.js modules
│
├── .env
├── .gitignore
├── package.json
└── package-lock.json
注册机器人命令
机器人需要用户输入命令。使用 Discord 机器人,您可以用斜线 (/) 前缀定义您希望机器人监听的命令。
要在 Discord 服务器上注册机器人的/quiz
命令,首先要在register-commands
.js
文件中添加以下来自discord.js
的导入:
// register-commands.js
const { REST, Routes, ApplicationCommandOptionType } = require('discord.js');
您在上面导入的类包括以下内容:
REST
:该类允许您对 Discord API 进行 REST API 调用。路由
该类提供生成 Discord API 端点的实用功能。ApplicationCommandOptionType(应用程序命令选项类型
):该类允许您定义命令所接受选项的数据类型。
接下来,你需要定义一个包含所有机器人命令的命令对象数组。命令对象包含名称
、描述
和选项
数组。
这些选项允许用户自定义机器人的指令。在这种情况下,用户可以通过选项数组指定机器人应该提出的问题的难度和类型。
将下面的代码块添加到register-commands.js
文件中,以创建命令
数组:
// register-commands.js
const commands = [
{
name: 'quiz',
description:
'Select difficulty and question type to tailor the quiz experience.',
options: [
{
type: ApplicationCommandOptionType.String,
name: 'difficulty',
description: "Options include 'easy', 'medium', or 'hard'.",
required: true,
},
{
type: ApplicationCommandOptionType.String,
name: 'type',
description:
" Choose 'multiple' for multiple choice or 'boolean' for true/false",
required: true,
},
],
},
];
上面的代码块在命令
数组中定义了测验命令。quiz 对象包含用户需要与/quiz
命令一起输入的两个选项,例如机器人将提出的问题的难度级别和问题类型。
接下来,你需要注册你的/quiz
命令,使它可以通过你的机器人访问。要注册该命令,首先要创建一个REST
类实例,其中包含你的 Discord 机器人令牌和你喜欢的REST
版本。
要注册/quiz
命令并使其可通过机器人访问,首先要使用 Discord 机器人令牌创建一个REST
类实例,并指定首选的 REST 版本。
就像这样
// register-commands.js
const rest = new REST({ version: '10' }).setToken(process.env.TOKEN);
Discord 会定期更新其 API,导致端点、响应结构和行为发生变化。
为 Discord 项目定义特定的 REST 版本可让您有效管理项目可用的功能。上面的代码块使用的是 Discord API v10。
接下来,你需要定义一个异步函数,使用Routes
类中的applicationGuildCommands
方法向公会服务器注册机器人命令。
就像这样
// register-commands.js
(async () => {
try {
console.log('Started refreshing SLASH (/) commands.');
await rest.put(
Routes.applicationGuildCommands(
process.env.CLIENT_ID,
process.env.GUILD_ID
),
{ body: commands }
);
console.log('Successfully reloaded SLASH (/) commands.');
} catch (error) {
console.error(error);
}
})();
上面的代码块会向 Discord API 端点执行 PUT 请求,并将命令
数组作为请求主体。
它使用applicationGuildCommands
方法构建 API 端点,并输入机器人的客户端 ID 和目标公会 ID。
注册命令后,您需要管理机器人与公会成员之间的交互流程。
处理用户与 Discord 机器人的交互
要处理机器人与公会成员之间的交互流程,首先要在测验
机器人的quiz-bot.js
文件中添加以下导入:
// quiz-bot.js
const { Client, IntentsBitField } = require('discord.js');
const axios = require('axios');
您需要使用客户端
类创建一个新的 Discord 机器人实例,同时使用IntentsBitField
类指定机器人将从 Discord API 接收的意图(事件)。
接下来,在你的quiz-bot.js
文件中添加下面的代码块,为你的机器人创建一个新的客户端实例,并为你的机器人应用程序指定特定的意图:
// quiz-bot.js
const client = new Client({
intents: [
IntentsBitField.Flags.Guilds,
IntentsBitField.Flags.GuildMembers,
IntentsBitField.Flags.GuildMessages,
IntentsBitField.Flags.MessageContent,
],
});
上面的代码块定义了机器人运行所需的特定意图,其中包括
IntentsBitField.Flags.Guilds:
该意图允许机器人接收其所属公会(服务器)的信息,包括名称、图标和角色。
IntentsBitField.Flags.GuildMembers
:该意图使机器人能够接收公会成员的信息,如用户名、状态和角色。
IntentsBitField.Flags.GuildMessages
:该意向允许机器人访问其所在公会发送的消息,使其能够响应消息触发的命令或事件。
IntentsBitField.Flags.MessageContent
:此意图允许机器人访问公会中发送的消息的实际内容。如果没有此意图,信息内容将是空的。
您将为就绪
事件创建一个事件监听器。当 Discord 机器人成功连接到 Discord 服务器并准备就绪时,就会触发该事件。
将下面的代码块添加到您的quiz-bot.js
文件中,创建就绪事件监听器:
// quiz-bot.js
client.on('ready', () => {
console.log(`✅ Bot is online and ready`);
});
接下来,您需要为interactionCreate
事件创建一个事件监听器。当用户执行机器人可以处理的交互(如使用斜线命令)时,就会发生该事件。
发出后,事件监听器将收到interactionCreate
事件和交互对象。
该对象包括有关交互的所有详细信息,如交互类型和用户提供的数据。
将下面的代码块添加到您的quiz-bot.js
文件中,以创建interactionCreate
事件监听器:
// quiz-bot.js
client.on('interactionCreate', async (interaction) => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'quiz') {
// Rest of the code goes here...
}
});
上面的代码块设置了一个interactionCreate
事件监听器。
事件监听器会检查用户与机器人之间的交互是否为聊天输入命令(斜线命令),并过滤掉其他类型的交互。
然后,它会检查commandName
是否为quiz
,并继续处理机器人和用户之间的 quiz 会话。
如果commandName
是quiz
,则使用 Axios 向 Trivia API 的 URL 发送 GET 请求,以获取问题及其答案(正确和错误)。
洗牌答案,使选项随机化,然后将其呈现给用户。
就像这样
// quiz-bot.js
await interaction.deferReply();
const difficulty = interaction.options.getString("difficulty");
const type = interaction.options.getString("type");
try {
const url = `https://opentdb.com/api.php?amount=1&difficulty=${difficulty}&type=${type}`;
const response = await axios.get(url);
const data = response.data.results[0];
const question = data.question;
const correctAnswer = data.correct_answer;
const options = [...data.incorrect_answers, correctAnswer];
// Shuffle the options
for (let i = options.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[options[i], options[j]] = [options[j], options[i]];
}
await interaction.editReply({
content: `Question: ${question}\\nOptions: ${options.join(", ")}`,
});
} catch (error) {
console.error(error);
// Notify the user in case of an error after deferring
await interaction.followUp("Failed to fetch the question. Please try again.");
}
上面的代码块首先使用deferReply
方法延迟机器人的回复,让机器人有一定的时间间隔来处理 GET 请求。
然后,代码块使用 interaction.options.getString()
从交互对象中获取用户选择的难度和问题类型。
随后,机器人会从获取的数据中提取问题、正确答案和错误答案。
在对正确答案和错误答案进行洗牌以随机调整选择顺序后,它会用测验问题和选项编辑最初的延迟回复。
接下来,您需要处理用户对问题的回答,将其与正确答案进行核对,并告知用户是正确还是错误。
收集用户反馈
要收集用户对问题的回复,需要在交互的通道(interaction.channel
)上使用createMessageCollector
方法。
通过这种方法,您可以过滤掉不是由发起/quiz
命令的用户发送的信息,设置用户回复的时间限制,并指定要收集的信息的最大数量。
当用户发送回复时,createMessageCollector
方法会触发收集
事件。
您需要为该事件添加一个监听器;监听器将根据问题的正确答案检查用户的回复,并发送相应的消息。
另一方面,如果用户没有在指定时限内发送适当的回复,createMessageCollector
方法就会触发结束
事件。
您需要添加一个监听器来响应用户,通知他们该事件的时间已到。
就像这样
// quiz-bot.js
const filter = (m) => m.author.id === interaction.user.id;
const collector = interaction.channel.createMessageCollector({
filter,
time: 15000,
max: 1,
});
collector.on("collect", async (m) => {
if (m.content.toLowerCase() === correctAnswer.toLowerCase()) {
await m.reply("Correct answer! 🎉");
} else {
await m.reply(`Wrong answer! The correct answer was: ${correctAnswer}`);
}
});
collector.on("end", (collected) => {
if (collected.size === 0) {
interaction.followUp("Time is up! No answer was provided.");
}
});
收集器
将根据作者的 ID 过滤信息,确保只有发起问答的用户才能在 15 秒时限内提供答案。
然后,代码块为收集器
创建了两个事件监听器。第一个事件监听器(collect
)将触发一个回调,以检查用户的回答,并相应地回复用户。
第二个事件监听器end
将触发回调,通知用户没有在规定时间内提供答案。
接下来,在测验
机器人文件(quiz-bot.js
)末尾添加这行代码,在机器人和 Discord 之间建立连接:
// quiz-bot.js
client.login(process.env.TOKEN);
创建条目文件
您将创建一个入口文件,这是一个用于初始化整个机器人程序的单一文件。它有两个功能:
- 导入机器人逻辑:输入文件将通过要求 JavaScript 文件来运行机器人的逻辑,这些文件用于向 Discord 服务器注册机器人命令和响应用户消息。
- 启动服务器:输入文件将设置一个服务器,让你的机器人在 Back4app 容器上运行。Back4app 容器需要暴露端口才能成功部署应用程序。
在server.js
文件中添加以下代码块,以创建服务器:
// server.js
require('dotenv').config();
const http = require('http');
require('./src/register-commands.js');
require('./src/quiz-bot.js');
http
.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Bot is running!');
})
.listen(3000, () => {
console.log('Server is ready.');
});
上面的代码块通过创建一个简单的 HTTP 服务器来设置 Discord 机器人的运行。该服务器作为入口点,允许机器人在容器环境中运行。
上面的代码块导入了机器人的核心逻辑,并指定了 Back4app 端口,以便机器人在 Back4app 容器上部署。
创建入口文件后,您可以先在本地测试 Discord 机器人,然后再将其部署到 Back4app 容器。
测试您的 Discord 机器人
在应用程序终端运行下面的代码块,启动 Discord 机器人:
node server.js
该命令将记录信息,显示您已成功注册机器人,机器人已准备就绪并在线。
访问添加了机器人的服务器。您会发现它已经在线。
要与机器人互动,请发送/quiz命令。机器人应该会做出回应,并提供详细的选项,告诉你想让问答题变成什么样子。
选择所需的选项(如选择测验类别或难度级别),然后点击回车键。机器人会回答您的问题,并为您的回答设置 15 秒时限。
如果您在规定时间内提交了答案,机器人就会将您的答案与正确答案进行比较,并回复通知您答案的对错。
您已经确定您的机器人可以处理您设计的所有功能;接下来,将您的 Discord 机器人部署到 Back4app 容器中。
使用人工智能代理在 Back4app 容器上部署 Discord 机器人
在本节中,您将使用 Back4app AI 代理在 Back4app 容器上部署 Discord 机器人。
要在 Back4app 容器上部署应用程序,您需要具备以下条件:
- 项目中的 Dockerfile
- GitHub 存储库:您的项目应上传至 GitHub 仓库。
- Back4app GitHub 应用程序:为您的版本库安装 Back4app GitHub 应用程序并授予必要权限
首先,在项目根目录下创建一个Dockerfile
,并将下面的代码块添加到其中:
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
接下来,您需要将代码上传到 GitHub 代码库,以便部署。
在执行下一步之前,请确保已在GitHub账户上安装了Back4App Containers GitHub 应用程序,并确保它拥有访问要部署的应用程序所需的权限。
导航至 Back4app 主页,点击屏幕右上角的 “新建应用程序“按钮。
这将带您进入一个初始化屏幕,您需要在此选择要创建的应用程序类型。
选择 Back4app Agent 选项,如下图所示。
选择 Back4app 代理选项后,您将被重定向到 Back4app AI 代理页面。
向人工智能代理发出以下提示,以部署您的应用程序:
Deploy my "YOUR_REPOSITORY_URL" repository on GitHub to a Back4App Container.
Here are the required environmental variables:
TOKEN = "YOUR_DISCORD_BOT_TOKEN"
GUILD_ID = "YOUR_GUILD_ID"
CLIENT_ID = "YOUR_CLIENT_ID"
用实际值替换上述提示中的占位符。
您应该会收到类似下面的回复:
上述回复表明,部署过程正在进行中,您的应用程序将在提供的 URL 中在线提供。
您可以在Back4app 容器仪表板上监控部署过程,也可以在一段时间后向 AI 代理发出以下提示,以确认当前的部署状态。
What is the current deployment status of my web app?
您应该会收到类似下面的回复:
您也可以选择在 Back4App 上手动部署应用程序。
结论
在本文中,您将学习如何使用 Node.js 构建 Discord 机器人。您将学习如何创建 Discord 机器人账户、注册机器人命令和处理用户响应。
此外,您还测试了 Discord 机器人,并在人工智能代理的帮助下将其部署到 Back4app 容器上。
Discord 机器人在自动执行任务、提供娱乐等方面非常有用,您可以根据自己的使用情况对机器人进行调整,使其执行符合您需求的特定功能。
本教程中使用的完整代码可在此GitHub 代码库中获取。