MENU

Python(Slack SDK モジュール)で Slack Web API を使えるようになるまでの具体的な手順

たぬ

こんにちは、グロースハッカーの たぬ ( @tanuhack )です。

Slack Web API は 100 を超える HTTP メソッド群から構成されており、それらのメソッドをプログラムから呼び出して、Slack と直接データをやり取りすることができます。

Slack Web API で出来ることの例
  • ユーザーやチャンネルの情報を取得
  • チャンネルや DM にメッセージやファイルを投稿
  • チャンネルにユーザーを招待

こんな感じで、Slack の画面上で行っている操作であれば、大抵のことは Slack Web API から実行することができます。

事業拡大に伴ってワークスペースのユーザー数が増えてくると、Slack の画面上でいちいち設定すること自体に限界を感じることかと思います。そんなときは Slack Web APIを使って、賢くラクしましょう。

本記事では Slack Web API について解説しますが、Slack API には、他にも様々な 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 を作成します。

STEP
Create an App を選択する
STEP
From scratch を選択する

基本情報、スコープ、設定、機能をアプリに手動で追加するので、From scratchを選びます。

STEP
アプリ名を入力し、インストールするワークスペースを選択する

2つとも設定し終わったら、Create Appで Slack アプリを作成します。

STEP
作成完了
Basic Information

このページがアプリの管理画面になります。

スコープの設定を行う

Slack アプリの機能と権限は、リクエストするスコープによって管理されます。スコープを設定することで、トークン( Slack とのプログラムとの認証キー)を有効にすることが出来ます。

OAuth & Permissions ページに移動しましょう。

OAuth & Permissions

Scopes を見ると、2種類のスコープがあることが分かります。

OAuth & Permissions
  • Bot Token Scopes:アプリ(Bot)がアクセスできる範囲を管理するスコープ。
  • User Token Scopes:ユーザーデータにアクセスし、権限を与えたユーザーの代わりに行動するスコープ。

今回は、チャンネルのユーザー数を集計して、結果を通知する Bot を作成するので、Bot Token Scopes を設定します。

STEP
必要なスコープを調べる

スコープは、使用する HTTP メソッドに割り当てられているので、使用する HTTP メソッドのドキュメントを見て、必要なスコープをメモします。

今回は、以下の2つの HTTP メソッドを使用します。

Slack Web APIのメソッド一覧は、下記リンクにあります。
https://api.slack.com/methods

conversations.members
chat.postMessage

HTTP メソッドのドキュメントをそれぞれ確認すると、以下の4つのスコープが必要であることが分かります。

スクロールできます
スコープ説明
channels:readパブリックチャンネルの情報を取得する
chat:write承認されたチャンネルや会話にメッセージを投稿する
chat:write.publicBot が参加していないチャンネルへメッセージ送信を可能にする
chat:write.customizeBot として投稿するときの名前やアイコンを変更する

Slack App のスコープ一覧は、下記リンクにあります。
https://api.slack.com/scopes

STEP
スコープを追加する

Bot Token Scopes のAdd an OAuth Scopeを選択し、スコープを1つずつ追加していきます。

STEP
設定完了

表示名とユーザー名を設定する

Slack のワークスペース上で追加した Slack App を検索したいときに使う Bot の表示名とユーザー名を登録します。

STEP
App Home ページに移動する
App Home
STEP
Display Name( Bot Name )と Default Name を設定する
App Home
STEP
設定完了

ワークスペースにインストールする

STEP
Install App ページに移動してインストールする
Install App

Install to Workspace を選択します。

Install App

問題なければ許可します。

STEP
インストール完了(トークンを控えておく)
Install App

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')

この記事が気に入ったら
フォローしてね!

シェアしていただけると励みになります
  • URLをコピーしました!

コメント

コメントする

目次
閉じる