使用 Discord.js 构建 Discord 机器人

已发表: 2022-03-10
快速总结↬使用 Discord.js 模块构建 Discord 机器人的介绍。 该机器人将分享随机笑话,分配或撤销用户角色,并将特定帐户的推文发布到 Discord 频道。

随着越来越多的人在家工作,团队交流平台日益流行。 Slack 和 Discord 是两个最受欢迎的团队交流平台。 虽然 Discord 专注于游戏玩家,但某些功能,例如在语音通话室中添加多达 50 名成员的能力,使其成为 Slack 的绝佳替代品。 使用这样一个平台最显着的优势之一是许多任务可以使用机器人自动化

在本文中,我们将在 Discord.js 的帮助下使用 JavaScript 从头开始​​构建一个机器人。 我们将介绍从构建机器人到将其部署到云的整个过程。 在构建我们的机器人之前,让我们记下我们的机器人将具有的功能:

  • 分享一系列笑话中的随机笑话。
  • 通过选择表情符号添加和删除用户角色。
  • 将来自特定帐户的推文分享到特定频道。

因为 Discord.js 模块基于 Node.js,所以我假设您对 Node.js 和 npm 有点熟悉。 熟悉 JavaScript 是本文的必备条件。

现在我们知道了先决条件和目标,让我们开始吧。 如果您想立即克隆和探索代码,您可以使用 GitHub 存储库。

要遵循的步骤

我们将通过以下几个步骤来构建机器人。

首先,我们将构建一个 Discord 服务器。 Discord 服务器就像一个组,您可以在其中将各种主题分配给各种频道,非常类似于 Slack 服务器。 Slack 和 Discord 之间的主要区别在于,Slack 需要不同的登录凭据来访问不同的服务器,而在 Discord 中,您可以通过单一身份验证访问您所属的所有服务器。

我们需要创建服务器的原因是,如果没有服务器的管理员权限,我们将无法将机器人添加到服务器。 创建服务器后,我们会将机器人添加到服务器并从 Discord 的开发人员门户获取访问令牌。 这个令牌允许我们与 Discord API 进行通信。 Discord 提供了一个官方开放的 API 供我们交互。 该 API 可用于从为机器人服务请求到集成 OAuth 的任何事情。 该 API 支持从单服务器机器人一直到可以集成在数百台服务器上的机器人的所有内容。 它非常强大,可以通过多种方式实现。

Discord.js 库将帮助我们使用访问令牌与 Discord API 进行通信。 所有功能都将基于 Discord API。 然后,我们可以开始编写我们的机器人。 我们将从编写少量代码开始,这些代码将向我们介绍 Discord API 和 Discord.js 库。 然后我们将了解 Discord.js 中的部分概念。 一旦我们了解了部分,我们将向机器人添加所谓的“反应角色”系统。 完成后,我们还将知道如何使用名为twit的 npm 包与 Twitter 通信。 这个 npm 包将帮助我们集成 Twitter 推文转发功能。 最后,我们将使用 Heroku 将其部署到云端。

现在我们知道我们将如何构建我们的机器人,让我们开始研究它。

跳跃后更多! 继续往下看↓

构建 Discord 服务器

我们要做的第一件事是创建一个 Discord 服务器。 如果没有具有管理员权限的服务器,我们将无法集成机器人。

构建 Discord 服务器很容易,Discord 现在提供模板,这使它变得更加容易。 按照以下步骤操作,您的 Discord 服务器将准备就绪。 首先,我们将选择访问 Discord 门户的方式。 我们可以使用网页版或应用程序。 两者的工作方式相同。 我们将在本教程中使用网络版本。

如果你正在阅读这篇文章,我会假设你已经有一个 Discord 帐户。 如果没有,只需像在任何其他网站上一样创建一个帐户。 单击右上角的“登录”按钮,如果您有帐户则登录,或单击“注册”按钮。 填写简单的表格,完成验证码,您将成功创建一个帐户。 打开 Discord 应用程序或网站后,单击左侧的加号图标,即服务器列表所在的位置。 单击它时,系统会提示您选择模板或创建自己的模板。

