松弛是 迅速成为团队沟通的新行业标准。在 事实上,它是如此受欢迎,以至于当我输入 slack 时 进Google,果然如我所料,第一个结果是这个词的定义 从字典中。 Slack 的网站紧随其后!
这是 对于英语词典中最常见的单词来说几乎是闻所未闻的。通常,Google 的定义后面会附有几个顶级词典的链接 网站。
在其 最基本的是,Slack 是一个消息系统。它允许直接向团队发送消息 会员和创建渠道(私人或公共),以方便实时 团队沟通与协作。了解更多 关于Slack的信息,可以查看Slack的 特点。
此时 一点,您可能想知道 Node.js 的用武之地。正如我所提到的,从最基本的角度来说,Slack 是一个消息系统;它是一个消息系统。然而,它可以无限扩展 定制。 Slack 提供了一个非常灵活的系统来定制您的 团队整合,包括:
在这个 文章中,我将演示如何使用 Node.js 创建一个 Slack 机器人 可以添加到您团队的 Slack 配置中。
松弛 Bot 的工作是接收 Slack 发送的事件并处理它们。将发送大量事件 到你的机器人,这就是 Node.js 的用武之地。我们必须决定不 只关心要处理哪些事件,以及如何处理每个单独的事件。
对于 例如,机器人将处理的一些常见事件是:
member_joined_channel
member_left_channel
消息
在这个 文章中,我将创建一个 Node.js 应用程序和一个可以添加的 Slack Bot 到您的团队项目以根据事件执行特定操作 收到。
首先,我需要在 Slack 上创建一个机器人。可以创建两种类型的机器人:
本文将创建一个自定义机器人,因为如果您计划在 Slack 上编写和发布应用程序,那么应用程序机器人用户会更合适。鉴于我希望这个机器人对我的团队来说是私有的,自定义机器人就足够了。
可以在此处创建自定义机器人:https://my.slack.com/apps/A0F7YS25R-bots。如果您已经登录 Slack 帐户,请选择左侧的添加配置按钮;否则,请先登录您的 Slack 帐户,然后再继续。如果您没有 Slack 帐户,可以免费注册。
这将带您进入一个新页面,要求您提供机器人的用户名。立即输入您的用户名,确保遵循 Slack 的命名指南。选择一个精彩的机器人名称后,请按添加机器人配置。
成功创建机器人后,Slack 会将您重定向到允许进一步自定义机器人的页面。我会把这部分留给你创造性的自己。此页面唯一需要的是以 xoxb-
开头的 API 令牌。我可以将此令牌复制到安全位置以供以后使用,也可以简单地将此页面保持打开状态,直到我们需要 Node.js 应用程序的令牌为止。
在继续编写代码之前,还需要两个 Slack 配置:
现在我已经配置了 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
。
当您从可能像制表符与空格一样激烈的争论中恢复过来后,配置将继续,并提出几个问题:
对于 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.
为了更轻松地与 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.AUTHENTICATED
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
当收到 RTM.AUTHENTICATED
事件时,前面的代码会在 Slack 团队频道列表中执行 for
循环。就我而言,我专门寻找jamiestestchannel
${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); });
node index.js
RTM.AUTHENTICATED
。RTM.RTM_CONNECTION_OPENED
事件消息时,会发生这种情况。在继续和进一步增强我的应用程序之前,现在是回顾一下我到目前为止所做的工作的好时机:
index.js
文件,该文件使用我的自定义机器人中的 API 令牌 创建 RtmClient
。RTM.AUTHENTICATED
创建了一个事件侦听器,用于查找我的机器人所属的 Slack 频道。RTM.RTM_CONNECTION_OPENED
创建了一个事件侦听器,用于向我的 Slack 频道发送Hello!消息。现在是真正的乐趣开始的时候了。 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:
频道
。我希望确保此消息属于我的机器人所属的频道。用户
。这将使我能够直接与用户交互或根据用户身份执行特定操作。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
事件侦听器以响应特定命令来完成我的机器人。这将通过执行以下操作来完成:
message
的 text
部分拆分为一个数组。为了轻松检测我的机器人是否被提及,我需要创建一个新变量来存储我的机器人用户 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
语句:命令。当前支持的命令有jump 和help。当一条消息发送到看起来像“@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
事件来处理新团队成员的加入。当新团队成员加入时,最好向他们发送各种入职信息和/或文件,欢迎他们加入您的团队。以上是创建基于 Node.js 的 Slack 机器人的详细内容。更多信息请关注PHP中文网其他相关文章!