使用discord.js构建一个discord bot

2021-03-07 11:15:04

团队沟通平台日复一日地度过了越来越多的人在家工作。 Slack和Discord是最受欢迎的两个团队通信平台。虽然Discord专注于游戏玩家,但一些功能,例如在语音呼叫室中加入50名成员的功能,使其成为松弛的绝佳替代品。使用这种平台的最重要优点之一是使用机器人可以自动化许多任务。

在本文中,我们将使用JavaScript和Discord.js的帮助构建从头开始的机器人。我们将介绍从建立BOT的过程,以将其部署到云端。在建立我们的机器之前,让我们击败我们的机器人的功能:

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

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

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

我们需要创建服务器的原因是,如果没有管理员的管理权限,我们将无法向服务器添加机器人。创建服务器后,我们会将机器人添加到服务器并从Discord的Developer Portal获取访问令牌。此令牌允许我们与Discord API通信。 Discord为我们提供官方开放API与我们互动。 API可用于从为集成OAuth的机器人的请求提供任何内容。 API从单服务器BOT支持所有方式到达数百个服务器上的机器人的所有方式。它非常强大,可以通过很多方式实现。

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

现在我们知道我们是如何建造我们的机器人,让我们开始努力。

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

建立一个discord服务器很容易,并且Discord现在提供模板,这使得它更加容易。按照以下步骤操作,您的discord服务器将准备好。首先,我们将选择我们将如何访问discord门户。我们可以使用Web版本或应用程序。两者都以同样的方式工作。我们将使用此教程的Web版本。

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

我们将选择“创建自己的”选项。让我们跳过下一个问题。我们将致电我们的Discord服务器“粉碎示例”。您还可以为您的服务器提供照片。单击“创建”按钮将创建服务器。

在编码BOT之前,我们需要获得不和谐提供的令牌。此令牌将与我们的代码建立联系以使其不和谐。要获取令牌,我们必须使用我们的服务器注册我们的机器人。要注册机器人,我们必须访问discord的开发人员门户。如果您首次构建Discord应用程序,您将在那里找到一个空名单。要注册我们的应用程序,请单击右上角的“新应用程序”链接。为您的应用程序提供名称,然后单击“创建”按钮。我们将为我们的应用程序命名为“粉碎应用程序”。

新菜单给了我们一些选项。在右侧是标记为“Bot”的选项。单击它,然后选择“添加机器人”。单击确认,如果需要,更改机器人的名称,保存更改,并复制从此页面收到的令牌。我们的机器人现在在不和谐中注册。我们可以开始添加功能并编码机器人。

discord.js是一个功能强大的节点.js模块,允许您轻松地与discord api进行交互。它采用比大多数其他JS Discord图书馆更多的面向对象的方法,使您的机器人的代码显着下来更加平坦,更容易理解。

所以,discord.js与discord api更容易进行互动。它与官方不和谐API有100%的覆盖范围。

打开您喜欢的文本编辑器,并创建一个文件夹,其中所有文件将保存。将命令行界面(CLI),CD打开到文件夹中,并用NPM初始化文件夹:NPM Init -y。

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

安装完成后,在根文件夹中创建两个文件。命名文件之一.env。将其他主要文件命名为您想要的任何内容。我会命名它app.js.文件夹结构将如下所示:

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

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

我们可以开始在App.js文件上工作。首先要做的是要求我们安装的模块。

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

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

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

我们将倾听的第一个事件是准备好的事件。当与Discord API的连接准备就绪时,此方法会触发。在此方法中,我们可以通过在Discord API和我们的应用程序之间建立连接时将执行的功能。让我们在此方法中传递控制台语句,以便我们可以知道是否建立了连接。 Client.on方法使用Ready事件将如下所示:

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

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

消息事件侦听某些消息。使用REPLY方法,我们可以根据用户的消息编写BOT以回复。

只要收到“Hello”消息,此示例代码将回复“HI”。但为了做出这项工作,我们必须用服务器连接机器人。

到目前为止,机器人没有与任何服务器连接。要与我们的服务器(Smashing示例)连接,请访问Discord的Developer Portal。单击本教程前面创建的应用程序的名称(在我们的案例中,“粉碎应用程序”)。选择应用程序,然后单击菜单中的“OAuth2”选项。您会发现一个名为“scopes”的小组。选中“Bot”复选框,然后复制生成的URL。

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