在 Discord 中从模板或从头开始创建服务器
在 Discord 中创建服务器(大预览)

我们将选择“创建我自己的”选项。 让我们跳过下一个问题。 我们将我们的 Discord 服务器称为“Smashing Example”。 您也可以为您的服务器提供一张照片。 单击“创建”按钮将创建您的服务器。

使用 Discord 注册机器人

在对机器人进行编码之前,我们需要获取 Discord 提供的令牌。 该令牌将建立从我们的代码到 Discord 的连接。 要获得令牌,我们必须在我们的服务器上注册我们的机器人。 要注册机器人,我们必须访问 Discord 的开发者门户。 如果您是第一次构建 Discord 应用程序,您会在那里找到一个空列表。 要注册我们的应用程序,请单击右上角的“新应用程序”链接。 为您的应用程序命名,然后单击“创建”按钮。 我们将我们的应用程序命名为“Smashing App”。

向 Discord 开发者门户添加新应用

新菜单为我们提供了一些选择。 右侧是标有“Bot”的选项。 单击它,然后选择“添加机器人”。 单击确认,根据需要更改机器人的名称,保存更改,然后复制从该页面收到的令牌。 我们的机器人现在已在 Discord 注册。 我们可以开始添加功能并对机器人进行编码。

构建机器人

什么是 Discord.js?

Discord.js 是这样定义自己的:

Discord.js 是一个强大的 node.js 模块,它允许您非常轻松地与 Discord API 交互。 与大多数其他 JS Discord 库相比,它采用了更加面向对象的方法,从而使您的机器人代码更加整洁且易于理解。

因此,Discord.js 使与 Discord API 的交互变得更加容易。 它具有 100% 的官方 Discord API 覆盖率。

初始化机器人

打开您最喜欢的文本编辑器,然后创建一个文件夹,您的所有文件都将保存在其中。 打开命令行界面 (CLI), cd进入文件夹,并使用 npm 初始化文件夹: npm init -y

我们需要两个包来开始构建机器人。 第一个是 dotenv,第二个显然是 Discord.js Node.js 模块。 如果您熟悉 Node.js,那么您将熟悉 dotenv 包。 它将环境变量从名为.env的文件加载到process.env

使用npm i dotenv discord.js安装这两个。

安装完成后,在根文件夹中创建两个文件。 将文件之一命名为.env 。 随意命名另一个主文件。 我将其命名为app.js 。 文件夹结构将如下所示:

 │ .env │ app.js │ package-lock.json │ package.json └─── node_modules

我们将在.env文件中存储令牌和其他敏感信息,并将产生结果的代码存储在app.js文件中。

打开.env文件,并创建一个新变量。 让我们为这个例子命名变量BOT_TOKEN 。 将您的令牌粘贴到此文件中。 .env文件现在看起来与此类似:

 BOT_TOKEN=ODAxNzE1NTA2Njc1NDQ5ODY3.YAktvw.xxxxxxxxxxxxxxxxxxxxxxxx

我们可以开始处理app.js文件。 首先要做的是要求我们安装的模块。

 const Discord = require('discord.js'); require('dotenv').config();

dotenv模块使用config()方法初始化。 我们可以将参数传递给config()方法。 但是因为这是对 dotenv 模块的非常简单的使用,所以我们不需要它的任何特殊功能。

要开始使用 Discord.js 模块,我们必须初始化一个构造函数。 这显示在文档中:

 const client = new Discord.Client();

Discord.js 模块提供了一个名为client.on的方法。 client.on方法监听各种事件。 Discord.js 库是基于事件的,这意味着每次从 Discord 发出事件时,都会调用附加到该事件的功能。

