<目次>
(1) Slack APIで投稿一覧を取得する方法をご紹介(Python)
(1-0) やりたいこと
(1-1) STEP1:Slackアプリの準備
(1-2) STEP2:サンプルプログラム
(1) Slack APIで投稿一覧を取得する方法をご紹介(Python)
(1-0) やりたいこと
●アウトプットイメージ
Slack APIで、指定したチャンネルの投稿一覧を照会した結果(JSON)を、表形式に整形したのち、csvに出力する。
(図111)

●処理の流れ
Slack Appを作成し、そのApp経由で投稿一覧のAPIを照会します。
(図112)

(1-1) STEP1:Slackアプリの準備
APIの処理はSlackボットを経由して行うため、事前にSlackボットを準備しておきます。
(作成手順)
その際、ボットには必要な権限を割り当てておきます。
・①必要な権限
channels:history
groups:history
im:history
mpim:history
(図122)

↓
・②OAuth & Permissionsを選択
(図123)

↓
・③割り当て
(図124)

また、Bot User OAuth Tokenはプログラムの中で指定が必要なため、控えておきます。
(図121)

(1-2) STEP2:サンプルプログラム
(サンプルプログラム)
slack_get_conversation_list.py
import json import pandas as pd import requests import os from pathlib import Path from dotenv import load_dotenv # 親フォルダパスを取得 file_path = Path(__file__).parent # 「.env」ファイルのパスを設定 env_path = file_path/'.env' # 「.env」ファイルのロード load_dotenv(dotenv_path=env_path) def main(): # APIのURL url = os.environ['URL'] channel = ("?channel="+os.environ['CHANNEL']) if os.environ['CHANNEL'] != "" else "" url = url + channel print(url) # ヘッダー部 headers = { "Content-Type":"application/x-www-form-urlencoded", "User-Agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)", "Authorization":"Bearer "+os.environ['SLACK_BOT_TOKEN'] } # POSTリクエスト response = requests.post(url, headers=headers) # レスポンスの内容をtext形式で取得 result = response.text # レスポンスのJSONを表形式データ(DataFrame)に変形する # JSONライブラリを用いて、JSONファイルのデータをJSONオブジェクトとしてロード json_object = json.loads(result) # pandasの「json_normalize」関数を用いてデータを正規化 # 第1引数:json形式のオブジェクト # 第2引数:分解対象のデータのkey # 第3引数:その他、分解した明細に付与するデータ df = pd.json_normalize(json_object, record_path =['messages']) # df = pd.json_normalize(json_object, record_path =['students'],meta=['school_name', 'class']) # 表形式データ(DataFrame)をcsv出力する df.to_csv('./slack_get_conversation_history.csv', sep=',', encoding='shift-jis', header=True) if __name__ == "__main__": main()
(図131)


.env
URL='https://xxxxxxx.slack.com/api/conversations.history' SLACK_BOT_TOKEN='xoxb-xxxxx' CHANNEL = '[取得対象のチャンネルID]' ↓
実行するとプログラムと同じ階層に、csvが生成されます。
(図133)

↓
Csvはユーザー単位でデータが出力されています。
(json形式のデータを表形式に整形している)
(図134)

ちなみに、元々のJSON形式のレスポンスはこんな感じです。
ネストになっている「”profile”: { ・・・ }」の部分も、csvの右側に列がちゃんと存在している事が確認できています。
(参考)
{ "ok": true, "messages": [ ~中略~ { "client_msg_id": "e3b57d70-c67f-4479-bfd8-cbb047a043eb", "type": "message", "text": "<@U02T3FS7FD4>\nはじめまして、本日より参画しているRainbow Planet04です。\nよろしくお願いいたします。", "user": "U02TA7J1DEX", "ts": "1664089469.822699", "blocks": [ { "type": "rich_text", "block_id": "D=Ov", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "user", "user_id": "U02T3FS7FD4" }, { "type": "text", "text": "\nはじめまして、本日より参画しているRainbow Planet04です。\nよろしくお願いいたします。" } ] } ] } ], "team": "T02TA6EUXSN" }, { "type": "message", "subtype": "channel_join", "ts": "1664089185.724989", "user": "U02TA7J1DEX", "text": "<@U02TA7J1DEX>さんがチャンネルに参加しました" } ], "has_more": false, "is_limited": true, "pin_count": 0, "channel_actions_ts": null, "channel_actions_count": 0 }
(参考)