APIを使用してSlackのやりとりを全てcsvに保存する


やること

SlackのチャンネルやDMのメッセージを全て保存してcsvに書き出します

使うもの

Slack APIのconversations.historyを使用します

流れ

Slack APIにてアプリを作成し、Auth Tokenを取得します

1.Create New Appを選択

名前をいい感じに設定して、取得したいDMやチャンネルがあるSlackのWorkspaceを選択してください

2.Permissionの設定

次いてはPermissionの設定をします

conversations.historyはメッセージの取得のみなので上記の4つのスコープを許可してあげます
ちなみにToken Scopesの種類はBotUserがありますがAPIで使用する場合はUser Token Scopesを使用してください

Permissions > Scopesから仕様書に記載されているRequired scope4つを見つけて設定します

これを設定しないとAPIを叩いた時のレスポンスがmissing_scopeとなります

3.Tokenの取得

permissionの設定が終わったらTokenを取得します、既に取得してしまっているのでTokenが表示されているのですが
取得されていない場合Workspaceにappをinstallするみたいなボタンが出るのでそこを押します

この画像はBotUserのみのTokenが表示されていますが、UserTokenの方を使用してください

4. 実際にAPIを叩いてメッセージを取得する

あとは実際にAPIを叩いてメッセージを取得するだけです
Defaultで100件までしか一度に取得できないのでCursorというページネーションの引数を使用して
ちょっとづつ取得してあげます

何件まで一度に取得可能か検証してないですが、上限はありそうな記述ですね

変数を代入するだけでcsvに書き出してくれるrbファイルを作成したので
よければ使ってください

代入する変数は3つです

AUTH_KEY = ''
CHANNEL_ID = ''
USER = { }

AUTH_KEYは先ほど取得したTokenです
CHANNEL_IDはSlackが自動的に生成したチャンネルのIDになります
Slackを開いてチャンネルを右クリックしてCopy linkを選択してどこかにペーストします


すると https://YOUR_WORKSPACE.slack.com/archives/CHANNEL_IDのようになるのでIDを使用します

USERのhashはkeyにユーザーのID、valueにユーザーの名前を持ちます

UserIDの確認はusers.listというAPIを使用します
ここでは詳しくは紹介しません🙇‍♂️

def messages
  messages_body = JSON.parse(call_api.body, symbolize_names: true)
  @has_more = messages_body[:response_metadata] && messages_body[:response_metadata][:next_cursor]
  messages_arr = []
  messages_body[:messages].each do |message|
    time =  Time.at(message[:ts].to_i).strftime('%Y-%m-%d %H:%M:%S')
    user = USER[message[:user].to_sym]
    text = message[:text]
    messages_arr << [time, user, text]
  end
  export_to_csv(messages_arr)
  messages unless @has_more.nil?
end

中の処理としてはmessages_body[:response_metadata][:next_cursor]が空になるまで再帰的にリクエストしてcsvに書き出している感じです

これでチャンネルのメッセージを全てcsvへ書き出すことができます
自然言語解析やログとして保存したり調査したりできますね

機密情報の流出にはくれぐれも注意して使いましょう