我们要监听的第一个事件是ready事件。 当与 Discord API 的连接准备好时,此方法将启动。 在这个方法中,我们可以传入将在 Discord API 和我们的应用程序之间建立连接时执行的函数。 让我们在这个方法中传递一个console.log语句,这样我们就可以知道连接是否建立了。 带有ready事件的client.on方法如下所示:

 client.on('ready', () => { console.log('Bot is ready'); });

但是,这不会与 API 建立连接,因为我们还没有使用 Discord 服务器登录机器人。 为此,Discord.js 模块提供了login方法。 通过使用客户端可用的login方法并在此方法中传递令牌,我们可以使用 Discord 服务器登录应用程序。

 client.login(process.env.BOT_TOKEN)

如果您现在启动应用程序 - 使用node app.js ,或者,如果您使用的是 nodemon,则使用nodemon app.js - 您将能够看到您定义的控制台消息。 我们的机器人现在已成功登录 Discord 服务器。 我们可以开始尝试一些功能。

让我们首先根据代码获取一些消息内容。

message事件

message事件监听一些消息。 使用reply方法,我们可以编程机器人根据用户的消息进行回复。

 client.on('message', (msg) => { if (msg.content === 'Hello') msg.reply('Hi'); });

每当收到“Hello”消息时,此示例代码都会回复“Hi”。 但是为了使这项工作,我们必须将机器人与服务器连接起来。

将机器人与 Discord 服务器连接

到目前为止,机器人尚未与任何服务器连接。 要连接我们的服务器( Smashing Example ),请访问 Discord 的开发者门户。 单击我们在本教程前面创建的应用程序的名称(在我们的例子中,“Smashing App”)。 选择应用程序,然后单击菜单中的“OAuth2”选项。 您会发现一个名为“Scopes”的组。 选中“bot”复选框,然后复制生成的 URL。

将机器人与 Discord 服务器连接
机器人的 OAuth(大预览)

在新选项卡中访问此 URL,选择您的服务器,然后单击“授权”。 完成验证码,我们的机器人现在将与我们选择的服务器连接。

如果你现在访问 Discord 服务器,你会看到 Discord 已经发送了通知,并且机器人现在也出现在右侧的成员列表中。

为机器人添加功能

现在我们的机器人已与服务器连接,如果您向服务器发送“Hello”,机器人将回复“Hi”。 这只是对 Discord API 的介绍。 真正的乐趣即将开始。

为了让我们更加熟悉 Discord.js 模块,让我们添加功能,在收到特定命令时发送笑话。 这与我们刚刚所做的类似。

向机器人添加随机笑话功能

为了使这部分更清晰、更容易理解,我们不打算使用任何 API。 我们的机器人将返回的笑话将是一个简单的数组。 每次在数组范围内生成一个随机数,访问数组的特定位置返回笑话。

如果您曾经在 Discord 中使用过机器人提供的功能,您可能已经注意到一些特殊字符将普通消息与特殊命令区分开来。 我要使用? 在我们的命令前面,使它们看起来与普通消息不同。 所以,我们的笑话命令将是?joke

我们将在app.js文件中创建一个名为jokes的数组。 我们从数组中得到一个随机笑话的方法是使用这个公式:

 jokes[Math.floor(Math.random() * jokes.length)]

Math.random() * jokes.length公式将在数组范围内生成一个随机数。 Math.floor方法将对生成的数字进行下限。

如果你console.log()这个, Math.floor(Math.random() * jokes.length) ,你会得到更好的理解。 最后, jokes[]会从jokes数组中给我们一个随机笑话。

