8
6

More than 3 years have passed since last update.

Slack Python SDK で Incoming Webhooks を使おう

Posted at

slack-sdk を使おう

Python で Slack API や Webhook を扱うなら公式 SDK(slack-sdk/slack-bolt)を使おう」シリーズの記事です。公式 SDK についての概要、他にも記事がリンクされていますので、こちらのエントリーページにもアクセスしてみてください。

この記事では slack-sdk PyPI パッケージを使って Slack の Incoming Webhooks を利用したコーディングについて解説していきます。

Incoming Webhooks でメッセージを投稿

まずはじめに Incoming Webhooks を使うための新しい Slack アプリ設定をつくりましょう。早速、こちらのリンクから作成してみてください。

なお、ここで使用する App Manifest は以下の通りです。

_metadata:
  major_version: 1
  minor_version: 1
display_information:
  name: My Incoming Webhooks App
features:
  bot_user:
    display_name: My Incoming Webhooks
oauth_config:
  scopes:
    bot:
      - incoming-webhook

アプリが作成されたら、そのまま「Install to Workspace」ボタンを押してください。

インストール画面でチャンネルを指定されるように促されますので、どれか一つ選択してから「Allow」ボタンをクリックします。

インストールが完了したら Features > Incoming Webhooks へ移動し、スクロールすると発行された Incoming Webhooks の URL にアクセスすることができます(ここに映り込んでいる URL はすでに無効化しているのでご心配なく!)。

この URL を SLACK_WEBHOOK_URL という環境変数に設定しましょう。

export SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T11111/B11111/xxxxx

それではいよいよ Python のコードを試していきましょう。この記事のコードは Python 3.6 以上で動作します。python3 --version でバージョンを確認してください。pip3 install skack-sdkPoetrypoetry add slack-sdk を実行して、依存ライブラリをインストールしてください。

Incoming Webhooks のメッセージ送信は以下のようなコードで実行できます。非常にシンプルですね。

import logging, os

# デバッグレベルのログを出力します
logging.basicConfig(level=logging.DEBUG)

# Web API クライアントを初期化します
from slack_sdk import WebhookClient
client = WebhookClient(os.environ["SLACK_WEBHOOK_URL"])

# メッセージを送信します
response = client.send(text=":wave: こんにちは!")

webhook.py として保存して実行します。

(.venv) bash-3.2$ python webhook.py
DEBUG:slack_sdk.webhook.client:Sending a request - url: https://hooks.slack.com/services/T11111/B11111/xxxxx, body: {"text": ":wave: \u3053\u3093\u306b\u3061\u306f\uff01"}, headers: {'Content-Type': 'application/json;charset=utf-8', 'User-Agent': 'Python/3.9.1 slackclient/3.5.1 Darwin/20.4.0'}
DEBUG:slack_sdk.webhook.client:Received the following response - status: 200, headers: { ... }, body: ok

こんな感じでメッセージが投稿されたでしょうか?

もちろん、ブロックキット(Block Kit)も使えます。ブロックキットについて日本語で知りたい人は、こちらのチュートリアルや、私が書いた別の Qiita 記事の説明を参考にしてみてください。

# メッセージを送信します
response = client.send(
    text="今日の予定\n*マーケティングチーム 朝食 MTG*\n8:30 — 9:30 | 本社 9F Kagayaki (8)\n*コーヒーチャット w/ 採用内定者*\n10:30 — 11:00 | 本社 16F カフェテリア",
    blocks=[
        {"type": "context", "elements": [{"type": "mrkdwn", "text": "今日の予定"}]},
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "*マーケティングチーム 朝食 MTG*\n8:30 — 9:30 | 本社 9F Kagayaki (8)",
            },
        },
        {"type": "divider"},
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "*コーヒーチャット w/ 採用内定者*\n10:30 — 11:00 | 本社 16F カフェテリア",
            },
        },
    ],
)

このメッセージは以下のように表示されます。

カスタムインテグレーションの Incoming Webhooks について

なお、App Directory を検索すると出てくるカスタムインテグレーションの Incoming Webhooks に関しては、

Please note, this is a legacy custom integration - an outdated way for teams to integrate with Slack. These integrations lack newer features and they will be deprecated and possibly removed in the future. We do not recommend their use. Instead, we suggest that you check out their replacement: Slack apps.

と英語で注意書きがあるように、これからの新規での利用は推奨しておりません。上記で説明した Slack アプリを作ってチャンネルを指定した URL を発行するか chat.postMessage を使用するようにしてください。

カスタムインテグレーションのときに可能だった見た目の調整は Slack アプリ内の Incoming Webhook ではできませんが、chat.postMessage API を使えば可能です。これを利用するには、chat:write.customize スコープを設定して、ボットトークンを使った chat.postMessage API コールのパラメーターの usernameicon_urlicon_emoji をカスタマイズしてみてください。

それでは :wave:

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6