こんにちは、グロースハッカーの たぬ ( @tanuhack )です。
Slack Web API は 100 を超える HTTP メソッド群から構成されており、それらのメソッドをプログラムから呼び出して、Slack と直接データをやり取りすることができます。
- ユーザーやチャンネルの情報を取得
- チャンネルや DM にメッセージやファイルを投稿
- チャンネルにユーザーを招待
こんな感じで、Slack の画面上で行っている操作であれば、大抵のことは Slack Web API から実行することができます。
事業拡大に伴ってワークスペースのユーザー数が増えてくると、Slack の画面上でいちいち設定すること自体に限界を感じることかと思います。そんなときは Slack Web APIを使って、賢くラクしましょう。
- Events API:ユーザーの行動に対して実行するプログラム
- Admin API:Web API のサブセットで、Slack 組織の管理
- SCIM API:ユーザーのプロビジョニングと管理
- Status API:Slack 製品の健全性を監視するプログラム
- RTM API:公式から時代遅れの API と言われているので使用するのは控えた方が無難
詳しくは、公式ページを参考にしてみてくださいね。
Slack の設定
Slack App( Bot )を作成する
Slack Web APIを使用するためには、Slack App を作成する必要があります。
本記事では、例として『指定したパブリックチャンネルのユーザー数を集計し、その集計結果を同じチャンネルに投稿するプログラム』を作成します。
https://api.slack.com/apps から Slack App を作成します。
基本情報、スコープ、設定、機能をアプリに手動で追加するので、From scratch
を選びます。
2つとも設定し終わったら、Create App
で Slack アプリを作成します。
このページがアプリの管理画面になります。
スコープの設定を行う
Slack アプリの機能と権限は、リクエストするスコープによって管理されます。スコープを設定することで、トークン( Slack とのプログラムとの認証キー)を有効にすることが出来ます。
OAuth & Permissions ページに移動しましょう。
Scopes を見ると、2種類のスコープがあることが分かります。
- Bot Token Scopes:アプリ(Bot)がアクセスできる範囲を管理するスコープ。
- User Token Scopes:ユーザーデータにアクセスし、権限を与えたユーザーの代わりに行動するスコープ。
今回は、チャンネルのユーザー数を集計して、結果を通知する Bot を作成するので、Bot Token Scopes を設定します。
スコープは、使用する HTTP メソッドに割り当てられているので、使用する HTTP メソッドのドキュメントを見て、必要なスコープをメモします。
今回は、以下の2つの HTTP メソッドを使用します。
- conversations.members:会話のユーザー数を取得する
- chat.postMessage:チャンネルにメッセージを送信する
Slack Web APIのメソッド一覧は、下記リンクにあります。
https://api.slack.com/methods
HTTP メソッドのドキュメントをそれぞれ確認すると、以下の4つのスコープが必要であることが分かります。
スコープ | 説明 |
---|---|
channels:read | パブリックチャンネルの情報を取得する |
chat:write | 承認されたチャンネルや会話にメッセージを投稿する |
chat:write.public | Bot が参加していないチャンネルへメッセージ送信を可能にする |
chat:write.customize | Bot として投稿するときの名前やアイコンを変更する |
Slack App のスコープ一覧は、下記リンクにあります。
https://api.slack.com/scopes
Bot Token Scopes のAdd an OAuth Scope
を選択し、スコープを1つずつ追加していきます。
表示名とユーザー名を設定する
Slack のワークスペース上で追加した Slack App を検索したいときに使う Bot の表示名とユーザー名を登録します。
ワークスペースにインストールする
Install to Workspace
を選択します。
問題なければ許可します。
xoxb-xxxxxxxxxxxxxxxxxxxxxx
で始まる文字列が Bot User Token です。他の人に見られないように厳重に管理しましょう。このトークンを使って、プログラムから Slack とデータのやり取りをします。
アプリの拡張などでスコープを追加したときは、ワークスペースに再度インストールする必要があります。(トークンは変わりません)
Slack SDK を使う
Slack Web API を Python で使う方法として、requests モジュールを使った方法をよく他の記事で見かけますが、Slack 公式からわざわざ SDK が提供されているので、そちらを使うほかないでしょう。
どちらのやり方も試しましたが、公式 SDK の方が圧倒的に使いやすいので開発に集中できるのでオススメです。
https://pypi.org/project/slack-sdk/
モジュールのインストール
% pip install slack_sdk
サンプルプログラム
from slack_sdk import WebClient
SLACK_ACCESS_TOKEN = '{ slack_bot_token }'
CHANNEL_ID = '{ channel_id }'
# Slackクライアントを作成
client = WebClient(SLACK_ACCESS_TOKEN)
# チャンネルのメンバー数を取得(conversations.membersメソッド)
response = client.conversations_members(channel=CHANNEL_ID)
count_member = len(response.get('members'))
# パブリックチャンネルにメッセージを投稿(chat.postMessageメソッド)
msg = f"{count_member}人参加中です。"
response = client.chat_postMessage(channel=CHANNEL_ID, text=msg, icon_emoji=':robot_face:', username='Slack Bot')
プログラムを実行して、次のようにチャンネルにメッセージが投稿されていれば成功です。
本番環境では、アクセストークンを 環境変数 に格納し、os.environ
などで呼び出して使いましょう。
+ import os
from slack_sdk import WebClient
- SLACK_ACCESS_TOKEN = '{ slack_bot_token }'
+ SLACK_ACCESS_TOKEN = os.environ['SLACK_ACCESS_TOKEN']
CHANNEL_ID = '{ channel_id }'
# Slackクライアントを作成
client = WebClient(SLACK_ACCESS_TOKEN)
# チャンネルのメンバー数を取得(conversations.membersメソッド)
response = client.conversations_members(channel=CHANNEL_ID)
count_member = len(response.get('members'))
# パブリックチャンネルにメッセージを投稿(chat.postMessageメソッド)
msg = f"{count_member}人参加中です。"
response = client.chat_postMessage(channel=CHANNEL_ID, text=msg, icon_emoji=':robot_face:', username='Slack Bot')
コメント