Slackにはすでにチケット管理システムや監視ツールと連携するアプリが用意されていますが、Incoming WebHooksというアプリを使うことで、連携アプリが無いツール向けにHTTPSベースの汎用的な外部連携の仕組みを簡単に実現することができます。
Slack側の設定
Slackのチーム設定によってはアプリのインストールに管理者の承認が必要な場合があります。
その場合は管理者に連絡してIncoming WebHooksをインストールしてもらってください。
チーム名をクリックして[Manage apps]を選択します。
画面上部の検索ボックスに[incoming]と入力して候補に挙がった[Incoming Webhooks]を選択します。
[Add Configuration]をクリックします。
外部から投稿したいチャンネルを選択します。ただし、チャンネルはリクエスト内で指定できるので、ここで選択するのはあくまでもデフォルトのチャンネルです。(後から設定画面で変更できます。プライベートチャンネルも指定できます)
選択後[Add Incoming WebHooks integration]をクリックします。
以下のような画面が表示されればSlack側の設定は完了です。
参考) Integration Settings (設定)
設定名 | 説明 |
---|---|
Post to Channel | 前の手順で選択した投稿先のデフォルトチャンネルを変更できます。リクエスト内で指定(この設定を上書き)することもできます。 |
Webhook URL | 外部からリクエストを送信する先のURLです。Regenerateをクリックすることで再生成することができます。 |
Descriptive Label | 一覧で表示されるメモです。 |
Customize Name | Slack投稿時に表示される名前を設定します。リクエスト内で指定(この設定を上書き)することもできます。 |
Customize Icon | Slack投稿時に表示されるアイコンを設定します。リクエスト内で指定(この設定を上書き)することもできます。 |
Preview Message | 投稿のプレビューです。 |
外部からの投稿
まずはシンプルな内容を投稿してみます。ここではcurlコマンドを使ってリクエストを送信します。
リクエストのBodyで指定するパラメータは[payload]で、payloadの値としてJSON形式で投稿内容を指定します。Payload内で必須となるパラメータは投稿メッセージ本体(text)のみです。
$ curl -X POST --data-urlencode 'payload={"text": "テスト投稿です。"}' https://hooks.slack.com/services/*********/*********/************************
以下のように投稿されます。投稿先のチャンネルと名前、アイコンは設定ページで指定した値になります。
次にリクエストを少しカスタマイズしてみます。具体的には、先ほどとは異なるチャンネル(channel)、名前(username)、アイコン(icon_emoji)で投稿してみます。
$ curl -X POST --data-urlencode 'payload={"channel": "#wh-customize-test", "username": "naokichi-dummy", "text": "投稿先、名前、アイコンを変更してみました。", "icon_emoji": ":ghost:"}' https://hooks.slack.com/services/*********/*********/************************
ここでアイコンは :ghost:
という名前を指定していますが、これはSlackに登録されているアイコンの名前です。好きなアイコンを使いたい場合は、Slack管理画面からアイコンを登録してその名前を指定します。
これ以外にもリンクを追加したり色を変えたり、他のメッセージを参照するなど投稿をカスタマイズすることができます。詳細は設定画面内の例を参照してください。
注意事項
外部に公開するWebhook URLにはアクセス制限をかけることができません。従ってURLが漏洩すると誰でも投稿できますので、URLを公開リポジトリのソースコードには含めないなどWebhook URLの管理にはくれぐれもご注意ください。