如果您现在访问Discord Server,您将看到Discord已发送通知,并且BOT现在也在右侧的成员列表中显示出来。

现在我们的机器人与服务器连接,如果向服务器发送“Hello”,那么机器人将以“HI”回复。这只是对discord api的介绍。真正的乐趣即将开始。

使用discord.js模块熟悉更多,让我们在收到特定命令时,让我们添加发送笑话的功能。这类似于我们刚刚完成的东西。

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

如果您在Discord中使用了机器人提供的功能,则可能注意到某些特殊字符区分正常消息从特殊命令。我打算用一个?在我们的命令前,使它们看起来与正常消息不同。所以,我们的笑话命令将是笑话。

我们将在App.js文件中创建一个名为jokes的数组。我们将从数组中获取随机笑话的方式是使用此公式:

math.random()* jokes.Length公式将在数组范围内生成一个随机数。 Math.Floor方法将底板产生的数字。

如果您的console.log(),math.floor(math.random()* jokes.length),您将获得更好的理解。最后,笑话[]将为我们提供来自笑话阵列的随机笑话。

您可能已经注意到我们的第一个代码用于回复我们的消息。但我们不想在这里得到回复。相反,我们希望将一个笑话作为邮件,而无需标记任何人。为此,discord.js模块具有命名为channel.send()的方法。使用此方法,我们可以向调用命令的频道发送消息。因此,此时的完整代码如下所示:

const discord =要求(' discord.js');需要(' dotenv')。config(); const client = new discord.client(); client.login(process.env .bot_token); client.on('准​​备好',()=> console.log('机器人准备好!'));添加jokes函数//笑话来自dcslsoftware.com/20-one-liners-only-software-developers-understand///www.journaldev.com/240/my-25-favorite-programming-quotes-that-are-funny-tooconst jokes = [& #39;我去了一条房子的街道,房子被编号为8k,16k,32k,64k,128k,256k和512k。这是一场下行记忆道。''“调试”就像是在犯罪戏剧中的侦探,你也是凶手。&#39 ;,#39;最好的事情布尔是,即使你错了,你也只有一点。''一名程序员在睡觉前在床头柜上放两张眼镜。一个完整的一个,万一他受口渴,一个空洞的,如果他没有。&#39 ;,#39;如果你听一个Unix壳牌,你能听到c吗?'', '为什么Java程序员必须戴眼镜?因为他们不是c#。&#39 ;,'什么坐在你的肩膀上,说“7件! 7件!“鹦鹉错误。''当苹果员工死亡时,他们的生活在他们的眼睛前面有HTML5吗?','没有要求或设计,编程是添加错误的艺术一个空的文本文件。''在软件可以重复使用之前首先必须使用。&#39 ;,'加速计算机的最佳方法是将其提升9.8 m / s2。''我认为微软名为.net,所以它不会在Unix目录列表中显示。''有两种方法可以写无错误程式;只有第三个作品。',]; client.on('消息' {if(msg)=> {if(msg.content ==='?笑话' ){msg.channel.send(笑话[math.floor(math.random()* jokes.length)]);}});

我已经删除了代码的“Hello”/“Hi”部分,因为这不再用于我们。

既然你对discord.js模块有一个基本的了解,让我们更深刻。但是该模块可以更多地完成 - 例如,将角色添加到一个人或禁止他们或踢掉它们。现在,我们将建立一个简单的反应角色系统。

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

部分是一个discord.js概念。 discord.js通常会缓存所有消息,这意味着它将消息存储在集合中。当缓存的消息收到一些事件时,例如收到消息或回复,将发出事件。但是在机器人开始之前发送的消息是未生命的。因此,除非我们在使用之前,否则对此类实例的反应不会发出任何事件。 discord.js图书馆的版本12介绍了部分的概念。如果我们想捕获这种未加工的事件,我们必须选择偏袒。图书馆有五种类型的部分:

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

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

在“服务器设置”中,转到“角色”选项,然后单击其在它所说“角色”之前的Small Plus图标(+)。

首先,让我们创建机器人角色,并确保在角色选项菜单中检查“管理角色”选项。创建机器人角色后,您可以添加更多角色。我添加了JS,C ++和Python角色。你不必给他们任何特殊能力,但它是一个选择。

