<目次>
(1) Slack APIで返信を一覧で取得する方法をご紹介(Python)
(1-0) やりたいこと
(1-1) STEP1:Slackアプリの準備
(1-1) STEP2:サンプルプログラム(特定スレッドに対する返信だけを取得)
(1-2) STEP3:サンプルプログラム(チャンネル内の全ての投稿&返信を取得)
(1) Slack APIで返信を一覧で取得する方法をご紹介(Python)
(1-0) やりたいこと
●アウトプットイメージ

●処理の流れ

(1-1) STEP1:Slackアプリの準備
channels:history groups:history im:history mpim:history




(1-2) STEP2:サンプルプログラム(特定スレッドに対する返信だけを取得)

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、ts channel = ("?channel="+os.environ['CHANNEL']) if os.environ['CHANNEL'] != "" else "" ts = ("&ts="+os.environ['TS']) if os.environ['TS'] != "" else "" url = url + channel + ts # ヘッダー部 headers = { "Content-Type":"application/json", "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_reply_list.csv', sep=',', encoding='shift-jis', header=True) if __name__ == "__main__": main()

URL='https://slack.com/api/conversations.replies' SLACK_BOT_TOKEN='xoxb-xxxxx' CHANNEL = 'C02SVHS0H7Z' TS = '1664089917.194639'




{ "ok": true, "messages": [ { "client_msg_id": "7c6e97e6-4d3d-4912-a7d6-a58fd46967ba", "type": "message", "text": "<@U02T3FS7FD4>\n先ほどはオリエンテーションありがとうございました。\n投影頂いた資料等、お手数ですが連携頂けますでしょうか?", "user": "U02SVHS9AA3", "ts": "1664089917.194639", "blocks": [ { "type": "rich_text", "block_id": "/CSL", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "user", "user_id": "U02T3FS7FD4" }, { "type": "text", "text": "\n先ほどはオリエンテーションありがとうございました。\n投影頂いた資料等、お手数ですが連携頂けますでしょうか?" } ] } ] } ], "team": "T02TA6EUXSN", "thread_ts": "1664089917.194639", "reply_count": 2, "reply_users_count": 2, "latest_reply": "1671530784.605409", "reply_users": [ "U02T3FS7FD4", "U02SVHS9AA3" ], "is_locked": false, "subscribed": false }, { "client_msg_id": "d9fb8470-d81c-4be0-a0e9-f32b5b49c15f", "type": "message", "text": "Sharepointに格納しました。", "user": "U02T3FS7FD4", "ts": "1664089960.413939", "blocks": [ { "type": "rich_text", "block_id": "b9YeP", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "text", "text": "Sharepointに格納しました。" } ] } ] } ], "team": "T02TA6EUXSN", "thread_ts": "1664089917.194639", "parent_user_id": "U02SVHS9AA3" }, { "client_msg_id": "faf54b44-5a2a-4b1d-ac6b-a65442084a8f", "type": "message", "text": "<@U02T3FS7FD4>\nありがとうございます。確認できました。", "user": "U02SVHS9AA3", "ts": "1671530784.605409", "blocks": [ { "type": "rich_text", "block_id": "N82", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "user", "user_id": "U02T3FS7FD4" }, { "type": "text", "text": "\nありがとうございます。確認できました。" } ] } ] } ], "team": "T02TA6EUXSN", "thread_ts": "1664089917.194639", "parent_user_id": "U02SVHS9AA3" } ], "has_more": false }
(1-3) STEP3:サンプルプログラム(チャンネル内の全ての投稿&返信を取得)

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_1 = os.environ['URL_MESSAGE'] channel = ("?channel="+os.environ['CHANNEL']) if os.environ['CHANNEL'] != "" else "" url_1 = url_1 + channel # ヘッダー部 headers = { "Content-Type":"application/json", "User-Agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)", "Authorization":"Bearer "+os.environ['SLACK_BOT_TOKEN'] } # POSTリクエスト response_1 = requests.post(url_1, headers=headers) # レスポンスの内容をtext形式で取得 result_1 = response_1.text # レスポンスのJSONを表形式データ(DataFrame)に変形する # JSONライブラリを用いて、JSONファイルのデータをJSONオブジェクトとしてロード json_object_1 = json.loads(result_1) # pandasの「json_normalize」関数を用いてデータを正規化 # 第1引数:json形式のオブジェクト # 第2引数:分解対象のデータのkey # 第3引数:その他、分解した明細に付与するデータ df_1 = pd.json_normalize(json_object_1, record_path =['messages']) # df = pd.json_normalize(json_object_1, record_path =['students'],meta=['school_name', 'class']) ### 返信取得処理 ### # dfを1件ずつループ for index, row in df_1.iterrows(): # 返信がある場合 if row['reply_count'] > 0: ### 返信を取得 ### # APIのURL組み立て url_2 = os.environ['URL_REPLY'] channel = ("?channel="+os.environ['CHANNEL']) if os.environ['CHANNEL'] != "" else "" ts = ("&ts="+os.environ['TS']) if os.environ['TS'] != "" else "" url_2 = url_2 + channel + ts # POSTリクエスト response_2 = requests.post(url_2, headers=headers) # レスポンスの内容をtext形式で取得 result_2 = response_2.text # レスポンスのJSONを表形式データ(DataFrame)に変形する # JSONライブラリを用いて、JSONファイルのデータをJSONオブジェクトとしてロード json_object_2 = json.loads(result_2) # pandasの「json_normalize」関数を用いてデータを正規化 # 第1引数:json形式のオブジェクト # 第2引数:分解対象のデータのkey # 第3引数:その他、分解した明細に付与するデータ df_2 = pd.json_normalize(json_object_2, record_path =['messages']) print(df_2) # df_2をdf_1に追加(マージ) df_1 = pd.concat([df_1,df_2],ignore_index=True).drop_duplicates(['client_msg_id'], keep='last') # 表形式データ(DataFrame)をcsv出力する df_1.to_csv('./slack_get_conversation_reply_list.csv', sep=',', encoding='shift-jis', header=True) if __name__ == "__main__": main()
URL_MESSAGE='https://rainbowplanet.slack.com/api/conversations.history' URL_REPLY='https://slack.com/api/conversations.replies' SLACK_BOT_TOKEN='xoxb-xxxxx' CHANNEL = 'C02SVHS0H7Z' TS = '1664089917.194639'


