鬆弛是 迅速成為團隊溝通的新產業標準。在 事實上,它是如此受歡迎,以至於當我輸入 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 played prior to creating itit. 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();
) 並為機器人提供有效的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
執行此指令(成功時)的結果有兩個:
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中文網其他相關文章!