首頁  >  文章  >  web前端  >  創建基於 Node.js 的 Slack 機器人

創建基於 Node.js 的 Slack 機器人

WBOY
WBOY原創
2023-08-28 19:49:021102瀏覽

创建基于 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 played prior to creating itit. 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. 根据空格将 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