首页  >  文章  >  web前端  >  创建基于 Node.js 的 Slack 机器人

创建基于 Node.js 的 Slack 机器人

WBOY
WBOY原创
2023-08-28 19:49:021150浏览

创建基于 Node.js 的 Slack 机器人

松弛是 迅速成为团队沟通的新行业标准。在 事实上,它是如此受欢迎,以至于当我输入 slack 时 进Google,果然如我所料,第一个结果是这个词的定义 从字典中。 Slack 的网站紧随其后!

这是 对于英语词典中最常见的单词来说几乎是闻所未闻的。通常,Google 的定义后面会附有几个顶级词典的链接 网站。

什么是 Slack?

在其 最基本的是,Slack 是一个消息系统。它允许直接向团队发送消息 会员和创建渠道(私人或公共),以方便实时 团队沟通与协作。了解更多 关于Slack的信息,可以查看Slack的 特点。

此时 一点,您可能想知道 Node.js 的用武之地。正如我所提到的,从最基本的角度来说,Slack 是一个消息系统;它是一个消息系统。然而,它可以无限扩展 定制。 Slack 提供了一个非常灵活的系统来定制您的 团队整合,包括:

  • 创建自定义欢迎信息 消息
  • 创建自定义表情符号
  • 安装第三方 应用
  • 创建自己的 应用
  • 创建自定义 Slack 机器人

在这个 文章中,我将演示如何使用 Node.js 创建一个 Slack 机器人 可以添加到您团队的 Slack 配置中。

Slack 机器人定义

松弛 Bot 的工作是接收 Slack 发送的事件并处理它们。将发送大量事件 到你的机器人,这就是 Node.js 的用武之地。我们必须决定不 只关心要处理哪些事件,以及如何处理每个单独的事件。

对于 例如,机器人将处理的一些常见事件是:

  • member_joined_channel
  • member_left_channel
  • 消息

在这个 文章中,我将创建一个 Node.js 应用程序和一个可以添加的 Slack Bot 到您的团队项目以根据事件执行特定操作 收到。

首先,我需要在 Slack 上创建一个机器人。可以创建两种类型的机器人:

  • 自定义机器人
  • 创建应用并添加机器人用户

本文将创建一个自定义机器人,因为如果您计划在 Slack 上编写和发布应用程序,那么应用程序机器人用户会更合适。鉴于我希望这个机器人对我的团队来说是私有的,自定义机器人就足够了。

创建自定义 Slack 机器人

可以在此处创建自定义机器人:https://my.slack.com/apps/A0F7YS25R-bots。如果您已经登录 Slack 帐户,请选择左侧的添加配置按钮;否则,请先登录您的 Slack 帐户,然后再继续。如果您没有 Slack 帐户,可以免费注册。

这将带您进入一个新页面,要求您提供机器人的用户名。立即输入您的用户名,确保遵循 Slack 的命名指南。选择一个精彩的机器人名称后,请按添加机器人配置

成功创建机器人后,Slack 会将您重定向到允许进一步自定义机器人的页面。我会把这部分留给你创造性的自己。此页面唯一需要的是以 xoxb- 开头的 API 令牌。我可以将此令牌复制到安全位置以供以后使用,也可以简单地将此页面保持打开状态,直到我们需要 Node.js 应用程序的令牌为止。

配置

在继续编写代码之前,还需要两个 Slack 配置:

  1. 创建或选择您的机器人将与之交互的现有频道。当我测试新机器人时,我选择创建一个新频道。请务必记住频道名称,因为您很快就会在应用程序中需要它。
  2. 将您的机器人添加/邀请到频道,以便与其互动。

现在我已经配置了 Slack Bot,是时候转到 Node.js 应用程序了。如果您已经安装了 Node.js,则可以继续下一步。如果您尚未安装 Node.js,我建议您首先访问 Node.js 下载页面并选择适合您系统的安装程序。

对于 my Slack Bot, I am going to create a new Node.js application by running through the npm init process. With a command prompt that is set to where you wish your application to be installed, you can run the following commands:

mkdir slackbot
cd slackbot
npm init

