ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js ベースの Slack ボットを作成する

Node.js ベースの Slack ボットを作成する

WBOY
WBOYオリジナル
2023-08-28 19:49:021102ブラウズ

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

Slack は 急速にチームコミュニケーションの新しい業界標準になりつつあります。存在する 実際、とても人気があるので、slack と入力すると、 Google に入ると、予想通り、最初に表示されたのはこの単語の定義でした。 辞書から。 Slack の Web サイトが僅差で 2 位です。

###これは 英語辞書で最も一般的な単語としてはほとんど聞いたことがない。通常、Google の定義の後には、いくつかのトップ辞書へのリンクが続きます。 Webサイト。

Slack とは何ですか?

その中で 最も基本的な Slack はメッセージング システムです。チームに直接メッセージを送信できるようになります リアルタイムを促進するためのメンバーシップとチャンネル (プライベートまたはパブリック) の作成 チームのコミュニケーションとコラボレーション。もっと詳しく知る Slack について詳しくは、Slack の 特徴。

###現時点では ある時点で、Node.js がどこに登場するのか疑問に思うかもしれません。先ほども述べたように、最も基本的なレベルでは、Slack はメッセージング システムです。ただし無限に拡張可能 カスタムメイド。 Slack は、カスタマイズするための非常に柔軟なシステムを提供します。 チーム統合(以下を含む):

カスタムウェルカムメッセージを作成する 情報###
    カスタム絵文字を作成する
  • サードパーティをインストールする 応用### ###自分で作る 応用###
  • カスタム Slack ボットを作成する
  • これで この記事では、Node.js を使用して Slack ボットを作成する方法を説明します。 チームの Slack 設定に追加できます。
  • Slack ロボットの定義
  • リラクゼーション ボットの仕事は、Slack から送信されたイベントを受信して​​処理することです。たくさんのイベントが発信されます ボットにとって、ここで Node.js が役に立ちます。私たちはそうしないことを決めなければなりません どのイベントを処理するか、そしてそれぞれのイベントをどのように処理するかに注意してください。
###のために たとえば、ボットが処理する一般的なイベントは次のとおりです。

メンバー参加チャンネル

member_left_channel
  • ######情報###### これで この記事では、Node.js アプリケーションと追加可能な Slack Bot を作成します。 チームプロジェクトに追加して、イベントに基づいて特定のアクションを実行します 受け取る。
  • まず、Slack 上にボットを作成する必要があります。 2 種類のボットを作成できます:
  • カスタムロボット
  • アプリケーションの作成とロボット ユーザーの追加
Slack でアプリケーションを作成して公開する予定がある場合は、Appbot ユーザーの方が適切であるため、この記事ではカスタム ボットを作成します。このボットをチームにプライベートなものにしたいと考えると、カスタム ボットで十分です。

カスタム Slack ボットを作成する

カスタム ボットはここで作成できます: https://my.slack.com/apps/A0F7YS25R-bots。すでに Slack アカウントにログインしている場合は、左側の [
    Add Configuration] ボタンを選択します。それ以外の場合は、続行する前に Slack アカウントにログインしてください。 Slack アカウントをお持ちでない場合は、無料でサインアップできます。
  • これにより、ボットのユーザー名の入力を求める新しいページが表示されます。 Slack の命名ガイドラインに従っていることを確認して、ユーザー名を入力してください。適切なボット名を選択したら、
  • Add Bot Configuration
  • を押します。

ボットの作成が正常に完了すると、Slack はボットをさらにカスタマイズできるページにリダイレクトします。この部分はクリエイティブなあなたに任せます。このページに必要なのは、

xoxb-

で始まる

API トークン

だけです。このトークンを後で使用するために安全な場所にコピーすることも、Node.js アプリケーションにトークンが必要になるまでこのページを開いたままにすることもできます。 ###構成### コードの記述を続ける前に、さらに 2 つの Slack 構成が必要です:

ボットが対話する既存のチャネルを作成または選択します。新しいボットをテストするときは、新しいチャネルを作成することを選択します。チャンネル名はアプリですぐに必要になるため、必ず覚えておいてください。

ボットをチャンネルに追加/招待して、ボットと対話します。

Slack ボットの構成が完了したので、次は Node.js アプリケーションに進みます。 Node.js がすでにインストールされている場合は、次のステップに進むことができます。 Node.js をまだインストールしていない場合は、まず Node.js のダウンロード ページにアクセスし、システムに適したインストーラーを選択することをお勧めします。 Slack ボットの場合、

npm init

