首页 > web前端 > js教程 > 正文

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

WBOY
发布: 2023-08-28 19:49:02
原创
1180人浏览过

创建基于 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();) 并为机器人提供有效的 API 令牌时,会生成一个 将发送 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 变量中。

调试

为了帮助调试,会记录一条控制台消息,其中显示一条消息,表明机器人已通过显示其名称 (${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. 根据空格将 message 的 text 部分拆分为一个数组。
  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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号