sironekotoroの日記

Perl で楽をしたい

Perl で Chatwork API を使って添付ファイルをダウンロードする

チャットツール変更

お仕事で使うチャットツールを Chatwork から Slack に変更することになりました。

ユーザーも作り、運用ルールはメルカリさんの物をちょっと変えて・・・メルカリさんありがとうございます。

mercan.mercari.com

さて、これでめでたしめでたし。

で・・・終わることもなく。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 の概要はここです。

developer.chatwork.com

これを見ると、ダウンロードしたいファイルの room_idfile_id がわかればいけそう。

ただし、この API でできるのはダウンロードするリンクを生成するまで。そのダウンロードリンクの制限時間 30 秒というちょっと捻った感じです。

ということで、files1.csv から ダウンロードリンク を抜き出し、そのリンクから room_idfile_id を抽出。

それをもとに URL を組み立てて、API にアクセス、返ってきたダウンロードリンクからダウンロードします。

API の利用制限は 5 分で 300 回、1 秒に 1 回ですね・・・ってことで、ダウンロードごとに 1 秒の sleep 入れると良さそうです。

モジュールにしたものの

この勢いで Chatwork の API 網羅するモジュール作ったろ!って思ったのですが、自分がエンタープライズプランの管理者でいられる時間は短く、あと 1 ヶ月未満です。

だって Chatwork を解約前提なのだもの・・・

ということで、モジュールは作ってみたものの、自分が使う最低限だけ実装したのでした。

github.com

もっと早く管理者権限を手にしていればなー、と思ったのでした。