やること
SlackのチャンネルやDMのメッセージを全て保存してcsvに書き出します
使うもの
Slack APIのconversations.historyを使用します
流れ
Slack APIにてアプリを作成し、Auth Tokenを取得します
1.Create New App
を選択


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

conversations.historyはメッセージの取得のみなので上記の4つのスコープを許可してあげます
ちなみにToken Scopesの種類はBot
とUser
がありますがAPIで使用する場合はUser Token Scopes
を使用してください
Permissions > Scopesから仕様書に記載されているRequired scope
4つを見つけて設定します
これを設定しないと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へ書き出すことができます
自然言語解析やログとして保存したり調査したりできますね
機密情報の流出にはくれぐれも注意して使いましょう