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

2021年11月28日06:13:30 发表评论 2,015 次浏览

如何构建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 开发者门户

单击“新建应用程序”。它会生成一个弹出窗口以提供新机器人的名称。

不和谐新申请表
不和谐新申请表

添加名称后,单击创建按钮,你将被导航到包含应用程序信息的新页面。转到“机器人”选项卡,然后单击“添加机器人”按钮将机器人添加到应用程序中。再次确认弹出窗口中的操作。

不和谐机器人应用程序
不和谐机器人应用程序

这会将新机器人添加到 Discord。现在,我们可以开始配置它了。

不和谐注册机器人
不和谐注册机器人

第一步,复制机器人令牌并将其存储在私有位置。请记住:此令牌仅供你使用;永远不要与其他人分享。

保留“授权流程”部分下的默认选择。

Discord 授权流程
Discord 授权流程

接下来,你应该打开“特权网关意图”下的“服务器成员意图”选项。我们的机器人需要此意图的许可才能检测新成员何时加入服务器。

Discord 设置机器人意图
Discord 设置机器人意图

将机器人添加到 Discord 服务器

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

Discord 设置机器人权限
Discord 设置机器人权限

选择所有必要的权限后,复制在范围部分下生成的 URL 并在新的浏览器选项卡中打开它。然后,选择机器人应加入的服务器,并在出现提示时授权操作。

将机器人连接到 Discord 服务器
将机器人连接到 Discord 服务器

现在,如果你转到 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 来回复任何直接提到它的用户,随机播放一个爸爸的笑话。为此,我们使用了这个很棒的 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 脚本以使修改后的机器人在服务器上运行。

现在机器人可以回复来自 API 的信息
现在机器人可以回复来自 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 数据库没有关于特定主题的笑话,机器人会回复用户解释情况以及随机笑话。如果用户没有提交搜索词,默认情况下它会随机回复一个笑话。

其余代码与最后一个场景类似。所以,我们现在可以运行和测试我们机器人的这个新功能。

当有一个与搜索词相关的笑话时:

发送与查询相关的笑话
发送与查询相关的笑话

当提交的术语没有笑话时:

当什么都没有找到时使用后备随机笑话
当什么都没有找到时使用后备随机笑话

欢迎新会员

如何构建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机器人示例:机器人欢迎用户

至此,我们完成了 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 新应用菜单
Heroku 新应用菜单

选择“创建新应用程序”选项,为你的应用程序命名,然后确认应用程序创建。

Heroku 新的应用程序表单
Heroku 新的应用程序表单

新应用程序现在必须列在你的 Heroku 仪表板上。选择应用程序并转到其部署选项卡,你将在其中找到将 GitHub 帐户连接到 Heroku 的选项。连接账户后,搜索应用程序库并点击“连接”。

将 Heroku 应用程序与 git 存储库连接
将 Heroku 应用程序与 git 存储库连接

Heroku 现在将通过 GitHub 存储库自动部署你的应用程序。你可以启用自动部署以在每次推送新更改时自动部署存储库。

在 Heroku 上设置自动部署
在 Heroku 上设置自动部署

接下来,转到“设置”选项卡并将机器人令牌添加到“配置变量”部分。它将令牌添加到进程的 env 变量中。如果需要,现在你可以删除初始应用程序代码中的 dotenv 配置。

添加环境变量
添加环境变量

我们必须再做一项更改才能完成部署。为此,请转到应用程序的资源选项卡。目前,免费 dynos 部分中的“web”选项是打开的,而“worker”是关闭的。相反,你应该打开“worker”并关闭“web”,以防止应用程序因60 秒超时错误而崩溃 。

将应用程序设置为工作人员
将应用程序设置为工作人员

至此,应用部署完成。现在,我们的 Discord 机器人可以在服务器上 24/7 全天候运行,并提供源源不断的爸爸笑话。


如何构建Discord机器人:概括

Discord API 是一个强大的工具,允许开发人员为 Discord 构建各种应用程序,包括机器人。基于 Node 的 discord.js 包让我们可以更轻松地利用这个工具。

如何使用NodeJS构建Discord机器人?今天,我们创建了一个简单的机器人,它可以执行多项自动化任务,包括消息传递渠道、欢迎新成员以及从远程 API 检索内容。这是一种任何人都可以尝试的有趣体验,可以让你为构建更严肃、更复杂的机器人做好准备。我希望你会喜欢用我们今天学到的东西来试验 Discord API。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: