Slackの特定チャンネルのメッセージをクロールする方法

# はじめに
* 今回は、Slackで特定のチャンネルに投稿されたメッセージをクロールする方法について紹介していきます。

# Slack API
* 今回、Slack内のメッセージをクロールする際に使用するのが、Slack APIです。
* Slack APIでは、Slack内のさまざまなタイプのデータの読み取り、書き込み、および更新へのアクセスを提供する一連のAPIです。
* Slack APIには、いくつか種類があり、例えばWeb APIやEvent APIなどがあります。
* 今回は、Web APIを使用していきます。

## conversations.history
* Slackのweb APIでは、それぞれ用途別にメソッドが分かれています。
* 今回は、その中でも**Slackで特定のチャンネルに投稿されたメッセージ**をクロールしたいので、使用するメソッドは、[conversations.history](https://api.slack.com/methods/conversations.history)というものが適切だと考えます。

### 設定できるパラメータ
* **token: 必須** - 取得したToken
* **channel : 必須** - 取得したいSlackのワークスペースに含まれるChannel ID
* **cursor: オプション** - Next_token的なものがresponseに返ってくるので、ページングしたい時にresponseの(next_cursor)の値を入れるとページングされた結果が返される。
* **inclusive: オプション** - (defaultでは 0が設定されている) タイムスタンプが指定されている場合にのみ、最新または最古のタイムスタンプを持つメッセージを結果の境界を含むか含めないかを指定できる。
* **latest: オプション** -  (defaultは現在時刻が入っている [UnixTime]) 結果に含めるメッセージの時間範囲の終了
* **limit : オプション** -  (defaultは100) 返品するアイテムの最大数。ユーザー リストの最後に達していなくても、要求された数より少ないアイテムが返される場合があります。
* **oldest: オプション** - (defaultは0 [UnixTime]) 結果に含めるメッセージの時間範囲の開始。

### Tokenの取得方法
* Tokenの取得なのですが、Legacy tokensの取得は非推奨の為、アプリベースのToken取得が必要になってきます。

#### ① アプリの作成
* https://api.slack.com/apps より、Slack APIにアクセスします。
* 下記の画面が表示されたら、「Create New App」をクリックします。
![スクリーンショット 2021-06-08 13.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/1f9038c3-a391-72f3-0449-27d6bfa376d6.png)

* モーダルが表示されたら、「From scratch」をクリックする。
![スクリーンショット 2021-06-08 13.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/7634e912-632a-f779-8605-4e69f5f98912.png)

* アプリの名前とワークスペースを選択し、「Create App」をクリックする。
![スクリーンショット 2021-06-08 13.42.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/a9347065-24db-f911-92fd-bc9b8e498d7d.png)

#### ② Permisionを指定する。
* アプリを作成すると、下記のような画面「Basic Information」が表示されるので、右下にある、「Permission」を選択する。
![スクリーンショット 2021-06-08 13.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/f1b3b33a-6c88-a02a-48df-2637b7be71b9.png)

* 「Permission」をクリックすると、下記のような画面に遷移する。
![スクリーンショット 2021-06-08 13.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/bea6dad5-c0cc-07c1-8781-0c5136671a06.png)

* スクロールしていき、「Scopes」までいったら、「User Token Scopes」の「Add an OAuth Scope」　に下記の内容を追記していきます。
![スクリーンショット 2021-06-08 13.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/856c3f21-470b-53de-f8b0-0bc4ad00d1d4.png)

**追加するPermission**
![スクリーンショット 2021-06-08 13.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/370260a9-f933-85a2-1d5e-6d20450f1de3.png)

##### 設定するPermission

* 上記で指定したPermissionは、 conversations.historyで必要とするものになります。

![スクリーンショット 2021-06-04 9.39.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/bd7d9ae0-87f0-4818-2737-50e6adeaf07a.png)

#### ③ Tokenを発行する。

* 最後に下記の「Install to Workspace」をクリックすると新規にTokenが払い出されます。

![スクリーンショット 2021-06-08 13.52.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/51f4794a-76bc-6762-bd40-844aa57873b0.png)

### Pythonでの実装例

```slack.py
import requests

SLACK_CHANNEL_ID = '指定したいChannelのID名を記載'
SLACK_URL = "https://slack.com/api/conversations.history"
TOKEN = "取得したTokenを記載"

def main():
    payload = {
        "channel": SLACK_CHANNEL_ID,
        "oldest": "1622761200"
    }
    headersAuth = {
    'Authorization': 'Bearer '+ str(TOKEN),
    }  
    response = requests.get(SLACK_URL, headers=headersAuth, params=payload)
    json_data = response.json()
    msgs = json_data['messages']

    return print(msgs)

if __name__ == "__main__":
    main()
```


# 参考文献
https://api.slack.com/methods/conversations.history