概要
Slack API を使用して、任意のチャンネルにメッセージ送信する仕組みを作成する手順を解説。
今回説明するのは、既存アプリの「Incoming Webhook」ではなく、Slack Apps を使用した通知 bot である(正確には、Slack Apps の中で Incoming Webhook 機能を利用して作成する新手法の bot)。
既存の「Incoming Webhook」は、Slack のアプリ一覧から簡単に追加できて、設定も非常に短時間で終わるものだったが、セキュリティ面も含めて非推奨となった。
従来の Incoming Webhook は公式非推奨
Slack 初期からある、カスタムインテグレーション App の「Incoming Webhook」は、公式で非推奨となり、将来削除される可能性がある ため、こちらで設定することはオススメしない🙅♂️
👆 説明の冒頭に、非推奨かつ将来削除する可能性の警告文が書かれている(英文ですが…)
前提
- Slack のアカウント作成済み
- まだ無い方は、無料なので Gmail 等でサクッとアカウントを作ってください
手順
まず、Web で使用する Slack アカウントにログインしておき、
https://api.slack.com/apps
にアクセスする。
上記の画面が表示されたら、画面右上の 「Create New App」 ボタンをクリックし、「From scratch」 を選ぶ。
アプリ名設定ダイアログで、「アプリ名(任意)」を入力して、利用する「ワークペース」を選択する。
作成完了すると、アプリの管理画面が表示される。
これで「アプリ」自体の作成はできたが、アプリは「ユーザ」では無いため、アプリがチャンネルに通知をするには、通知者となる「ボットユーザ」を持つ必要がある(まだ現時点では、チャンネルへの通知はできない状態)。
アプリの管理画面から、Add features and functionality > Incoming Webhooks* を選択する。
画面遷移後、「Activate Incoming Webhooks」 を ON にして、ウェブフック機能を有効にしておく。
この後、左のメニューから App Home を選んでアプリホームを表示すると、「Your App’s Presence in Slack」 というSlack 上で、ユーザとしてどのように表示するかの設定エリアが追加されている。
App Display Name の右の「Edit」ボタンを押して、ユーザとしての表示名を入力する。
入力値はいずれも任意
- Display Name:Slack 上の表示名
- 現場は、反映に時間がかかったり、うまく表示されず「アプリ名」が出ることもあるので、アプリ名と合わせた方が無難と思われる
- Default username:このアプリを参照する時に使用するユーザ名(基本的に使う機会は少ない)
- 大文字の半角英字、日本語や特殊記号などは使用不可。半角英字小文字と
-
,_
あたりを使用する
- 大文字の半角英字、日本語や特殊記号などは使用不可。半角英字小文字と
完了すると、画面内に "Bot user added!" と、ユーザが追加されたメッセージが表示される。
デフォルトアイコンを設定したい場合は、Basic Information を下にスクロールすると Display Information という欄があるので、そこの 「+ Add App Icon」 を選べばアイコン画像が設定できる。(※ 今回は設定しない)
※ 「アプリ名」を変更したい場合は、ここからいつでも変更可能なので覚えておくと良い👍
もう一度、左の Features メニューから 「Incoming Webhooks」 にアクセスする。
下の方にスクロールして、「Add New Webhook to Workspace」 ボタンを押して、ワークスペースにボットユーザを追加する
どのチャンネルに対する通知なのかを選択して「許可する」を押せば、Webhook URL が発行される。
「Webhook URL」の 「Copy」 ボタンを押せば、API に使用する URL がコピーできる。
以上で、API による通知の設定は完了。あとは、この URL を使って投稿メッセージを投げるだけ。
動作確認
管理画面の Webhook URL 一覧の部分にすでに curl で動作テストできるコマンドがあるので、それをコピーしてターミナル等から実行しても確認はできる。
- HTTP メソッド:
post
- URL: 生成されたウェブフック URL
- ヘッダ:
Content-type: application/json
- 送信データ:
{ "text": "テスト通知です。" }