Node-REDのSlack botからポストを投稿


はじめに

この記事では、Slack上のチャットボットからSlackのポスト機能を使ったメッセージを投稿する方法、それもNode-REDを使用した実装方法を説明します。

Node-REDでSlack bot 2019年8月時点でも紹介されていますが、Node-REDを使ったSlackチャットボットに関する入門記事は巷に多く存在します。
一方で、次なるステップとして「ポストの投稿」や「ボタン付きメッセージの投稿」となるとNode-REDでの事例は極端に減る印象があります。
そこで、当記事ではあえてNode-REDで「ポストの投稿」を実装し、より多機能なチャットボットを簡単に作ることを目指します。

チャットボットの準備

まず、単純にメッセージのやりとりを行うSlackチャットボットを準備してください。
上でご紹介した「Node-REDでSlack bot 2019年8月時点」を参考にすることで簡単に作成可能です。

フロー作成

それではポスト投稿するためのフローを作成します。関連部分のフローは以下の通りです。

以下に当該フローのサンプルコードを添付します。必要に応じてインポートして確認してください。

[{"id":"a75b8360.fef26","type":"slack-web-out","z":"ae1b93ae.d3a45","client":"55c48043.4e368","name":"","x":460,"y":100,"wires":[["38371037.f228e"]]},{"id":"84f9ad5b.ada2e","type":"function","z":"ae1b93ae.d3a45","name":"返信文","func":"msg.topic = \"files.upload\";\nmsg.payload = {\n    \"channels\": msg.payload.user,\n    \"title\": msg.payload.title,\n    \"content\": msg.payload.contentmd,\n    \"initial_comment\": msg.payload.comment,\n    \"filetype\": \"post\"\n}\nreturn msg;","outputs":1,"noerr":0,"x":290,"y":100,"wires":[["a75b8360.fef26"]],"info":"**使い方**\n\n- `msg.payload.contentmd` : ポストにて送りたい内容を記述します。\n- `msg.payload.comment` (optional): ポストと一緒に送りたいメッセージがある場合、ここに記述します。\n- `msg.payload.title` (optional): ポストのタイトルを記述します。\n- `msg.payload.user` : メッセージのSlack宛先を記述します。\n"},{"id":"38371037.f228e","type":"debug","z":"ae1b93ae.d3a45","name":"debug slack post","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":670,"y":100,"wires":[]},{"id":"4a3d61ee.9cc87","type":"slack-rtm-in","z":"ae1b93ae.d3a45","client":"55c48043.4e368","name":"","events":"message","x":100,"y":100,"wires":[["84f9ad5b.ada2e"]]},{"id":"55c48043.4e368","type":"slack-config","z":"","name":""}]

「slack-rtm-in」ノード

入り口となるノードはメッセージのみのやりとりを行う従来のチャットボットと同じ「slack-rtm-in」ノードを使用します。

「slack-web-out」ノード

ポスト投稿を行うため「slack-rtm-out」ノードではなく、「slack-web-out」ノードを使います。
このノード自体の設定は「slack-rtm-out」ノードと同じで、Tokenだけを設定すればOKです。

「function」ノード(返信文と表示されているノード)

ポスト投稿するにはこのfunctionノードが重要です。
結論から言えば、ポスト投稿する際、msg.topicおよびmsg.payloadは以下のように記述します。

msg.topic = "files.upload";
msg.payload = {
    "channels": "メッセージ宛先",
    "title": "ポスト記事タイトル",
    "content": "ポスト記事内容",
    "initial_comment": "ポストと一緒に送るテキスト",
    "filetype": "post"
}
return msg;

msg.topicに指定しているfiles.uploadは、ポストを投稿する際に使用するSlack APIのメソッドです。
files.uploadAPIの仕様はこちらに公開されています。

ここまでの説明で既にお気づきかと思いますが、上記の説明は以下のルールに従うことでSlack APIの各種メソッドが使えるということを意味しています。

  • msg.topic : Slack APIが提供しているメソッド名を指定する。Slack APIのメソッドはこちら(API Methods)で公開されています。
  • msg.payload : 各メソッドのArgumentsを参照して、必要なキーワードを指定する。

contentinitial_commentに「こんにちは」と指定し、「slack-web-out」ノードで送ったメッセージは以下です。しっかりとポスト投稿できていますね。

終わりに

今回は「ポストの投稿」方法に焦点をあてて説明しました。ただし、Slack APIメソッドの使い方を1つ覚えたことで、他のメソッド全ての使い方を覚えたとも言えます。これにより皆さんのチャットボットがさらに機能向上できるでしょう。

次回があれば、「ボタン付きメッセージの投稿方法」を書きたいと思います。