プログラマ4級【Sum Strings as Numbers (文字列を数値として加算)】このプログラミング問題があなたに解けるでしょうか!!

はじめに

raspberry piでslack botを遊んでいるとslackに写真や動画のファイルをアップしすぎて大変なことに。。。
必要のないファイルを削除しようと思ったのですが、slackでファイルを削除しようと思うと、ファイル1個1個選択して削除するという大変面倒くさいインターフェース。
そういえば、会社で使っている時もファイル整理しようと思って一気に削除する方法が分からなくて困った記憶が。。。
どうにも方法がなさそうなので、slack api使ってやればいいじゃないかと。

必要なもの

今回の方法はphpのスクリプトなので、phpが動く環境が必要です。うちのパソコンはMacなので、さくっと動きました。

slack apiを使うための準備

slack apiを使うためには準備が必要です。
要するにslack apiにアクセスするためのtokenが必要なので、これを発行する必要があります。
以下に @ykhirao さんが丁寧にまとめてくれてますので、そちらを参照して下さい。

# はじめに 以前[Slack APIのTokenの取得・場所](http://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb)という記

注意
今回は、ファイル一覧とファイル削除のAPIを使用します。
2. スコープ設定 で設定するスコープは以下のように「files:read」と「files:write:user」の2つを追加して下さい。
scope.png
ちなみにscopeを変更した時にはアプリの再インストールが必要になるので注意が必要です。

無事にアプリをインストールできたらtokenを取得します。tokenを忘れたときの取得方法も @ykhirao さんが丁寧にまとめてくれてますので、そちらを参照して下さい。

# はじめに 以前[Slack APIのTokenの取得・場所](http://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb)という記

PHPスクリプト

phpのcurl(Client URL Library)を使用してWeb apiを呼び出します。
phpのcurlでjsonをpostする方法は、以下のサイトのスクリプトを利用して修正させて頂きました。

(この記事は以前に http://nanatomo.com/program/792 で公開されていたものです。)PHPで別のHTTPサーバにPOSTメソッドでデータを送信する場合、
slack apiでは、「charset=utf-8」を設定しないと怒られます。
$token には前述のslack apiのtokenを設定します。
$count には1回で削除するファイルの上限を設定します。

delete_slack_files.php
<?php
$token ='xoxp-XXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$count = 100;
# このスクリプトはファイル一覧で取得出来たファイルをすべて削除します。
# 特定のchannelやファイル種別で絞り込むにはオプションを追加してください。
# 以下のAPIリファレンスを参照願います。
# https://api.slack.com/methods/files.list
# 例:channel IDのファイルを取得
# $op ='token=' . $token . "&count=$count" . "&channel=ABCDEF";
$op ='token=' . $token . "&count=$count";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://slack.com/api/files.list?'.$op);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
$result = json_decode($response, true);
$n = $result['paging']['total'];
curl_close($curl);
$files = $result['files'];

# https://slack.com/api/files.list で取得したファイルを削除します。
$json_data = array('file' => 'XXX');
$i = 0;
foreach ($files as $file) {
  echo $file['id'].":".$file['name'];
  $json_data['file'] = $file['id'];
  $data = json_encode($json_data);
  $ret = postFromHTTP('https://slack.com/api/files.delete',$data,$token);
  if($ret['ok']){ echo ' Delete!';}
  else { echo ' ERROR.';}
  echo "n";
  $i++;
}
echo "$n files found.n";
echo "delete $i files.n";


function postFromHTTP($url, $data, $token) {
    $options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_AUTOREFERER => true,
    );
    $authorization = "Authorization: Bearer ".$token;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER,
    array('Content-Type: application/json; charset=utf-8' , $authorization ));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_VERBOSE, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);
    curl_close($ch);
    $ret = json_decode($result, true);
    return $ret;
}
?>

これでサクサクとファイルを削除できるのでslackの容量を気にせずに色々できるようになります。
なお、web apiの結果が反映されるのには多少タイムラグがあるみたいで、大量にファイル削除していたら結果が反映されるのに数秒かかりました。ファイルは削除済みなのに、ファイル一覧は取得できる状態になりました。そのため、上記のスクリプトを連続して使用すると思ったようにファイルが削除されないことがあります。連続して使用する時には数秒待ってから実行するようにしてください。

  • コメント

    1. 匿名希望
      2018/01/20(土) 02:13:40

      もうそろそろ、最下級プログラマの職はAIになるって父が言ってた

    記事に戻る

関連記事