システム通知をSlackに送りたい場面は多い。Incoming Webhook を使った通知を実現する方法を紹介。
Incoming Webhook の URL を設定する
以前まではチャンネルのカスタムインテグレーション設定から Incoming Webhook の URL を取得できていたが、今は Slack App を作成する方法が推奨されている。
簡単な手順を書いておく:
- Create an app > From scratch と辿ってアプリを作成
- Incoming Webhooks の設定から Activate Incoming Webhooks を On にする
- Add New Webhook to Workspace で通知したいチャンネルを指定する
サンプル用の curl コマンドが表示されるので、これを実行すれば通知が送られるのを確認できる
TypeScript で Incoming Webhook を使う例
import axios from "axios"; async function notify() { try { const client = axios.create({ baseURL: "https://hooks.slack.com/services/...", # webhook URL headers: {'Content-Type': 'application/json'}, }); const data = { "blocks": [{ "type": "section", "text": { "type": "mrkdwn", "text": "Hello, TypeScript", } }] }; return await client({ method: 'POST', data: JSON.stringify(data)}); } catch (e) { // something } } notify();
Perl で Incoming Webhook を使う例
use LWP::UserAgent; use HTTP::Request::Common; use JSON; my $url = "https://hooks.slack.com/services/..." # webhook URL my $post = { "blocks" => [{ "type" => "section", "text" => { "type" => "mrkdwn", "text" => "Hello, Perl" } }] }; my $request = POST( $url, Content_Type => 'application/json', Content => encode_json($post)); my $ua = LWP::UserAgent->new; $ua->request($request);
とはいえ Webhook URL に POST リクエストを送ればいいだけなので特筆することはない。Perl で JSON を書くのはつらいなあ。
Perl のモジュール管理
上記サンプルを動かすときにモジュールが存在しない問題にぶつかった。このご時世、Perl に力を入れているわけではないのでとりあえず解決できた方法も書いておく。ベストかどうかは分からないが。
まずはモジュール管理用の CPAN について。CPAN は Comprehensive Pel Archive Network の略で、Perl のモジュールを集約しているサービス。同名の cpan コマンドでモジュールをインストールできる。
もっと便利な cpan minus というのもあって、こっちのほうがモダンで簡単。
yum install cpan #cpanをインストールする(既に入っているかも) yum install cpanminus #cpanインストール後に実行 brew install cpanm #homebrewを使う場合
JSONモジュールが必要な場合は下記コマンドを実行するだけで良い。
sudo cpanm JSON