如何构建Discord机器人?本文带你在不到 60 分钟的时间内使用 NodeJS 构建你的第一个 Discord 机器人,包括详细的NodeJS构建Discord机器人示例。
Discord 是一款聊天应用程序,拥有超过 1 亿用户,通过文本、语音和视频对话建立在线社区。通过 Discord 为开发人员提供的广泛 API,我们可以构建在 Discord 上执行重复、平凡甚至有趣任务的机器人。管理社区、向社区发送消息和私人消息用户只是我们可以使用 Discord 机器人自动化的少数工作。
如何使用NodeJS构建Discord机器人?在今天的教程中,我们将构建一个简单(且有趣)的机器人,它会根据用户请求向社区发送随机的爸爸笑话。使用 Node.js 和discord.js 模块,我们可以在不到 60 分钟的时间内轻松创建、开发和部署此 Discord 机器人。倒计时现在开始。
在我们开始之前……
在这里,我们列出了在开始学习本教程之前你需要设置的所有内容。
- 在你的机器上安装 Node.js。
- 在 Discord 上创建一个帐户。你可以下载桌面应用程序或使用浏览器访问它。
- 创建一个新社区 (或 Discord 语言中的新“服务器”)来测试应用程序。
设置完所有这些后,你就可以继续学习本教程了。
最后一件事,你可以在GitHub 上找到该项目的代码
创建一个新的 Discord 机器人
如何构建Discord机器人?在第一步中,你应该在 Discord 上创建和配置一个新机器人。这是你如何做到的。
登录你的 Discord 帐户并转到其开发人员门户上的应用程序页面。
单击“新建应用程序”。它会生成一个弹出窗口以提供新机器人的名称。
添加名称后,单击创建按钮,你将被导航到包含应用程序信息的新页面。转到“机器人”选项卡,然后单击“添加机器人”按钮将机器人添加到应用程序中。再次确认弹出窗口中的操作。
这会将新机器人添加到 Discord。现在,我们可以开始配置它了。
第一步,复制机器人令牌并将其存储在私有位置。请记住:此令牌仅供你使用;永远不要与其他人分享。
保留“授权流程”部分下的默认选择。
接下来,你应该打开“特权网关意图”下的“服务器成员意图”选项。我们的机器人需要此意图的许可才能检测新成员何时加入服务器。
将机器人添加到 Discord 服务器
如何使用NodeJS构建Discord机器人?我们应该生成一个邀请链接,以反映机器人将其添加到 Discord 服务器所需的权限级别。为此,请转到同一页面上的“OAuth2”选项卡并选择“bot”作为应用程序的范围。然后,选择机器人在与服务器交互时应具有的权限集。我们的机器人只需要在服务器通道中读取和发送消息的权限。
选择所有必要的权限后,复制在范围部分下生成的 URL 并在新的浏览器选项卡中打开它。然后,选择机器人应加入的服务器,并在出现提示时授权操作。
现在,如果你转到 Discord 服务器,你将能够在右侧面板上看到作为成员列出的新机器人。
实现机器人的行为
NodeJS构建Discord机器人示例:我们现在可以开始添加代码来定义机器人在服务器内的行为方式。正如我们在文章开头提到的,我们将使用 Node.js 和 discord.js 来实现这一点。
作为实现的第一步,建立一个新的 Node.js 项目并使用 npm 对其进行初始化。然后,我们应该使用 npm 安装 discord.js、axios 和 dotenv 模块。
npm install discord.js axios dotenv
接下来,我们创建一个 .env 文件并添加我们之前复制的令牌作为环境变量。
//.env
TOKEN=<your token>
登录并开始监听事件
现在我们可以导入 discord.js 并设置机器人来监听服务器事件并做出相应的响应。创建一个名为 index.js 的新文件并向其中添加以下代码。
//index.js
require("dotenv").config();
const Discord = require("discord.js");
const client = new Discord.Client();
//Listen to the event that signals the bot is ready to start working
client.on("ready", () => {
console.log(`logged in as ${client.user.tag}`);
});
//Listen to new messages on the server
client.on("message", async (message) => {
if (message.content === "ping") {
message.reply("pong");
}
});
//Login to the server using bot token
client.login(process.env.TOKEN);
这段代码中很少发生重要的事情。首先,我们导入 discord.js 模块并创建一个新的 Client 对象,它代表本场景中的 Discord 机器人。client.login
然后该方法允许机器人使用我们添加到 .env 文件的令牌登录到 Discord。dotenv 模块负责将其作为环境变量添加到进程中。
我们的机器人监听两个 Discord 事件:ready 和 message。当机器人准备好使用时,会触发 ready 事件。并且每次用户向频道发送消息时都会触发消息事件。在这里,我们设置机器人以“pong”回复每条发送“ping”的消息。
当我们使用该node index
命令运行此 Node 脚本时,到目前为止一直处于离线状态的机器人将上线并开始工作。
你可以向通道发送 ping 消息并测试其是否正常工作。
应用户要求用一个随机的爸爸笑话回复用户
如何构建Discord机器人?最后,我们来到了项目的有趣部分。在这一步中,我们将设置我们的 bot 来回复任何直接提到它的用户,随机播放一个爸爸的笑话。为此,我们使用了这个很棒的 API:icanhazdadjoke.com 。它收集了大量有趣(和尴尬)的爸爸笑话,我们可以免费检索。
这个实现的基本逻辑是这样的。当用户提到我们的机器人时,它会使用 axios 向爸爸笑话 API 发送请求并检索随机爸爸笑话。然后它用笑话回复用户。非常简单。
这里需要注意的一件事是,我们需要将 GET 请求的 Accept 标头设置为 application/json 以从 API 中以 JSON 格式检索结果。
require("dotenv").config();
const axios = require("axios");
const Discord = require("discord.js");
const client = new Discord.Client();
const dadJokeURL = "https://icanhazdadjoke.com";
const headers = { "Accept": "application/json" };
async function getRandomDadJoke() {
const response = await axios.get(dadJokeURL, { headers: headers });
return response.data;
}
//Listen to the event that signals bot is ready to start working
client.on("ready", () => {
console.log(`logged in as ${client.user.tag}`);
});
//Listen to new messages on the server
client.on("message", async (message) => {
//"Ignore the message if the bot authored it"
if (message.author.bot) return;
//If the doesn't specifically mention the bot, return
if (text.includes("@here") || text.includes("@everyone")) return;
//Return if the message doesn't mention the bot
if (!message.mentions.has(client.user.id)) return;
try {
//Reply with a random joke
const result = await getRandomDadJoke();
message.reply(result.joke);
}
catch (error) {
message.reply("Sorry, an error occured");
}
});
//Login to the server using bot token
client.login(process.env.TOKEN);
该getRandomDadJoke
方法发送 axios 请求并随随机笑话返回检索到的数据。在消息处理程序中,机器人侦听消息事件并确定它应该回复哪些消息。它消除了三种类型的消息。
- 由机器人本身创作的消息。
- 提及服务器上所有人的消息,而不仅仅是机器人。
- 未提及机器人的消息。
如果用户直接提及该机器人,它会回复一个使用该getRandomDadJoke
方法检索到的随机笑话。
你可以停止和启动 Node 脚本以使修改后的机器人在服务器上运行。
使用用户提供的搜索词搜索爸爸笑话
如何使用NodeJS构建Discord机器人?这个实现与上一个没有太大区别。但在这里,用户可以提交一个搜索词来获取有关特定主题的老爸笑话。
为了实现这一点,我们添加了一个名为的新函数searchDadJokes
,该/search
函数使用搜索词作为查询参数将请求发送到API 端点。我们还将 设置limit=1
为仅检索有关给定主题的一个笑话。
async function searchDadJokes(term) {
const params = { term: term, limit: 1 }
const response = await axios.get(`${dadJokeURL}/search`, { params: params, headers: headers });
return response.data.results[0];
}
NodeJS构建Discord机器人示例:然后,我们必须修改消息事件处理程序以考虑用户提交搜索词的情况。这是我们如何做到的。
//Listen to new messages on the server
client.on("message", async (message) => {
//"Ignore the message if the bot authored it"
if (message.author.bot) return;
const text = message.content.toLowerCase();
//If the doesn't specifically mention, bot return
if (text.includes("@here") || text.includes("@everyone")) return;
//Return if the message doesn't mention the bot
if (!message.mentions.has(client.user.id)) return;
let result;
try {
const term = text.replace(/<@!\d+>/, "").trim();
//If there is a search term
if (term !== "") {
//Search a joke containing the term
result = await searchDadJokes(term);
if (!result) {
message.reply(`Sorry, got no dad jokes about ${term}. But how about a random dad joke?`);
}
}
//Reply with a random joke
if (!result) {
result = await getRandomDadJoke();
}
message.reply(result.joke);
}
catch (error) {
message.reply("Sorry, an error occured")
}
});
在此代码中,要检查用户是否提交了搜索词,我们需要从文本中删除机器人的 ID。当用户提到机器人时,它会被添加到文本中。提到的 ID 以下列格式出现在文本中。
<@!1223344342859688930>
我们使用正则表达式模式检测文本中的 ID,<@!\d+>
并将其替换为空字符串。修剪修改后的文本后,机器人可以检索用户提交的搜索词。然后,机器人使用该searchDadJokes
方法查找相关笑话。
但是如果 API 数据库没有关于特定主题的笑话,机器人会回复用户解释情况以及随机笑话。如果用户没有提交搜索词,默认情况下它会随机回复一个笑话。
其余代码与最后一个场景类似。所以,我们现在可以运行和测试我们机器人的这个新功能。
当有一个与搜索词相关的笑话时:
当提交的术语没有笑话时:
欢迎新会员
如何构建Discord机器人?我们可以设置我们的机器人来欢迎每个加入 Discord 服务器的新用户。当机器人检测到一个新的“guildMemberAdd”事件时,它表示有新用户加入,它会向“通用”频道发送一条消息,欢迎新用户。
//Listen to new member joining event
client.on("guildMemberAdd", member => {
//Find the general channel in the user's channel list to send the welcome message
const channel = member.guild.channels.cache.find(ch => ch.name === "general");
//If the channel is not in the server, exit
if (!channel) return;
channel.send(`Welcome, ${member}! I'm at your service if you want to hear dad jokes`);
});
当新用户加入时,此功能在服务器上的工作方式如下。
至此,我们完成了 Discord 机器人的开发。你现在可以将机器人添加到你拥有“管理服务器”权限的任何服务器,并可以随意阅读爸爸的笑话。
将机器人部署到 Heroku
如何使用NodeJS构建Discord机器人?如果你想让机器人 24/7 全天候运行,那么在你的机器上本地运行机器人并不理想。因此,为了使其持续可用,我们将机器人部署到Heroku 云。
首先,我们应该 在我们的项目文件夹中创建一个Procfile,指定 Heroku 在应用程序启动时应该执行的命令。我们使用 npm node index.js 作为启动命令添加一个新的工作进程到 Procfile。
//Procfile
worker: node index.js
接下来,你应该将项目初始化为 git 存储库并将其推送到 GitHub。我们可以直接将 GitHub 存储库连接到 Heroku 以部署机器人。我们建议在将项目推送到 GitHub 之前,将 node_modules 文件夹和 .env 文件添加到 .gitignore 文件中。
然后,一旦你登录 Heroku(如果没有,请创建一个帐户),你将被重定向到 Heroku 仪表板。在这里,你可以通过单击“新建”按钮来创建新应用程序。
选择“创建新应用程序”选项,为你的应用程序命名,然后确认应用程序创建。
新应用程序现在必须列在你的 Heroku 仪表板上。选择应用程序并转到其部署选项卡,你将在其中找到将 GitHub 帐户连接到 Heroku 的选项。连接账户后,搜索应用程序库并点击“连接”。
Heroku 现在将通过 GitHub 存储库自动部署你的应用程序。你可以启用自动部署以在每次推送新更改时自动部署存储库。
接下来,转到“设置”选项卡并将机器人令牌添加到“配置变量”部分。它将令牌添加到进程的 env 变量中。如果需要,现在你可以删除初始应用程序代码中的 dotenv 配置。
我们必须再做一项更改才能完成部署。为此,请转到应用程序的资源选项卡。目前,免费 dynos 部分中的“web”选项是打开的,而“worker”是关闭的。相反,你应该打开“worker”并关闭“web”,以防止应用程序因60 秒超时错误而崩溃 。
至此,应用部署完成。现在,我们的 Discord 机器人可以在服务器上 24/7 全天候运行,并提供源源不断的爸爸笑话。
如何构建Discord机器人:概括
Discord API 是一个强大的工具,允许开发人员为 Discord 构建各种应用程序,包括机器人。基于 Node 的 discord.js 包让我们可以更轻松地利用这个工具。
如何使用NodeJS构建Discord机器人?今天,我们创建了一个简单的机器人,它可以执行多项自动化任务,包括消息传递渠道、欢迎新成员以及从远程 API 检索内容。这是一种任何人都可以尝试的有趣体验,可以让你为构建更严肃、更复杂的机器人做好准备。我希望你会喜欢用我们今天学到的东西来试验 Discord API。