ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js ベースの Slack ボットを作成する
Slack は 急速にチームコミュニケーションの新しい業界標準になりつつあります。存在する 実際、とても人気があるので、slack と入力すると、 Google に入ると、予想通り、最初に表示されたのはこの単語の定義でした。 辞書から。 Slack の Web サイトが僅差で 2 位です。
###これは 英語辞書で最も一般的な単語としてはほとんど聞いたことがない。通常、Google の定義の後には、いくつかのトップ辞書へのリンクが続きます。 Webサイト。Slack とは何ですか?
###現時点では ある時点で、Node.js がどこに登場するのか疑問に思うかもしれません。先ほども述べたように、最も基本的なレベルでは、Slack はメッセージング システムです。ただし無限に拡張可能 カスタムメイド。 Slack は、カスタマイズするための非常に柔軟なシステムを提供します。 チーム統合(以下を含む):
カスタムウェルカムメッセージを作成する 情報###
メンバー参加チャンネル member_left_channel
これで
この記事では、Node.js アプリケーションと追加可能な Slack Bot を作成します。
チームプロジェクトに追加して、イベントに基づいて特定のアクションを実行します
受け取る。
アプリケーションの作成とロボット ユーザーの追加
カスタム Slack ボットを作成する
カスタム ボットはここで作成できます: https://my.slack.com/apps/A0F7YS25R-bots。すでに Slack アカウントにログインしている場合は、左側の [
ボットの作成が正常に完了すると、Slack はボットをさらにカスタマイズできるページにリダイレクトします。この部分はクリエイティブなあなたに任せます。このページに必要なのは、
xoxb-だけです。このトークンを後で使用するために安全な場所にコピーすることも、Node.js アプリケーションにトークンが必要になるまでこのページを開いたままにすることもできます。 ###構成### コードの記述を続ける前に、さらに 2 つの Slack 構成が必要です:
ボットが対話する既存のチャネルを作成または選択します。新しいボットをテストするときは、新しいチャネルを作成することを選択します。チャンネル名はアプリですぐに必要になるため、必ず覚えておいてください。
ボットをチャンネルに追加/招待して、ボットと対話します。
Slack ボットの構成が完了したので、次は Node.js アプリケーションに進みます。 Node.js がすでにインストールされている場合は、次のステップに進むことができます。 Node.js をまだインストールしていない場合は、まず Node.js のダウンロード ページにアクセスし、システムに適したインストーラーを選択することをお勧めします。
Slack ボットの場合、
#npm init に慣れていない場合は、新しいプロジェクトの構成に役立つユーティリティが起動します。最初に尋ねられるのは名前です。私のデフォルトは
slackbot ですが、これで満足しています。アプリケーション名を変更する場合は、今がそのチャンスです。そうでない場合は、
Enter を押して次の構成手順に進みます。次のオプションは [バージョン] と [説明] です。両方のオプションをデフォルトのままにし、Enter を押して両方のオプションの選択を続けます。
###エントリーポイント###
index.js ですが、多くの人は app.js を使用することを好みます。この議論には関与したくありません。また、私のアプリケーションには緻密なプロジェクト構造が必要ないことを考慮して、アプリケーションにはデフォルトの
index.js をそのまま使用することにします。
タブとスペースのような白熱した議論から立ち直った後、いくつかの質問とともに設定が続行されます。
gitリポジトリ
Slack との対話を容易にするために、次のように Slack Developer Kit もインストールします:
リーリー
いよいよコードを書く準備ができましたか?もちろんそうよ。まず、Real-Time Messaging API (RTM) を使用して Slack メッセージを公開する Slack Developer Kit Web サイトのサンプル コードをいくつかの調整を加えて使用します。
私が選択した
であるとすると、このファイルを作成します。 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# が送信されます。 ## 情報。次の数行は、このイベントをリッスンします:
リーリー
イベントを受信すると、上記のコードは Slack チーム チャネル リストで for
ループを実行します。私の場合、特に jamiestestchannel を検索し、ボットがそのチャンネルのメンバーであることを確認しました。この条件が満たされると、チャネル ID が channel
変数に格納されます。
デバッグを支援するために、ボットの名前 (${rtmStartData.self.name}
) とチーム名 ($) が表示され、ボットが正常に認証されたことを示すメッセージがコンソール メッセージに記録されます。 {rtmStartData.team.name}
) それは属します。
ボットが認証されると、別のイベント (RTM.RTM_CONNECTION_OPENED
) が発生します。これは、ボットが完全に接続され、Slack との対話を開始できることを示します。次のコード行はイベント リスナーを作成します。成功すると、
) に送信されます。
リーリー
この時点で、Node アプリケーションを実行し、ボットが新しいメッセージをチャンネルに自動的に投稿するのを確認できるようになりました:
リーリー
このコマンドを実行した結果 (成功した場合) は次の 2 つです。
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 中国語 Web サイトの他の関連記事を参照してください。