見出し画像

アプリケーションからSlackに投稿する #397

本日タイムリーに障害が発生していたSlackのWebhookについてです。

業務で触る機会があり大雑把に学んだのでメモしておきます。
アプリケーションからSlackへ投稿するには、大きく以下の手順です。

  1. Webhook URLを取得して使用可能にする

  2. 投稿内容をJSONで記述する

  3. Webhook URLにPOSTリクエストする


Webhook URLを取得して使用可能にする

公式の手順通りに実施します。

簡単な4ステップで完了します。
完了すると、以下のようなURLを取得できます。

https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

上記のURLは漏洩しないように注意してください。

Keep it secret, keep it safe. Your webhook URL contains a secret. Don't share it online, including via public version control repositories. Slack actively searches out and revokes leaked secrets.

Sending messages using Incoming Webhooks

このステップの中で投稿先となるチャンネルを指定しますが、後ほど記述するJSONで指定すればどのチャンネルにも投稿できます

ただ、一つのアプリケーションの投稿先は一つのチャンネルに絞る、というのが推奨みたいです(そうも言ってられない場面が多いとは思いますが。。)


投稿内容をJSONで記述する

URLが取得できたので、投稿内容をJSONで定義します。

以下は記述例です。
・後続でPOSTリクエストするためdataという変数に格納しています。
・attachmentsは公式からの引用で、下に結果の画像も貼っています。

data = {
    "text": "本文を記入する。ここがslack上でメッセージを入力する部分に該当する。",
    "channel": "your_channel",
    "username": "your_name",
    "attachments": [
        {
	        "mrkdwn_in": ["text"],
            "color": "#36a64f",
            "pretext": "Optional pre-text that appears above the attachment block",
            "author_name": "author_name",
            "author_link": "http://flickr.com/bobby/",
            "author_icon": "https://placeimg.com/16/16/people",
            "title": "title",
            "title_link": "https://api.slack.com/",
            "text": "Optional `text` that appears within the attachment",
            "fields": [
                {
                    "title": "A field's title",
                    "value": "This field's value",
                    "short": false
                },
                {
                    "title": "A short field's title",
                    "value": "A short field's value",
                    "short": true
                },
                {
                    "title": "A second short field's title",
                    "value": "A second short field's value",
                    "short": true
                }
            ],
            "thumb_url": "http://placekitten.com/g/200/200",
            "footer": "footer",
            "footer_icon": "https://platform.slack-edge.com/img/default_application_icon.png",
            "ts": 123456789
        }
    ]
}

}
An example message attachment

画像は引用のもので、attachments部分のみを表しています。上記のJSONと厳密には一致しないのでご了承ください。


Webhook URLにPOSTリクエストする

ここまで来れば後は簡単です。取得していたWebhook URLにPOSTリクエストします。

import requests

requests.post(SLACK_WEBHOOK_URL, data=json.dumps(data))

Pythonで記述すると上記のようになります。


ちなみに本日の障害でこの投稿機能は止まっていましたが、現在は無事に復旧しました。対応スピード早すぎてびっくりしました。

ここまでお読みいただきありがとうございます!


参考


この記事が気に入ったらサポートをしてみませんか?