Slackを独自アプリケーションで拡張する
前回はSlackと外部アプリケーションとの連携について紹介しました。Slackには、多数の外部アプリケーションやサービスと連携するための仕組みがあらかじめ用意されていますが、それ以外のアプリケーションやサービスと連携するにはどうすればよいでしょうか?
そういう場合、Slackでは自分でプログラムを作成して、またはすでに公開されているプログラムを改良して、独自の連携を作成するための機能が提供されています。ここでは簡単なプログラムを作成して、Slackと連携するアプリケーションを作成する方法について紹介します。
最近のSlackニュース
- 2017年12月:2017年12月頃からSlackのテレビCMが放送されているようです。電車の中やタクシーなどでもCMが流れています。15秒バージョンはYouTubeでも公開されています(https://www.youtube.com/watch?v=gUiqGXVmlJ0)。
- 2018年1月17日:プライベートの共有チャンネル機能のベータ版がリリースされました。2017年9月にリリースされた、複数のワークスペースをまたがった共有チャンネル(Shared Channels)機能で、プライベートのチャンネルも作成できるようになりました。この機能は有料会員でのみ有効です(https://slackhq.com/private-shared-channels-are-now-available-b187046b1bea)
- 2018年2月1日:大企業向けのSlack Enterprise Grid(https://slack.com/intl/ja-jp/enterprise)を導入した企業が150社を越えたというアナウンスがありました。Enterprise Gridは大企業で複数のワークスペースを持ち、ワークスペース間でチャンネルを共有したり、ワークスペースを越えて情報検索やDM送信ができる機能で、2017年2月にリリースされました(https://slackhq.com/celebrating-one-year-and-150-plus-customers-on-slack-enterprise-grid-1b7528b19759)
SlackのAPI
Slackには、独自に開発したアプリケーションやプログラムと、メッセージの送信や取得などをするためのAPIが用意されています。SlackのAPIについてはSlack API(https://api.slack.com/)というWebサイトで情報が公開されています。このサイトには各種APIの仕様、APIを使用したアプリケーションの作り方、メッセージのフォーマット方法、認証方法など様々な情報が提供されています。ここではAPIについて全てを説明できないので、一部のAPIを使用したアプリケーションの作り方について解説します。
SlackのAPIの種類
Slackには様々な種類のAPIがあります。以下にいくつかとその機能や特徴を紹介します。
- Incoming Webhooks(https://api.slack.com/incoming-webhooks):外部からSlackにメッセージを送信するためのAPI
- Slack Commands(https://api.slack.com/slash-commands):メッセージの入力ボックスにスラッシュ(
/
)を入力した時に実行するコマンドを作成する仕組み - Bot Users(https://api.slack.com/bot-users):ユーザーとSlack上で会話をするチャットボットを作成する仕組み
- Slack Web API(https://api.slack.com/web):HTTPベースでのRPCスタイルのAPI
- Real Time Messaging API(https://api.slack.com/rtm):WebSocketベースでリアルタイムにメッセージの送受信を行うためのAPI。RTM APIとも呼ばれる。主にBot Userが使用する
- Events API(https://api.slack.com/events-api):登録されたイベントが発生した時に、任意のサーバーへJSONを送信する機能
このうちWeb API、RTM API、Events APIは互いによく似ており、基本的にはWeb APIを使用していれば問題はありません。この3種類のAPIの違いと、どれを使用すべきかのフローチャートが「Which API is right for your Slack app?」(https://medium.com/slack-developer-blog/getting-started-with-slacks-apis-f930c73fc889)という記事で公開されているので、参考にしてみてください。
以降では、いくつかのAPIを使用してSlackとメッセージをやりとりする方法について説明します。
Incoming Webhooksでメッセージ送信
任意のチャンネルにメッセージを送信するには、Incoming Weebhooks が便利です。この機能はSlackが提供するIntegrationの1つで、任意のURLに対してHTTPで送信したメッセージが、Slackのチャンネルに送信されます。
Incoming Webhooks Integrationを作成する
Incoming Webhooks Integration(https://takanory-family.slack.com/apps/A0F7XDUAZ-incoming-webhooks)のページを開き、「Add Configuration」をクリックして、Integrationを作成します。
次の画面で通知先のチャンネル(ここでは #general
)を選択し「Add Incoming WebHooks integration」をクリックします。
これで、指定したチャンネルにメッセージを送信するための専用URL(Webhook URL)が生成されました。このURLをメモ(下記の画像で https://hooks.slack.com/services/
で始まるURL)します。
なお、この画面で通知先チャンネルの変更、URLの再生成、メッセージ送信時の名前やアイコンを後から変更できます。
なお、Incoming Webhooksを登録すると、Slackのチャンネル上で Integration が追加されたことを示すメッセージが表示されます。
Webhook URLを使用してメッセージを送信する
それでは先ほど作成したWebhook URLを使用して、Slackにメッセージを送信してみます。Webhook URLにメッセージを送信する場合は、JSON形式で text
プロパティに送信したい文字列を指定します。例えば以下のような形式です。
{"text": "こんにちはSlack"}
このメッセージをWebhook URLに対して以下の形式で送信します。
- HTTPメソッドはPOST
- コンテンツ形式はJSON(application/json)
- 文字コードはUTF-8
curl(https://ja.wikipedia.org/wiki/CURL)というコマンドラインでHTTPを送信できるツールを使用する場合は、以下のように指定します。URLには先ほど作成したWebhook URLを指定してください。
curl -X POST -H 'Content-type: application/json' \ --data '{"text": "こんにちはSlack"}' \ https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
メッセージの送信に成功すると、以下のようにSlackにメッセージが出力されます。
Webhook URLで送信するメッセージをカスタマイズする
Webhook URLで送信できるメッセージは、上記のシンプルなもの以外にも、様々な書式の指定が可能です。以下に一例を載せます。
- 太字(
*
)、斜体(_
)、コードブロック(`
)などSlackの標準の書式設定が利用可能 - 改行は
\n
と書く - リンクは
<https://slack.com>
のように<>
で囲む<https://slack.com|Slack>
のように書くと、Slackという文字列にリンクが貼られる
では、以下の例で書式指定したメッセージを送信してみましょう。
curl -X POST -H 'Content-type: application/json' \ --data '{"text": "こんにちは<https://slack.com|Slack>\nWebhookは *楽しい* !"}' \ https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
メッセージを送信すると、以下のようにリンクや改行、太字などの書式が指定されたメッセージが正しく表示されました。
メッセージ以外に、表示されるアイコン、ユーザー名なども変更できます。アイコンはicon_emoji
プロパティ、ユーザー名はusername
プロパティで指定できます。
以下の例は、アイコンとユーザー名を指定したメッセージの送信のサンプルです。
curl -X POST -H 'Content-type: application/json' \ --data '{"text": "ササ食べたい", "icon_emoji": ":panda_face:", "username": "panda-bot"}' \ https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
メッセージを送信すると、以下のように絵文字とユーザー名が変更されて表示されます。
他にも様々な書式の指定が可能です。詳細は下記のページを参照してください。なお、これらのメッセージの書式指定は、他のAPIでも共通となります。
- Basic message formatting(https://api.slack.com/docs/message-formatting)
- Attaching content and links to messages(https://api.slack.com/docs/message-attachments)