Perl で Chatwork API を使って添付ファイルをダウンロードする
チャットツール変更
お仕事で使うチャットツールを Chatwork から Slack に変更することになりました。
ユーザーも作り、運用ルールはメルカリさんの物をちょっと変えて・・・メルカリさんありがとうございます。
さて、これでめでたしめでたし。
で・・・終わることもなく。Chatwork のログの抽出を行うことになりました。
いろいろな手段があり、いろいろと情報もあります。スクレイピングツールとか、Ruby の Gem とか。
が、今回は正攻法で Chatwork のプランをエンタープライズプランに変更した上でログのエクスポートを行いました。
やはり、正攻法ならではの安心感がありますね。
エンタープライズプランにするにあたって最低限の課金にするため、必要最低限のメンバー以外は一気に退会させました。
あれ?添付ファイルは・・・?
エンタープライズプランの管理者(1名)は、メニューからログのエクスポートが可能です。
翌朝、ダウンロードリンクが記されたメールが届きます。早速ダウンロード・・・あれ?圧縮済みとはいえ全ログのサイズが 10MB 以下?
そう、Chatwork のログエクスポートは csv ファイルのみ。添付ファイルはダウンロードリンクが files1.csv ってな csv ファイルにまとめられています。
面倒くさいことは Perl で
この files1.csv に記載されている 内容 はこんな感じです。
アップロード日時 ルームID ルーム名 アカウントID アカウント名 ファイル名 ダウンロードURL ファイルサイズ
肝心のダウンロード URL はこんな感じ
https://www.chatwork.com/service/packages/chatwork/subpackages/archive/download_file.php?fid=?????????
なお、ファイルサイズはテキストで 18.70 KB とか 3.27 MB って文字列で書いてあるので、サイズの比較できないですね・・・
このダウンロードリンクからダウンロードできるのはエンタープライズプランの管理者(1名)のみです。
え
これをフォルダに分けつつ、心を込めて 1 つ 1 つ保存していくの? 無理無理ー
添付ファイル保存依頼のものだけで 10000 ファイルを超えます。 人力では絶対無理ー
ここはダウンローダーで一気に処理でしょ!と思うも、このダウンロードのパスにどうエンタープライズプランの管理者(1名)の認証情報を加えればいいかわかりません。
basic 認証、ってこともないはずですが、ダメ元でやってダメでした。
Perl のモジュールで Chatwork 扱えないかなぁ、と思ったものの、API のバージョンが古いものしかないみたいです。残念。
ってことで、モジュール作ることにしました。
API の概要はここです。
これを見ると、ダウンロードしたいファイルの room_id
と file_id
がわかればいけそう。
ただし、この API でできるのはダウンロードするリンクを生成するまで。そのダウンロードリンクの制限時間 30 秒というちょっと捻った感じです。
ということで、files1.csv から ダウンロードリンク を抜き出し、そのリンクから room_id
と file_id
を抽出。
それをもとに URL を組み立てて、API にアクセス、返ってきたダウンロードリンクからダウンロードします。
API の利用制限は 5 分で 300 回、1 秒に 1 回ですね・・・ってことで、ダウンロードごとに 1 秒の sleep
入れると良さそうです。
モジュールにしたものの
この勢いで Chatwork の API 網羅するモジュール作ったろ!って思ったのですが、自分がエンタープライズプランの管理者でいられる時間は短く、あと 1 ヶ月未満です。
だって Chatwork を解約前提なのだもの・・・
ということで、モジュールは作ってみたものの、自分が使う最低限だけ実装したのでした。
もっと早く管理者権限を手にしていればなー、と思ったのでした。