筆者の所属している株式会社BFTでは2023年6月より、十数人の有志により毎月テーマを決めて、コーディングを行っています。その成果物については月に1回開催される開発勉強会で、コードのレビューが行われます。
開発勉強会の目的は下記の通りです。
- 1カ月という短期間である程度実用性のあるコードが書けるようになる
- 参加者のコードをレビューできるようになる
- 複数人で同じテーマのもとコーディングを行うことでモチベーションを保つ
本記事では、Python初心者の筆者が開発勉強会に参加して、実際にプログラミングを行った際に学んだことを紹介します。今回のテーマは「Slackにて指定したキーワードをもとに対象のチャンネルから、そのキーワードが利用されているメッセージを取得する」です。
※過去の記事はこちらです。
PythonのOpenCVでリアルタイム顔検出プログラムを作ってみた【開発勉強会】
PythonでWebスクレイピング!商品情報を取得してみた【開発勉強会】
目次
なぜSlackのメッセージを取得しようと思ったのか
Slack上では多種多様なやり取りが行われます。その中でも、質問・相談用のチャンネルなどで、過去に技術的な質問や、自身の抱えている疑問と似たような問い合わせがあった場合にその内容を確認したい、過去のメッセージをナレッジとして蓄積したいと思ったことはありませんか?
確かこのあたりのログにあったような…と探してみるものの、目的のログが見つからないこともあります。このような課題を解決するために、下記の要件を満たすプログラムを実装することにしました。
・指定したキーワードをもとに対象のChannelからそのキーワードを含むメッセージを取得する。
・そのメッセージに対してリプライがある場合は、そのリプライも取得する。
・取得した情報は、整形した上でCSVとして出力する。
プログラムを実装しなくてもSlackの検索機能を使えば上記の課題は解決できそうに見えるかもしれませんが、下記の点でプログラムを実装するメリットがあると考えました。
・無料プラン(時間がたつとメッセージが消えてしまう)でもメッセージを残せる
・検索結果をデータ分析に使える
Slack APIを利用したメッセージ検索&取得の仕組み
こちらの記事に書かれているように、Slackの開発者がSlackで使える便利な機能をSlack APIとして提供しています。実際にSlack APIを利用してメッセージを検索し、取得する仕組みは以下のような流れにしました。
Slack APIを使うための準備として、後述の手順にてSlack Appの作成とtokenの取得を行います。次にPythonのプログラムでSlack APIを利用してメッセージの検索&取得を行います。
具体的にはsearch.messagesというSlack APIメソッドを利用して検索したいワードを含むメッセージを一覧として取得します。続けて、リプライも含めて取得するという要件を満たすためにconversations.repliesというSlack APIメソッドを利用します。
Slack APIをPythonで利用するには ~slack-sdkについて~
PythonでSlack APIを利用する際はslack_sdkという公式のパッケージを使用します。slack-sdkは下記コマンドを実行することでインストールできます。
> pip install slack_sdk
slack-sdkにはWebClient、WebhookClientというクラスがあり、プログラムで使いたいクラスを下記のようにインポートして使います。
from slack_sdk import WebClient
後述する手順で取得するtokenを使用して下記のように記述することで、Slack APIにアクセスすることができます。
SLACK_ACCESS_USER_TOKEN = ‘xoxp-xxxx’
client = WebClient(SLACK_ACCESS_USER_TOKEN)
またslack-sdkと似たようなものに、slack-boltという公式のSlackアプリ開発用パッケージが存在し、こちらもPythonに対応しています。
slack-boltはslack-sdkに依存しており、イベントの発生をトリガーとしてアクションを起こすようなアプリを実装する際はslack-bolt、そうでなければslack-sdkを利用するのが良いかと思います。
Slack API利用前の準備|Slack Appインストール
Slack APIを使用する際は次に記載する手順でSlack Appをワークスペースにインストールし、tokenを取得する必要があります。
1.メッセージを取得したいチャンネルが存在するSlackワークスペースの任意のチャンネルより、チャンネル詳細を開く。
2.[インテグレーション]>[App]より[アプリを追加する]をクリックする。
3.[Appディレクトリを表示]をクリックする。
4.ブラウザが起動するので、起動したブラウザの画面にて[ビルド]をクリックする。
5.[Get started]をクリックする。
6.[Slack apps]>[Getting started]を選択し、[Go to Your Apps]をクリックする。
7.[Create an App]をクリックする。
8.[From scratch]をクリックする。
9.[App Name]に作成するSlack Appの名前を入力し、[Pick a workspace to develop your app in:]でSlack Appを入れるワークスペースを選択する。
次に[Create App]をクリックする。
10.[Install your app]>[Install to Workspace]をクリックする。
11.[User Token Scopes]>[Add an OAuth Scope]をクリックし、下記のOAuth Scopeを追加する。
※追加するOAuth Scopeは使用するSlack APIによって異なる。
・admin
・identify
・channels:history
・groups:history
・channels:read
・groups:read
・search:read
12.上にスクロールして[OAuth Tokens for Your Workspace]>[Install to Workspace]をクリックする。
13.[許可する]をクリックする。
14.[OAuth Tokens for Your Workspace]に[User OAuth Token]が生成されるので、[Copy]をクリックして情報を控えておく。
※プログラム実装の際に使用するため。
15.Slackの画面に戻り、Slack Appを追加したいチャンネル(メッセージを取得したいチャンネル)に入りチャンネル詳細を開く。[インテグレーション]>[App]より[アプリを追加する]をクリックする。
16.先ほど作成したアプリの右の[追加]をクリックする。
Slack APIを利用してPythonで実装してみた
今回の開発勉強会で高く評価されたプログラムを用いて、冒頭で示した要件を満たすプログラムの実装方法を紹介します。
実装環境
slack-sdk 3.22.0
メッセージ取得
下記のコードでユーザが入力したワードを検索したいワードとして指定し、Slack APIメソッドであるsearch.messagesを使って検索したいワードを含むメッセージの一覧を取得します。
# 検索したいワードを指定
keyword = input(“検索したいワードを入力してください”)
query_word = keyword + ” in:” + channel[0]
# 指定したチャンネル内の該当ワードを含むメッセージを一覧で取得
response = client.search_messages(query=query_word)
取得したメッセージ一覧からメッセージを1つずつ取り出し、Slack APIメソッドであるconversations.repliesを用いて、検索したいワードを含むメッセージをリプライも含めて取得します。
# 一覧からメッセージを一つずつ取り出す
for res in response[‘messages’][‘matches’]:
# メッセージのタイムスタンプを取得
massage_ts = res[‘ts’]
channel_id = channel[1]
# メッセージを含むスレッドを取得
thread = client.conversations_replies(channel=channel_id, ts=massage_ts)
プログラムの動作
今回紹介するプログラムは下記の処理を行います。
- チャンネル一覧を取得し、ユーザが入力した文字を含むチャンネルを検索する
- ユーザにチャンネルを選択させる
- ユーザに検索したいワードを入力させる
- メッセージを取得し、CSVに出力する
今回は下図のようなSlackのチャンネルに対してプログラムを実行しました。
実際の実行結果を下図に示します。チャンネルは「general」、検索ワードは「ナレッジ」としています。
csv_headerを使うことで、実行結果を下図のようにCSVに出力しています。
Pythonでプログラムを書いた感想
今回はslack-sdkを使ったプログラムを紹介しましたが、勉強会ではslack-sdkを使わずに要件を満たすプログラムを実装した方もいました。
双方のプログラムを比較した際、slack-sdkを使うと一見複雑そうに見える処理でも数行のコードで実現できるため、非常に簡単にわかりやすい(可読性の高い)プログラムが書けると感じました。
また、今回の勉強会では「こんな機能を提供しているAPIがあったんだ!」と思うことが多く、Slack APIの豊富さを実感しました。
もし自分が使っているツールをより便利に使いたいと思ったら、まずは提供されているAPIをよく調べてみると、自分が考えている以上に簡単に思い描いているプログラムが実装できるかもしれませんね。