PythonでSlack Incoming Webhook (Block kit利用) メモ
以前からちょこちょこSlackのIncoming Webhook(外からSlackのチャンネルなどに通知を送る機能)は利用していましたが、最近また使う機会があり、調べてみるとここ1年ほどの間にBlock kitを利用できる新しいWebhookが追加されたということで、Pythonから使ってみたというメモです。
Block kitについて
詳細は公式のページを見ていただければと思います(手抜きでスイマセン)が、どうやら新しいメッセージUIフレームワークで、よりリッチなメッセージを送信できるようです。
例えば1つのメッセージの中に、水平線(htmlでいうところのhrタグ)を引いたり、以前よりも簡単に画像を配置できたり、さらにはプルダウンやボタンを配置しインタラクティブなやり取りを簡単に行うことができるようです。
api.slack.com api.slack.com qiita.com
今回私がやりたかったことは前述の機能を使わなくてもよかったのですが、せっかく新しい機能が出たのでこちらを使ってみました。
Slack Incoming Webhookの設定
Block kitを使うためには以前とは違うやり方でSlackの設定を行う必要があります。
1. ワークスペースの設定を開く
通知を受信するSlackのワークスペースの設定を開きます。
これは必須ではないのですが、後述の設定を簡単にするための作業(ブラウザにセッションを残す)です。
2. Appsを追加する
Incoming WebhookのAppsを追加していきます。
以下を開きます。
「Create an App」を選択します。
「App Name」にはAppの名前を入力します。
「Development Slack Workspace」には通知を受信するSlackを選択します。もしプルダウンメニューの中にない場合は、「Sign in to another workspace」を選択しログインします。
最後に「Create App」を選択します。
追加するAppの種類を選択します。今回はIncoming Webhookなので「Incoming Webhooks」を選択します。
「Activate Incoming Webhooks」で有効(Off→On)にします。
「Add New Webhook to Workspace」を選択します。
通知を受信するチャンネルを選択し、「許可する」を選択します。
無事追加されました。
Slackのチャンネル側にも、Appsが追加されたメッセージが表示されます。
3. 通知のテスト
「Sample curl request to post to a channel:」にcurlで実行可能なコマンドがサンプルとして提供されますので、実行し正常に通知が受信できるか試します。
正常に実行完了すると、以下のようにSlack側で通知を受信できます。
Pythonから送信してみる
サンプルとして以下のようなコードを作成しました。
import requests import json webhook_url = 'https://hooks.slack.com/services/*********/***********/************************' send_data = ''' { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "こんにちは" }, "accessory": { "type": "image", "image_url": "https://cdn.profile-image.st-hatena.com/users/fatsheep/profile.png?1579132881", "alt_text":"image" } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": "こんばんは" }, "accessory": { "type": "image", "image_url": "https://cdn.profile-image.st-hatena.com/users/fatsheep/profile.png?1579132881", "alt_text":"image" } } ] } ''' res = requests.post(webhook_url,headers={'Content-Type': 'application/json'}, data = json.dumps(json.loads(send_data))) print(res.text)
実行すると以下のように通知されます。
参考:PHPでも実行してみた
PHPとcurlモジュールを使って以下のように実装してみました。
※curlモジュールが導入されていない場合は導入してください:『apt install php php-curl』
<?php $url = 'https://hooks.slack.com/services/***********/***********/************************'; $msg = <<<EOT { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "こんにちは" }, "accessory": { "type": "image", "image_url": "https://cdn.profile-image.st-hatena.com/users/fatsheep/profile.png?1579132881", "alt_text":"image" } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": "こんばんは" }, "accessory": { "type": "image", "image_url": "https://cdn.profile-image.st-hatena.com/users/fatsheep/profile.png?1579132881", "alt_text":"image" } } ] } EOT; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, $msg); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, $url); $res=curl_exec($ch); echo $res; curl_close($ch); ?>
最後に
今回は新しいIncoming Webhookの設定とPythonからの送信をやってみました。
設定部分は以前のものより手数は増えましたが、機能が大幅に拡充されたため、Slackと外部アプリケーション連携がよりやりやすくなったのかなと感じました。
■ 更新履歴
- 2020/10/15 新規作成
- 2021/07/22 PHP版を追記
■ 参考情報
- slackのIncoming webhookが新しくなっていたのでまとめてみた
https://qiita.com/kshibata101/items/0e13c420080a993c5d16