您可能已经注意到我们的第一个代码用于回复我们的消息。 但我们不想在这里得到答复。 相反,我们希望得到一个笑话作为消息,而不给任何人贴标签。 为此,Discord.js 模块有一个名为channel.send()的方法。 使用这种方法,我们可以将消息发送到调用命令的通道。 因此,到目前为止的完整代码如下所示:

 const Discord = require('discord.js'); require('dotenv').config(); const client = new Discord.Client(); client.login(process.env.BOT_TOKEN); client.on('ready', () => console.log('The Bot is ready!')); // Adding jokes function // Jokes from dcslsoftware.com/20-one-liners-only-software-developers-understand/ // www.journaldev.com/240/my-25-favorite-programming-quotes-that-are-funny-too const jokes = [ 'I went to a street where the houses were numbered 8k, 16k, 32k, 64k, 128k, 256k and 512k. It was a trip down Memory Lane.', '“Debugging” is like being the detective in a crime drama where you are also the murderer.', 'The best thing about a Boolean is that even if you are wrong, you are only off by a bit.', 'A programmer puts two glasses on his bedside table before going to sleep. A full one, in case he gets thirsty, and an empty one, in case he doesn't.', 'If you listen to a UNIX shell, can you hear the C?', 'Why do Java programmers have to wear glasses? Because they don't C#.', 'What sits on your shoulder and says “Pieces of 7! Pieces of 7!”? A Parroty Error.', 'When Apple employees die, does their life HTML5 in front of their eyes?', 'Without requirements or design, programming is the art of adding bugs to an empty text file.', 'Before software can be reusable it first has to be usable.', 'The best method for accelerating a computer is the one that boosts it by 9.8 m/s2.', 'I think Microsoft named .Net so it wouldn't show up in a Unix directory listing.', 'There are two ways to write error-free programs; only the third one works.', ]; client.on('message', (msg) => { if (msg.content === '?joke') { msg.channel.send(jokes[Math.floor(Math.random() * jokes.length)]); } });

我已经删除了代码中的“Hello”/“Hi”部分,因为这对我们来说已经没有用了。

现在您已经对 Discord.js 模块有了基本的了解,让我们更深入地了解一下。 但是该模块可以做更多的事情——例如,为一个人添加角色或禁止他们或将他们踢出。 现在,我们将构建一个简单的反应角色系统。

建立反应角色系统

每当用户在特定消息或频道中使用特殊表情符号进行响应时,将向用户提供与该表情符号相关的角色。 实施将非常简单。 但在构建这个反应角色系统之前,我们必须了解部分。

偏音

部分是 Discord.js 的概念。 Discord.js 通常会缓存所有消息,这意味着它将消息存储在一个集合中。 当缓存的消息接收到某个事件时,例如收到消息或回复,就会发出一个事件。 但是在机器人启动之前发送的消息是未缓存的。 因此,对此类实例做出反应不会发出任何事件,除非我们在使用它们之前获取它们。 Discord.js 库的第 12 版引入了部分的概念。 如果我们想捕获此类未缓存的事件,我们必须选择使用部分事件。 该库有五种类型的局部:

  1. USER
  2. CHANNEL
  3. GUILD_MEMBER
  4. MESSAGE
  5. REACTION

在我们的例子中,我们只需要三种类型的部分:

  • USER ,做出反应的人;
  • MESSAGE ,正在响应的消息;
  • REACTION ,用户对消息的反应。

该文档有更多关于部分的信息。

Discord.js 库提供了一种非常简单的方法来使用分部。 我们只需要添加一行代码,在Discord.Client()构造函数中传递一个对象。 新的构造函数如下所示:

 const client = new Discord.Client({ partials: ['MESSAGE', 'REACTION', 'CHANNEL'], });

在 Discord 服务器上创建角色

为了启用反应角色系统,我们必须创建一些角色。 我们要创建的第一个角色是机器人角色。 要创建角色,请转到“服务器设置”:

打开服务器设置以创建角色
服务器设置选项(大预览)

在服务器设置中,转到“角色”选项,然后单击“角色”旁边的小加号图标 ( + )。

在 Discord 中创建角色
添加角色(大预览)

首先,让我们创建bot角色,并确保选中角色选项菜单中的“管理角色”选项。 创建bot角色后,您可以添加更多角色。 我添加了jsc++python角色。 您不必赋予他们任何特殊能力,但这是一种选择。