如果您不熟悉 npm init,这会启动一个实用程序来帮助您配置新项目。它询问的第一件事是名称。它默认我的为 slackbot,我对此感到满意。如果您想更改您的应用程序名称,现在就是机会;否则,请按Enter继续下一步配置步骤。接下来的选项是版本和描述。我将这两个选项都保留为默认值,只需按 Enter 键继续选择这两个选项。

入口点

接下来要求的是入口点。默认为 index.js;然而,很多人喜欢使用 app.js。我不想参加这场辩论,并且考虑到我的应用程序不需要密集的项目结构,我将把我的应用程序保留为默认值 index.js

当您从可能像制表符与空格一样激烈的争论中恢复过来后,配置将继续,并提出几个问题:

  • 测试命令
  • git 存储库
  • keywords
  • 作者
  • 许可证

对于 the purposes of this article, I've left all options as their default. Finally, once all options have been configured, a confirmation of the package.json file is displayed prior to creating it. Press Enter to complete the configuration.

输入SDK

为了更轻松地与 Slack 交互,我还将安装 Slack 开发者工具包,如下所示:

npm install @slack/client --save

你终于准备好编写一些代码了吗?我当然是。首先,我将使用 Slack 开发者工具包网站上的示例代码,该代码使用实时消息 API (RTM) 发布一条 Slack 消息,并进行一些调整。

鉴于我选择的入口点index.js,是时候创建此文件了。 Slack 开发人员工具包网站上的示例大约有 20 行代码。我将一次将其分解为几行,只是为了解释这些行的作用。但请注意,所有这些行都应包含在您的 index.js 文件中。

代码首先包含 Slack 开发人员工具包中的两个模块:

var RtmClient = require('@slack/client').RtmClient;
var CLIENT_EVENTS = require('@slack/client').CLIENT_EVENTS;

RtmClient 一旦实例化,将成为引用 RTM API 的机器人对象。 CLIENT_EVENTS 是机器人将侦听的事件。

包含这些模块后,就可以实例化并启动机器人了:

var rtm = new RtmClient('xoxb-*************************************');
rtm.start();

请务必将上面混淆的 API 令牌替换为您在 Slack Bot 创建过程中获得的令牌。

在我的 RtmClient 上调用 start 函数将初始化机器人的会话。这将尝试验证我的机器人。当我的机器人成功连接到 Slack 时,将发送事件,允许我的应用程序继续进行。这些事件将立即显示。

实例化客户端后,将创建一个 channel 变量,该变量将立即填充到 CLIENT_EVENTS 事件之一内。

let channel;

channel 变量将用于执行特定操作,例如向机器人连接的通道发送消息。

当 RTM 会话启动 (rtm.start();) 并为机器人提供有效的 rtm.start();) 并为机器人提供有效的 API 令牌时,会生成一个 将发送 RTM.AUTHENTICATEDAPI 令牌

时,会生成一个 将发送 RTM.AUTHENTICATED 消息。接下来的几行监听此事件:

rtm.on(CLIENT_EVENTS.RTM.AUTHENTICATED, (rtmStartData) => {
  for (const c of rtmStartData.channels) {
      if (c.is_member && c.name ==='jamiestestchannel') { channel = c.id }
  }
  console.log(`Logged in as ${rtmStartData.self.name} of team ${rtmStartData.team.name}`);
});
RTM.AUTHENTICATED 事件时,前面的代码会在 Slack 团队频道列表中执行 for 循环。就我而言,我专门寻找jamiestestchannel并确保我的机器人是该频道的成员。当满足该条件时,通道 ID 将存储在 channel当收到 RTM.AUTHENTICATED 事件时,前面的代码会在 Slack 团队频道列表中执行 for 循环。就我而言,我专门寻找

jamiestestchannel

并确保我的机器人是该频道的成员。当满足该条件时,通道 ID 将存储在

变量中。

