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

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

## 使うもの
Slack APIの[conversations.history](https://api.slack.com/methods/conversations.history)を使用します

## 流れ

[Slack API](https://api.slack.com/apps/)にてアプリを作成し、Auth Tokenを取得します

#### 1.`Create New App`を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/a66a1939-12ff-2f2d-d367-4f81c46e7a2c.png" width="600px">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/61d69662-5f43-d25b-87f5-c46ca7eb8d03.png" width="300px">


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

#### 2.`Permission`の設定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/5f6ff4b1-f4aa-9ed1-a7be-74b4c5de1963.png" width="300px">

次いてはPermissionの設定をします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/50a62734-2943-a998-a559-442e5935bb24.png" width="300px">


conversations.historyはメッセージの取得のみなので上記の4つのスコープを許可してあげます
ちなみにToken Scopesの種類は`Bot`と`User`がありますがAPIで使用する場合は`User Token Scopes`を使用してください
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/48381b43-a4b4-ad20-4fed-c4bac6e4babd.png" width="400px">
Permissions > Scopesから仕様書に記載されている`Required scope`4つを見つけて設定します

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

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/05de2151-1066-abb9-bfcd-b8654276cadb.png" width="400px">

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


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

あとは実際にAPIを叩いてメッセージを取得するだけです
Defaultで100件までしか一度に取得できないので`Cursor`というページネーションの引数を使用して
ちょっとづつ取得してあげます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/4f4f78fb-be29-a643-87a2-becddcd47c84.png)



何件まで一度に取得可能か検証してないですが、上限はありそうな記述ですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/56e2d17f-0f5f-a7dd-8f18-15cc0d9c1101.png)

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

https://github.com/reiyaono/export_slack_messages

代入する変数は3つです

``` ruby
AUTH_KEY = ''
CHANNEL_ID = ''
USER = { }
```

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/ece70253-baae-421a-6250-a3c628e2ee88.png)
すると `https://YOUR_WORKSPACE.slack.com/archives/CHANNEL_ID`のようになるのでIDを使用します

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

UserIDの確認は[users.list](https://api.slack.com/methods/users.list)というAPIを使用します
ここでは詳しくは紹介しません🙇‍♂️

``` ruby
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へ書き出すことができます
自然言語解析やログとして保存したり調査したりできますね  

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