在这里,请记住一件事: Discord 角色基于优先级工作。 任何在其下具有角色的角色都可以管理其下的角色,但不能管理其上的角色。 我们希望我们的机器人角色管理jsc++python角色。 因此,请确保bot角色高于其他角色。 只需拖放即可更改服务器设置的“角色”菜单中的角色顺序。

创建完角色后,bot角色分配给 bot 。 要赋予角色,请单击服务器右侧成员列表中的机器人名称,然后单击小加号图标 ( + )。 它将向您显示所有可用的角色。 在这里选择“bot”角色,你就完成了。

手动分配角色
分配角色(大预览)

在 Discord 中激活开发者模式

我们创建的角色不能在我们的代码中使用他们的名字。 在 Discord 中,从消息到角色的所有内容都有自己的 ID。 如果您单击任何消息中的“更多”指示符,您将看到一个名为“复制 ID”的选项。 此选项适用于 Discord 中的所有内容,包括角色。

Discord 中的复制 ID 选项
在 Discord 中复制 ID(大预览)

默认情况下,您很可能不会找到此选项。 您必须激活一个名为“开发者模式”的选项。 要激活它,请前往左下角您姓名旁边的 Discord 设置(不是您的服务器设置)。 然后转到“应用程序设置”下的“外观”选项,并从此处激活“开发者模式”。 现在您将能够复制 ID。

messageReactionAddmessageReactionRemove

响应消息时需要发出的事件是messageReactionAdd 。 并且每当删除反应时,都应该发出messageReactionRemove事件。

让我们继续构建系统。 正如我所说,首先我们需要监听messageReactionAdd事件。 messageReactionAddmessageReactionRemove事件在它们的回调函数中都有两个参数。 第一个参数是reaction ,第二个是user 。 这些都是不言自明的。

编码反应角色功能

首先,我们将创建一条消息,描述哪个表情符号将赋予哪个角色,就像我在这里所做的那样:

服务器上的反应角色消息
反应角色消息(大预览)

您可能在想,我们将如何在代码中使用这些表情符号? 默认表情符号是 Unicode,我们必须复制 Unicode 版本。 如果您遵循语法\:emojiName:并按“Enter”,您将获得一个带有名称的表情符号。 例如,我的 JavaScript 角色表情符号是狐狸; 因此,如果我输入\:fox:并在 Discord 中按“Enter”,我将收到一个狐狸表情符号。 同样,我会使用\:tiger:\:snake:来获取这些表情符号。 将这些保存在您的 Discord 设置中; 我们稍后会需要它们。

获取 Unicode 表情符号
获取 Unicode 表情符号(大预览)

这是起始代码。 这部分代码只是检查一些边缘情况。 一旦我们了解了这些情况,我们将实现反应角色系统的逻辑。

 // Adding reaction-role function client.on('messageReactionAdd', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; });

我们传入一个异步函数。 在回调中,我们要做的第一件事是检查消息是否为 partial 。 如果是,那么我们获取它,这意味着将其缓存或存储在 JavaScript map 方法中。 同样,我们正在检查反应本身是否是局部的,然后做同样的事情。 然后,我们检查做出反应的用户是否是机器人,因为我们不想将角色分配给对我们的消息做出反应的机器人。 最后,我们正在检查消息是否在服务器上。 Discord.js 使用guild作为服务器的替代名称。 如果消息不在服务器上,那么我们将停止该功能。

如果消息在roles频道中,我们的机器人只会分配角色。 如果您右键单击roles频道,您将看到“复制 ID”选项。 复制 ID 并跟随。

 if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208314766524526'); } } else return;

以上是回调中的其余代码。 我们正在使用reaction.message.channel.id属性来获取频道的 ID。 然后,我们将它与我们刚刚复制的角色频道 ID 进行比较。 如果是真的,那么我们检查表情符号并将它们与反应进行比较。 react.emoji.name 返回用于reaction.emoji.name的表情符号。 我们将它与我们的 Unicode 版本的表情符号进行比较。 如果它们匹配,那么我们等待reaction.message.guild.members.cache属性。

