【制限解除】Slackの全メッセージデータを取得する【簡単解決】

Slackの無料プランを業務で使っている人も多いと思います。
ぶっちゃけ、有料プランを使ってコストを増やしたくないから、無料プランにしてますよね？
僕もそのユーザの一人です。

また、リプライとかで話しているうちに、重要なテキストデータがあるかわからなくなってしまった、、。

ということがあると思います。

今回は、そんな問題を解決するためのコードを作成しました。

## 背景

Slackを無料プランのまま、APIとかを使って、使い倒したい！！という風に思ったのがきっかけです。

2ヶ月ごとにこのコードを実行すれば、Slackの全部の会話データが無料で手に入るようになるので、Slackを使い倒すことが出来るようになります。

コードの中身は知らなくてもいいから、使い方だけ知りたい！！
そんなあなたは、
1. SlackAPIの作り方
2. Botのワークスペースへの追加方法

この二つを読んでSlackのAPIを作成したら、Colabを実行することが可能です。

[完成品はこちら](https://colab.research.google.com/drive/17jvGzuTT8xct3WJOCDOXIGKlXz_APrKC?usp=sharing)


## 完成予定図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/dc9e064a-87bf-2aa0-6fc9-1fd425894d71.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/f8d19bed-3daa-d9b2-0e39-2ea37de512c3.png)

## 環境
Google Colaboratoryで実行しました。
Google Colaboratoryについての詳しい説明は、下記のURLから確認してください。

[完成品はこちら](https://colab.research.google.com/drive/17jvGzuTT8xct3WJOCDOXIGKlXz_APrKC?usp=sharing)


| APIのURL | APIの動作 | ドキュメントのURL |
| --- | --- | --- |
| https://colab.research.google.com/notebooks/welcome.ipynb	| 「Google Colaboratory」とは、Googleが提供するオンライン上でPythonのプログラムを実行できるJupyter Notebook環境です。| 	https://colab.research.google.com/notebooks/intro.ipynb

## Slack API
Slack APIを使えるようにする為の権限の追加とワークスペースの追加の方法を記載する。

### APIの作成
1. [Slack API](https://api.slack.com/)にアクセスする
2. Create an appをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/967eed05-3015-e02a-6eed-4b11abaa0a1b.png)

　3. From scratchをクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/4f73bb6c-2144-e4c3-1831-1f3139045630.png)

　4. App Nameに作りたいアプリの名前を入れて、workspaceにBotを入れる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/832b4ce9-60f9-1567-0c12-e5f7ea479e58.png)


これで、一通りアプリを作成するときに必要なことは完了しました。

### 権限の追加
1. 左メニューの中の「OAuth & Permissions」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/d851075e-90ed-36b4-3bfc-1e118ff67e77.png)

2. 下の方のScopesという項目で以下６つのスコープを追加する。


    1. channels:history
    1. channels:read
    1. groups:read
    1. im:history
    1. mpim:history
    1. users:read



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/142960a1-4e22-4838-c1c1-75484f9f94e6.png)

#### スコープで取得する情報
それぞれのスコープで取得する情報は下記のとおりです。

* channels:history
  - channels.historyメソッドを使用して、チャンネルの履歴を取得する権限を提供します。
  - https://api.slack.com/methods/channels.history

* channels:read
  - ユーザーが所属する全てのチャンネルに関する情報を取得する権限を提供します。
  - https://api.slack.com/scopes/channels:read

* groups:read
  - ユーザーが所属する全てのグループに関する情報を取得する権限を提供します。
  - https://api.slack.com/scopes/groups:read

* im:history
  - im.historyメソッドを使用して、ダイレクトメッセージの履歴を取得する権限を提供します。
  - https://api.slack.com/methods/im.history

* mpim:history
  - mpim.historyメソッドを使用して、マルチパーティダイレクトメッセージの履歴を取得する権限を提供します。
  - https://api.slack.com/methods/mpim.history

* users:read
  - ユーザーに関する情報を取得する権限を提供します。
  - https://api.slack.com/scopes/users:read


### チャンネルにBotを追加する
1. 上記のスコープの追加が終わったら、「OAuth Tokens for Your Workspace」の項目にある
　　「Install to Workspace」を押す。
2. クリックして、「Bot User OAuth Token」をコピーする

ここで得られる値が、APIの認証に必要なトークンとなっている。
そのため、**外部に流出しないよう**に注意する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/e066b177-8fc1-de92-c1fe-484be6c8c84b.png)


## ChatDataを取得するBotをデータを取得したいChannelに追加する。
1. チャンネルを「右」クリック
1. チャンネル詳細を表示するをクリック
1. チャンネル詳細のインテグレーションをクリック
1. 青色の「アプリを追加する」をクリック
1. 上記で作成したアプリ名を追加する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/b3696142-0296-9f86-5b41-78e2a060aef8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/8bc21e99-e642-a973-81f4-3764a2b2ac5a.png)


## 用いたAPIの説明
コードの中で使用しているAPIは4つです。
それぞれのDMやチャンネル、スレッド内のメッセージを取得するAPIとなっています。

| APIのURL | APIの動作 | ドキュメントのURL |
| --- | --- | --- |
| conversations.history | チャンネルのメッセージの履歴を取得します。 | https://api.slack.com/methods/conversations.history |
| conversations.replies | スレッドのメッセージを取得します。 | https://api.slack.com/methods/conversations.replies |
| conversations.list | ワークスペース内のチャンネルやDMを一覧表示します。 | https://api.slack.com/methods/conversations.list |
| users.list | ワークスペースに所属するユーザーの一覧を表示します。 | https://api.slack.com/methods/users.list |

## 関数の説明

### get_response(api_url, payload=None)

Slack APIにリクエストを送信する関数です。

**引数:**

- `api_url` (str): APIのエンドポイントのURL
- `payload` (dict): APIリクエストのパラメータ

**返り値:**

- `res.json()` (dict): APIのレスポンス


### get_messages(channel_id, channel_name, users_dict)

指定されたチャンネルのメッセージ履歴を取得する関数です。

**引数:**

- `channel_id` (str): チャンネルのID
- `channel_name` (str): チャンネル名
- `users_dict` (dict): ユーザIDとユーザ名の対応表

**返り値:**

- `messages_sorted` (list): メッセージのリスト


### print_channel_messages(channel_name, messages, users_dict)

チャンネルのメッセージを出力する関数です。

**引数:**

- `channel_name` (str): チャンネル名
- `messages` (list): メッセージのリスト
- `users_dict` (dict): ユーザIDとユーザ名の対応表

**返り値:**

- なし

**必要な要素：**

- Slack APIのトークン（token）
- APIエンドポイントのURL（api_url）
- APIリクエストのパラメータ（payload）
- ユーザIDとユーザ名の対応表（users_dict）
- チャンネルのID（channel_id）
- チャンネル名（channel_name）
- メッセージのリスト（messages）






## 最後に
これで、SlackのAPIを使いこなして、
会社やプライベート使用しているSlackをさらに有効活用していきましょう！！

[GitHubのコードはこちら](https://github.com/YUMA-NAGAO/GetSlackDatatExternal/blob/main/README.md)


## 参考文献
[Slack無料プランで3か月前までの会話しか見えなくなるのをAPIを使って何とかする](https://qiita.com/shalXXXX/items/831d0dc6a6c82d0b3379#get_messages)