在这里,记得有一件事:Discord角色基于优先级工作。它的任何角色都可以管理它的角色,但它无法管理其上方的角色。我们希望我们的机器人角色来管理JS,C ++和Python角色。因此,确保机器人角色高于其他角色。只需拖放“在”服务器设置的“角色”菜单中更改角色的顺序。

完成创建角色时,将机器人角色分配给机器人。要提供角色,请单击服务器右侧成员列表中的Bot名称,然后单击Small Plus图标(+)。它会向您展示所有可用的角色。在此处选择“Bot”角色,您将完成。

我们所创建的角色不能在我们的代码中使用它们的名称。在Discord中,从邮件到角色的一切都有自己的ID。如果在任何消息中单击“更多”指示灯,则会看到名为“COPY ID”的选项。此选项可用于discord中的所有内容,包括角色。

最有可能的是,默认情况下,您将无法找到此选项。您必须激活一个名为“开发人员模式”的选项。要激活它,请向Discord设置(不是您的服务器设置),左下方的名称左侧。然后转到“应用程序设置”下的“外观”选项,并从此处激活“开发人员模式”。现在你将能够复制ID。

当消息受到反应时需要发射的事件是MessageActionAddd。并且只要删除反应,就应该发出MessageActionRemove事件。

让我们继续建立系统。正如我所说,首先,我们需要倾听MessagereActionAdd的事件。 MessageActionAddd和MessAntereActionRemove事件都在回调函数中取两个参数。第一个参数是反应,第二个参数是用户。这些是非常自我解释的。

首先,我们将创建一条消息,描述哪个表情符号将提供哪个角色,类似于我在此处完成的内容:

您可能会思考,我们如何在我们的代码中使用这些表情符号?默认的emoji是Unicode,我们必须复制Unicode版本。如果您遵循语法\:emojiname:并按“Enter”,您将获得一个名称的Emoji。例如,我的emoji为javascript角色是狐狸;所以,如果我输入\:狐狸:并在discord中命中“进入”,我会收到狐狸表情符号。同样,我会使用\:虎:和\:蛇:得到那些表情符号。将这些保留在您的不和谐设置;我们稍后需要他们。

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

//添加反应 - 角色函数client.on(' messanteActionaddddddd dr',异步(反应,用户)=> {if(ression.message.partial)等待反应.fetch();如果(反应。部分)等待反应.Fetch();如果(user.bot)返回;如果(!ression.message.guild)返回;});

我们通过异步功能。在回调中,我们正在做的第一件事是检查消息是部分。如果是,那么我们获取它,含义在JavaScript Map方法中缓存或将其存储在一起。同样,我们检查反应本身是否是部分,然后做同样的事情。然后,我们检查反应的用户是否是机器人,因为我们不想为对我们的消息做出反应的机器人分配角色。最后,我们检查消息是否在服务器上。 discord.js使用公会作为服务器的替代名称。如果消息不在服务器上,则我们将停止函数。

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

if(ressure.message.Channel.id ==' 802209416685944862'){if(ression.emoji.name ==='🦊'){await反应.message.guild.members .cache .get .get(user.id).roles.add(' 802208163776167977'); }如果(retcher.emoji.name ===''){await amert.message.guild.guild.guild.guild.cache .gets.gets.add(' 802208242696192040&# 39;); }如果(ression.emoji.name ==='🐍'){awaitrame.message.guild.guild.guild.gumbers.cache .gets.gols.add(' 802208314766524526&# 39;); }}否则退货;

以上是回调中的其余代码。 我们正在使用amert.Channel.ID属性获取频道的ID。 然后,我们将其与我们刚刚复制的角色通道ID进行比较。 如果是真的,那么我们检查表情符号并将它们与反应进行比较。 retthe.emoji.name返回用于反应的表情符号。 我们将其与Emoji的Unicode版本进行比较。 如果它们匹配,那么我们等待了amert.message.guild.members.cache属性。 缓存是存储数据的集合。 这些集合是具有额外实用程序的JavaScript地图。 它提供的一个实用程序是get方法。 要通过ID获取任何内容,我们可以简单地通过此方法中的ID。 所以,我们通过user.ID获取方法来获取用户。 最后,roles.add方法将角色添加到用户。 在roles.add方法中,我们是pa ......