プロセスを実行して、新しい Node.js アプリケーションを作成します。アプリケーションをインストールする場所に設定されたコマンド プロンプトを使用して、次のコマンドを実行できます:

リーリー

#npm init に慣れていない場合は、新しいプロジェクトの構成に役立つユーティリティが起動します。最初に尋ねられるのは名前です。私のデフォルトは slackbot ですが、これで満足しています。アプリケーション名を変更する場合は、今がそのチャンスです。そうでない場合は、Enter を押して次の構成手順に進みます。次のオプションは [バージョン] と [説明] です。両方のオプションをデフォルトのままにし、Enter を押して両方のオプションの選択を続けます。 ###エントリーポイント###

次の要件は

エントリ ポイント

です。デフォルトは

index.js ですが、多くの人は app.js を使用することを好みます。この議論には関与したくありません。また、私のアプリケーションには緻密なプロジェクト構造が必要ないことを考慮して、アプリケーションにはデフォルトの index.js をそのまま使用することにします。 タブとスペースのような白熱した議論から立ち直った後、いくつかの質問とともに設定が続行されます。

テストコマンド

gitリポジトリ
  • キーワード
  • ###著者### ###ライセンス###
  • この記事では、すべてのオプションをデフォルトのままにしています。最後に、すべてのオプションを構成すると、
  • package.json
  • ファイルを作成する前に、ファイルの確認が表示されます。
  • Enter
  • を押して構成を完了します。
  • SDKを入力してください

Slack との対話を容易にするために、次のように Slack Developer Kit もインストールします: リーリー いよいよコードを書く準備ができましたか?もちろんそうよ。まず、Real-Time Messaging API (RTM) を使用して Slack メッセージを公開する Slack Developer Kit Web サイトのサンプル コードをいくつかの調整を加えて使用します。 私が選択した

エントリ ポイント

index.js

であるとすると、このファイルを作成します。 Slack Developer Toolkit Web サイトのサンプルは約 20 行のコードです。それぞれの行が何をするのかを説明するために、一度に数行に分けて説明します。ただし、これらの行はすべて

index.js

ファイルに含める必要があることに注意してください。

コードには、まず Slack 開発者ツールキットの 2 つのモジュールが含まれています: リーリー RtmClient インスタンス化されると、RTM API を参照するロボット オブジェクトになります。 CLIENT_EVENTS は、ボットがリッスンするイベントです。

これらのモジュールを含めた後、ロボットをインスタンス化して起動できます:

リーリー

上記の難読化された API トークン を、Slack Bot の作成プロセス中に取得したトークンに必ず置き換えてください。 #RtmClient

start

関数を呼び出すと、ロボットのセッションが初期化されます。これにより、ボットの認証が試行されます。ボットが Slack に正常に接続すると、イベントが送信され、アプリケーションの続行が可能になります。これらのイベントはすぐに表示されます。

クライアントをインスタンス化した後、channel

変数が作成され、これはすぐに

CLIENT_EVENTS イベントの 1 つに設定されます。 リーリー channel

変数は、ボットが接続されているチャネルへのメッセージの送信など、特定のアクションを実行するために使用されます。

RTM セッションが開始され (rtm.start();)、ボットに有効な API トークン

が与えられると、

RTM.AUTHENTICATED# が送信されます。 ## 情報。次の数行は、このイベントをリッスンします: リーリー

RTM.AUTHENTICATED

イベントを受信すると、上記のコードは Slack チーム チャネル リストで for ループを実行します。私の場合、特に jamiestestchannel を検索し、ボットがそのチャンネルのメンバーであることを確認しました。この条件が満たされると、チャネル ID が channel 変数に格納されます。

###デバッグ###

デバッグを支援するために、ボットの名前 (${rtmStartData.self.name}) とチーム名 ($) が表示され、ボットが正常に認証されたことを示すメッセージがコンソール メッセージに記録されます。 {rtmStartData.team.name}) それは属します。 ボットが認証されると、別のイベント (RTM.RTM_CONNECTION_OPENED) が発生します。これは、ボットが完全に接続され、Slack との対話を開始できることを示します。次のコード行はイベント リスナーを作成します。成功すると、

Hello!

メッセージはそのチャネル (私の場合、

jamiestestchannel

) に送信されます。 リーリー この時点で、Node アプリケーションを実行し、ボットが新しいメッセージをチャンネルに自動的に投稿するのを確認できるようになりました: リーリー このコマンドを実行した結果 (成功した場合) は次の 2 つです。

  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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。