${rtmStartData.self.name}) 和团队名称成功进行身份验证(${rtmStartData.team.name}调试

为了帮助调试,会记录一条控制台消息,其中显示一条消息,表明机器人已通过显示其名称 (RTM.RTM_CONNECTION_OPENED) 它属于。 机器人经过身份验证后,会触发另一个事件 (),这表示机器人已完全连接并可以开始与 Slack 交互。接下来的代码行创建事件监听器;成功后,一条Hello!

消息将发送到该频道(在我的例子中,

jamiestestchannel

)。

rtm.on(CLIENT_EVENTS.RTM.RTM_CONNECTION_OPENED, function () {
  rtm.sendMessage("Hello!", channel);
});

此时 point, I can now run my Node application and watch my bot automatically post a new message to my channel:🎜
node index.js
🎜运行此命令(成功时)的结果有两个:🎜
  1. 我收到调试消息,表明我的机器人已成功登录。这源自启动 RTM 客户端后触发的 RTM.AUTHENTICATED
  2. 我在 Slack 频道中收到一条Hello!消息。当应用程序接收并处理 RTM.RTM_CONNECTION_OPENED 事件消息时,会发生这种情况。

在继续和进一步增强我的应用程序之前,现在是回顾一下我到目前为止所做的工作的好时机:

  1. 创建了一个自定义 Slack 机器人。
  2. 创建了一个自定义 Slack 频道并邀请我的机器人加入。
  3. 创建了一个名为 slackbot 的新 Node.js 应用程序。
  4. 已将 Slack 开发者工具包安装到我的应用程序中。
  5. 创建了我的 index.js 文件,该文件使用我的自定义机器人中的 API 令牌 创建 RtmClient
  6. RTM.AUTHENTICATED 创建了一个事件侦听器,用于查找我的机器人所属的 Slack 频道。
  7. RTM.RTM_CONNECTION_OPENED 创建了一个事件侦听器,用于向我的 Slack 频道发送Hello!消息。
  8. 调用 RTM Start Session 方法来开始由我的事件侦听器处理的身份验证过程。

构建机器人

现在是真正的乐趣开始的时候了。 Slack 提供(我没有数)至少 50 个不同的事件可供我的自定义机器人监听和选择性处理。正如您从 Slack 事件列表中看到的,某些事件是 RTM API(我们正在使用的)自定义的,而其他事件是 Events API 自定义的。在撰写本文时,我的理解是 Node.js SDK 仅支持 RTM。

为了完成我的机器人,我将处理 message 事件;当然,这可能是最复杂的事件之一,因为它支持大量子类型,我稍后将探讨这些子类型。

以下是 Slack 中最基本的 message 事件的示例:

{
    "type": "message", 
    "channel": "C2147483705", 
    "user": "U2147483697", 
    "text": "Hello world", 
    "ts": "1355517523.000005" 
}

在这个 basic object, the three most important things I care about are:

  1. 频道。我希望确保此消息属于我的机器人所属的频道。
  2. 用户。这将使我能够直接与用户交互或根据用户身份执行特定操作。
  3. text。这可能是最重要的部分,因为它包含消息的内容。我的机器人只想响应某些类型的消息。

有些消息更为复杂。它们可以包含许多子属性,例如:

  • edited:一个子对象,描述哪个用户编辑了消息以及消息发生的时间。
  • subtype:定义多种不同类型之一的字符串,例如channel_join、channel_leave等。

  • is_starred:一个布尔值,指示此消息是否已加星标。

  • pinned_to:已固定此消息的通道数组。

  • reactions:一组反应对象,定义反应是什么(例如捂脸)、反应发生的次数以及对消息做出这种反应的用户数组。

我将扩展之前创建的 index.js 来监听 message 事件。为了减少代码冗余,以下示例将仅包含与 message 事件增强相关的部分代码。

必须做的第一件事是为我将要收听的 RTM_EVENTS 添加一个新模块。我已将其放置在我之前的两个模块下方:

var RTM_EVENTS = require('@slack/client').RTM_EVENTS;

处理 message 事件的代码我将放置在文件的底部。为了测试 message 事件是否正常工作,我创建了一个新的事件侦听器,它将 message 对象记录到控制台,如下所示:

rtm.on(RTM_EVENTS.MESSAGE, function(message) {
    console.log(message);
});

我现在可以重新运行我的 Node 应用程序 (node index.js)。当我在频道中输入消息时,以下内容将记录到我的控制台:

{ 
    type: 'message',
    channel: 'C6TBHCSA3',
    user: 'U17JRET09',
    text: 'hi',
    ts: '1503519368.000364',
    source_team: 'T15TBNKNW',
    team: 'T15TBNKNW' 
}

到目前为止,一切都很好。我的机器人已成功接收消息。下一个增量步骤是确保消息属于我的机器人所在的频道:

rtm.on(RTM_EVENTS.MESSAGE, function(message) {
    if (message.channel === channel)
        console.log(message);
});

现在,当我运行我的应用程序时,如果 message 事件适用于我的机器人所属的 channel,我只会看到调试消息。

我现在将扩展应用程序以向频道发送自定义消息,演示如何在消息中标记用户:

rtm.on(RTM_EVENTS.MESSAGE, function(message) {
    if (message.channel === channel)
        rtm.sendMessage("Stop, everybody listen, <@" + message.user + "> has something important to say!", message.channel);
});

现在,当任何人在频道中输入消息时,我的机器人都会发送自己的消息,如下所示:“停下来,大家听着,@endyourif 有重要的事情要说!”

好吧,不是很有用。相反,我将通过增强 message 事件侦听器以响应特定命令来完成我的机器人。这将通过执行以下操作来完成:

  1. 根据空格将 messagetext 部分拆分为一个数组。
  2. 检查第一个索引是否与我的机器人的用户名匹配。
  3. 如果是,我将查看第二个索引(如果存在)并将其视为我的机器人应执行的命令

为了轻松检测我的机器人是否被提及,我需要创建一个新变量来存储我的机器人用户 ID。下面是更新的代码部分,我之前在其中设置了 channel 变量。现在,它还将我的机器人的用户 ID 存储在名为 bot 的变量中。

let channel;
let bot;

rtm.on(CLIENT_EVENTS.RTM.AUTHENTICATED, (rtmStartData) => {
  for (const c of rtmStartData.channels) {
      if (c.is_member && c.name ==='jamiestestchannel') { channel = c.id }
  }
  console.log(`Logged in as ${rtmStartData.self.name} of team ${rtmStartData.team.name}`);
  
  bot = '<@' + rtmStartData.self.id + '>';
});

通过设置 bot 变量,我通过充实之前创建的 message 事件监听器来完成我的机器人,如下所示:

rtm.on(RTM_EVENTS.MESSAGE, function(message) {
    if (message.channel === channel) {
		if (message.text !== null) {
			var pieces = message.text.split(' ');
			
			if (pieces.length > 1) {
				if (pieces[0] === bot) {
					var response = '<@' + message.user + '>';
					
					switch (pieces[1].toLowerCase()) {
						case "jump":
							response += '"Kris Kross will make you jump jump"';
							break;
						case "help":
							response += ', currently I support the following commands: jump';
							break;
						default:
							response += ', sorry I do not understand the command "' + pieces[1] + '". For a list of supported commands, type: ' + bot + ' help';
							break;
					}
					
					rtm.sendMessage(response, message.channel);
				}
			}
		}
	}
});

以下代码将数组中的 text 对象的 message 属性基于空格进行拆分。接下来,我确保数组中至少有两个元素,最好是我的机器人和要执行的命令。

当数组中的第一个元素与我的机器人匹配时,我对数组中的第二个元素执行 switch 语句:命令。当前支持的命令有jumphelp。当一条消息发送到看起来像“@jamiestest跳转”的频道时,我的机器人将向原始用户回复一条特殊消息。

如果该命令未被识别,它将落入我的 switch 的默认 case 语句中,并使用如下所示的通用命令进行响应:“@endyourif,抱歉,我不明白命令“hi”。有关受支持命令的列表,请键入:@jamiestest help"。

结论

此时 point, my bot is complete! If you are interested in further enhancing your bot, here's a list of ideas:

  • 通过监听 team_join 事件来处理新团队成员的加入。当新团队成员加入时,最好向他们发送各种入职信息和/或文件,欢迎他们加入您的团队。
  • 增强我已启动的受支持命令列表。
  • 通过搜索数据库、Google、YouTube 等使命令具有交互性。
  • 在应用程序上创建机器人用户并创建您自己的自定义斜杠命令。

以上是创建基于 Node.js 的 Slack 机器人的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn