如何使用NodeJS构建Discord机器人(实现指南)

如何构建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 帐户并转到其开发人员门户上的应用程序页面。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
Discord 开发者门户
单击“新建应用程序”。它会生成一个弹出窗口以提供新机器人的名称。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
不和谐新申请表
添加名称后,单击创建按钮,你将被导航到包含应用程序信息的新页面。转到“机器人”选项卡,然后单击“添加机器人”按钮将机器人添加到应用程序中。再次确认弹出窗口中的操作。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
不和谐机器人应用程序
这会将新机器人添加到 Discord。现在,我们可以开始配置它了。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
不和谐注册机器人
第一步,复制机器人令牌并将其存储在私有位置。请记住:此令牌仅供你使用;永远不要与其他人分享。
保留“授权流程”部分下的默认选择。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
Discord 授权流程
接下来,你应该打开“特权网关意图”下的“服务器成员意图”选项。我们的机器人需要此意图的许可才能检测新成员何时加入服务器。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
Discord 设置机器人意图
将机器人添加到 Discord 服务器如何使用NodeJS构建Discord机器人?我们应该生成一个邀请链接,以反映机器人将其添加到 Discord 服务器所需的权限级别。为此,请转到同一页面上的“OAuth2”选项卡并选择“bot”作为应用程序的范围。然后,选择机器人在与服务器交互时应具有的权限集。我们的机器人只需要在服务器通道中读取和发送消息的权限。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
Discord 设置机器人权限
选择所有必要的权限后,复制在范围部分下生成的 URL 并在新的浏览器选项卡中打开它。然后,选择机器人应加入的服务器,并在出现提示时授权操作。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
将机器人连接到 Discord 服务器
现在,如果你转到 Discord 服务器,你将能够在右侧面板上看到作为成员列出的新机器人。
实现机器人的行为NodeJS构建Discord机器人示例:我们现在可以开始添加代码来定义机器人在服务器内的行为方式。正如我们在文章开头提到的,我们将使用 Node.js 和 discord.js 来实现这一点。
作为实现的第一步,建立一个新的 Node.js 项目并使用 npm 对其进行初始化。然后,我们应该使用 npm 安装 discord.js、axios 和 dotenv 模块。
npm install discord.js axios dotenv

接下来,我们创建一个 .env 文件并添加我们之前复制的令牌作为环境变量。
//.envTOKEN=< your token>

登录并开始监听事件现在我们可以导入 discord.js 并设置机器人来监听服务器事件并做出相应的响应。创建一个名为 index.js 的新文件并向其中添加以下代码。
//index.jsrequire("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 脚本时,到目前为止一直处于离线状态的机器人将上线并开始工作。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
在线查看你的机器人
【如何使用NodeJS构建Discord机器人(实现指南)】你可以向通道发送 ping 消息并测试其是否正常工作。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
测试你的基本机器人
应用户要求用一个随机的爸爸笑话回复用户如何构建Discord机器人?最后,我们来到了项目的有趣部分。在这一步中,我们将设置我们的 bot 来回复任何直接提到它的用户,随机播放一个爸爸的笑话。为此,我们使用了这个很棒的 AP??I: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机器人(实现指南)

文章图片
现在机器人可以回复来自 API 的信息
使用用户提供的搜索词搜索爸爸笑话如何使用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 数据库没有关于特定主题的笑话,机器人会回复用户解释情况以及随机笑话。如果用户没有提交搜索词,默认情况下它会随机回复一个笑话。
其余代码与最后一个场景类似。所以,我们现在可以运行和测试我们机器人的这个新功能。
当有一个与搜索词相关的笑话时:
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
发送与查询相关的笑话
当提交的术语没有笑话时:
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
当什么都没有找到时使用后备随机笑话
欢迎新会员如何构建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`); });

当新用户加入时,此功能在服务器上的工作方式如下。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
NodeJS构建Discord机器人示例:机器人欢迎用户
至此,我们完成了 Discord 机器人的开发。你现在可以将机器人添加到你拥有“管理服务器”权限的任何服务器,并可以随意阅读爸爸的笑话。
将机器人部署到 Heroku如何使用NodeJS构建Discord机器人?如果你想让机器人 24/7 全天候运行,那么在你的机器上本地运行机器人并不理想。因此,为了使其持续可用,我们将机器人部署到Heroku 云。
首先,我们应该  在我们的项目文件夹中创建一个Procfile,指定 Heroku 在应用程序启动时应该执行的命令。我们使用 npm node index.js 作为启动命令添加一个新的工作进程到 Procfile。
//Procfileworker: node index.js

接下来,你应该将项目初始化为 git 存储库并将其推送到 GitHub。我们可以直接将 GitHub 存储库连接到 Heroku 以部署机器人。我们建议在将项目推送到 GitHub 之前,将 node_modules 文件夹和 .env 文件添加到 .gitignore 文件中。
然后,一旦你登录 Heroku(如果没有,请创建一个帐户),你将被重定向到 Heroku 仪表板。在这里,你可以通过单击“新建”按钮来创建新应用程序。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
Heroku 新应用菜单
选择“创建新应用程序”选项,为你的应用程序命名,然后确认应用程序创建。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
Heroku 新的应用程序表单
新应用程序现在必须列在你的 Heroku 仪表板上。选择应用程序并转到其部署选项卡,你将在其中找到将 GitHub 帐户连接到 Heroku 的选项。连接账户后,搜索应用程序库并点击“连接”。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
将 Heroku 应用程序与 git 存储库连接
Heroku 现在将通过 GitHub 存储库自动部署你的应用程序。你可以启用自动部署以在每次推送新更改时自动部署存储库。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
在 Heroku 上设置自动部署
接下来,转到“设置”选项卡并将机器人令牌添加到“配置变量”部分。它将令牌添加到进程的 env 变量中。如果需要,现在你可以删除初始应用程序代码中的 dotenv 配置。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
添加环境变量
我们必须再做一项更改才能完成部署。为此,请转到应用程序的资源选项卡。目前,免费 dynos 部分中的“web”选项是打开的,而“worker”是关闭的。相反,你应该打开“worker”并关闭“web”,以防止应用程序因60 秒超时错误而崩溃  。
如何使用NodeJS构建Discord机器人(实现指南)

文章图片
将应用程序设置为工作人员
至此,应用部署完成。现在,我们的 Discord 机器人可以在服务器上 24/7 全天候运行,并提供源源不断的爸爸笑话。
如何构建Discord机器人:概括Discord API 是一个强大的工具,允许开发人员为 Discord 构建各种应用程序,包括机器人。基于 Node 的 discord.js 包让我们可以更轻松地利用这个工具。
如何使用NodeJS构建Discord机器人?今天,我们创建了一个简单的机器人,它可以执行多项自动化任务,包括消息传递渠道、欢迎新成员以及从远程 API 检索内容。这是一种任何人都可以尝试的有趣体验,可以让你为构建更严肃、更复杂的机器人做好准备。我希望你会喜欢用我们今天学到的东西来试验 Discord API。

    推荐阅读