Slack 上のアーカイブファイルを削除する方法

!!HEAD UP!!  
記事を書いてから１年以上経っているので Slack API が変更してる場合があります。短いコードですのでもし間違いがあった場合でも適宜修正してお使いください。

------

Slack でファイルをアップロードしようとしたらファイルの容量が限界だと言われたときに Slack からファイルを消す方法についてのメモです。

<p align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/5559/17b98fc9-cc86-87fc-1bbc-260e4838c749.png" width="400"
</p>

> Your team is over its storage limit.
> Please upgrade to a paid tier or delete some larger files.

## ファイルを消せる権限があるか確認

まずは自分が適用な権限をもつか確認するために Slack の [files.list APIのtester](https://api.slack.com/methods/files.list/test) を実行してみてください。ファイルの削除が成功すると以下のログが出力されます。このときに表示される file オブジェクトの一番上の ID 名を覚えておいてください。

Slack API レスポンス:

```
{
    "ok": true,
    "files": [
        {
            "id": "XXXXXXXXX",
~ 略 ~
```

次に Slack の [files.delete](https://api.slack.com/methods/files.delete/test) の `file` の値に先ほど取得した ID を入力して実行してください。以下のログのようになれば成功です。それ以外のログが出た場合は files.delete ページのエラーメッセージの説明を読んで対処してください。

Slack API レスポンス:

```json
{
    "ok": true
}
```

## ファイルを削除するスクリプトを実行

```slack.py
# This code is taken from Santiago'blog below
# https://www.shiftedup.com/2014/11/13/how-to-bulk-remove-files-from-slack

import requests
import json
import calendar
from datetime import datetime, timedelta

_token = "YOUR TOKEN GOES HERE"
_domain = "YOUR SUB DOMAIN HERE"

if __name__ == '__main__':
    while 1:
        files_list_url = 'https://slack.com/api/files.list'
        date = str(calendar.timegm((datetime.now() + timedelta(-30))
            .utctimetuple()))
        data = {"token": _token, "ts_to": date}
        response = requests.post(files_list_url, data = data)
        if len(response.json()["files"]) == 0:
            break
        for f in response.json()["files"]:
            print "Deleting file " + f["name"] + "..."
            timestamp = str(calendar.timegm(datetime.now().utctimetuple()))
            delete_url = "https://" + _domain + ".slack.com/api/files.delete?t=" + timestamp
            requests.post(delete_url, data = {
                "token": _token, 
                "file": f["id"], 
                "set_active": "true", 
                "_attempts": "1"})
    print "DONE!"
```

1\. [Slack API ページ](https://api.slack.com/docs/oauth-test-tokens)からトークンを取得
2\. 上記の python スクリプトを **slack.py** として保存
3\. コード内の変数 `_token` 値に先ほど取得したトークンを追加
4\. python がなければ python 追加
5\. [requests](http://docs.python-requests.org/en/latest/user/install/#install) をインストール

pip インストール：

```bash
$ curl -KL https://bootstrap.pypa.io/get-pip.py | python
Warning: error trying read config from the 'L' file
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1487k  100 1487k    0     0  4289k      0 --:--:-- --:--:-- --:--:-- 4298k
Collecting pip
  Using cached pip-8.1.1-py2.py3-none-any.whl
Installing collected packages: pip
Successfully installed pip-8.1.1
```
pip バージョン確認：

```
$ pip -V
pip 8.1.1 from /path/to/python2.7/site-packages (python 2.7)
```

pip で requests をインストール：

```
$ pip install requests
Collecting requests
  Downloading requests-2.10.0-py2.py3-none-any.whl (506kB)
    100% |████████████████████████████████| 512kB 1.2MB/s
Installing collected packages: requests
Successfully installed requests-2.10.0
```

`/path/to/python2.7/site-packages` に requests がるか確認：

```
$ cd /path/to/python2.7/site-packages
$ ls | grep requests
requests
requests-2.10.0.dist-info
```


6\. `python slack.py` で実行