缓存是存储数据的集合。 这些集合是带有附加实用程序的 JavaScript Map 。 它提供的实用程序之一是get方法。 要通过 ID 获取任何内容,我们只需在此方法中传入 ID。 因此,我们在get方法中传递user.id来获取用户。 最后, roles.add方法将角色添加到用户。 在roles.add方法中,我们传递了角色 ID。 您可以在服务器设置的“角色”选项中找到角色 ID。 右键单击角色将为您提供复制角色 ID 的选项。 我们已经完成将反应角色系统添加到我们的机器人!

当用户从消息中删除他们的反应时,我们可以为要删除的角色添加功能。 这与我们上面的代码完全相同,唯一的区别是我们正在侦听messageReactionRemove事件并使用roles.remove方法。 因此,添加和删除角色的完整代码如下所示:

 // Adding reaction-role function client.on('messageReactionAdd', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208314766524526'); } } else return; }); // Removing reaction roles client.on('messageReactionRemove', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208314766524526'); } } else return; });

添加推特转发功能

我们要添加到机器人中的下一个功能将更具挑战性。 我们希望专注于特定的 Twitter 帐户,以便 Twitter 帐户在任何时候发布推文时,都会将其转发到我们的 Discord 频道

在开始编码之前,我们必须从 Twitter 开发者门户获取所需的令牌。 访问门户并通过单击“概述”选项中的“创建应用程序”按钮创建一个新应用程序。 为您的应用命名,复制所有标记,并将它们粘贴到代码的.env文件中,并使用正确的名称。 然后点击“App Settings”,开启三足OAuth功能。 出于测试目的,将以下 URL 添加为回调 URL:

 https://127.0.0.1/ https://localhost/

如果您拥有网站,请将地址添加到网站 URL,然后单击“保存”。 转到“密钥和令牌”选项卡,并生成访问密钥和令牌。 将它们复制并保存在您的.env文件中。 我们与 Twitter 开发者门户的合作已经完成。 我们可以回到我们的文本编辑器继续编码机器人。 为了实现我们想要的功能,我们必须添加另一个名为twit的 npm 包。 它是 Node.js 的 Twitter API 客户端。 它同时支持 REST 和流 API。

首先,使用npm install twit安装 twit 包,并在主文件中要求它:

 const Twit = require('twit');

我们必须使用Twit构造函数创建一个 twit 实例。 在Twit构造函数中传入一个对象,其中包含我们从 Twitter 获得的所有标记:

 const T = new Twit({ consumer_key: process.env.API_TOKEN, consumer_secret: process.env.API_SECRET, access_token: process.env.ACCESS_KEY, access_token_secret: process.env.ACCESS_SECRET, bearer_token: process.env.BEARER_TOKEN, timeout_ms: 60 * 1000, });

此处还指定了超时。 我们希望所有的前锋都在一个特定的频道中。 我创建了一个名为“Twitter forwards”的单独频道,所有的推文都将被转发。 我已经解释了如何创建频道。 创建您自己的频道并复制 ID。

 // Destination Channel Twitter Forwards const dest = '803285069715865601';

现在我们必须创建一个流。 流 API 允许通过网络访问数据流。 数据被分成更小的块,然后被传输。 这是我们流式传输数据的代码:

 // Create a stream to follow tweets const stream = T.stream('statuses/filter', { follow: '32771325', // @Stupidcounter });

follow键中,我指定@Stupidcounter ,因为它每分钟都会发推文,这对我们的测试目的非常有用。 您可以提供任何 Twitter 句柄的 ID 以获取其推文。 TweeterID 将为您提供任何句柄的 ID。 最后,使用stream.on方法获取数据并将其流式传输到所需的通道。

 stream.on('tweet', (tweet) => { const twitterMessage = `Read the latest tweet by ${tweet.user.name} (@${tweet.user.screen_name}) here: https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`; client.channels.cache.get(dest).send(twitterMessage); return; });

我们正在侦听tweet事件,并在发生这种情况时将推文传递给回调函数。 我们将构建一个自定义消息; 在我们的例子中,消息将是:

 Read the latest tweet by The Count (@Stupidcounter) here: https://twitter.com/Stupidcounter/status/1353949542346084353

同样,我们使用client.channels.cache.get方法来获取所需的频道,并使用.send方法来发送我们的消息。 现在,运行你的机器人并等待一分钟。 Twitter 消息将被发送到服务器。

机器人将推文发送到 Discord
转发到 Discord 的推文(大预览)

所以,这里是完整的 Twitter 转发代码:

 // Adding Twitter forward function const Twit = require('twit'); const T = new Twit({ consumer_key: process.env.API_TOKEN, consumer_secret: process.env.API_SECRET, access_token: process.env.ACCESS_KEY, access_token_secret: process.env.ACCESS_SECRET, bearer_token: process.env.BEARER_TOKEN, timeout_ms: 60 * 1000, }); // Destination channel Twitter forwards const dest = '803285069715865601'; // Create a stream to follow tweets const stream = T.stream('statuses/filter', { follow: '32771325', // @Stupidcounter }); stream.on('tweet', (tweet) => { const twitterMessage = `Read the latest tweet by ${tweet.user.name} (@${tweet.user.screen_name}) here: https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`; client.channels.cache.get(dest).send(twitterMessage); return; });

我们要添加的所有功能都已完成。 现在唯一剩下的就是将其部署到云端。 我们将为此使用 Heroku。

将机器人部署到 Heroku

首先,在机器人代码文件夹的根目录中创建一个新文件。 将其命名为Procfile 。 这个Procfile将包含程序启动时要执行的命令。 在该文件中,我们将添加worker: node app.js ,它将通知 Heroku 在启动时要运行哪个文件。

添加文件后,让我们启动一个git存储库,并将我们的代码推送到 GitHub(如何做到这一点超出了本文的范围)。 我建议的一件事是将node_modules文件夹和.env文件添加到.gitignore文件中,以便您的包大小保持较小并且敏感信息不会在外部共享。

成功将所有代码推送到 GitHub 后,请访问 Heroku 网站。 如果您还没有帐户,请登录或创建一个帐户。 单击“新建”按钮以创建一个新应用程序,并根据需要为其命名。 选择“部署方法”作为 GitHub。

选择 GitHub 作为部署方式
选择 GitHub 作为部署方式(大预览)

搜索您的应用程序,找到后单击连接。 从“部署”菜单启用自动部署,这样每次您将更改推送到代码时,代码都会自动部署到 Heroku。

现在,我们必须将配置变量添加到 Heroku,这非常容易。 转到应用名称下方的“设置”选项,然后单击“显示配置变量”。

向 Heroku 显示和添加配置变量
Heroku 上的配置变量(大预览)

在这里,我们将配置变量添加为键值对。 完成后,再次转到“部署”选项卡,然后单击“手动部署”下的“部署分支”。

最后要考虑的是,您可能会遇到60 秒的错误崩溃,导致机器人无法执行。 为了防止这种情况发生,我们必须更改应用程序的工作人员类型。 在 Heroku 中,如果您转到应用程序的“资源”选项卡,您会看到,在“免费 Dynos”下,启用了web npm start 。 我们必须关闭它并启用worker node app.js 。 因此,单击web npm start按钮旁边的编辑按钮,将其关闭,然后启用worker node app.js选项。 确认更改。 重新启动所有测功机,我们就完成了!

结论

我希望你喜欢阅读这篇文章。 我试图涵盖开发复杂机器人时需要了解的所有基础知识。 Discord.js 的文档是了解更多信息的好地方。 它有很好的解释。 此外,您将在 GitHub 存储库中找到所有代码。 以下是一些有助于您进一步发展的资源:

  • 文档,Discord 开发者门户
  • Discord API(不和谐服务器)
  • 部分,Discord.js,GitHub
  • 开发者门户,推特
  • Twit,包和文档