正月休みのヒマにまかせてGoogle Chrome拡張機能とPHPで下らないバッチ処理の開発

正月連休のヒマな時間に、非常にくだらないことに時間をかけたけれど、これもすべて、今後余計な時間をかけずにすむようにするため。

中国上海のAKB48姉妹グループ、SNH48の中国ツイッター(新浪微博)にある全SNH48メンバーの全ツイートから、画像ファイルだけをローカルディスクにダウンロードするプログラム作成。

何が面倒かというと、新浪微博はまともなプログラムで画像ファイルをダウンロードしようとするとWeb APIを利用してOAuthでユーザ認証する必要があるのだが、そもそもAPIの利用申請の審査を通してくれない。

なので今まではやむを得ずVisual Studio 2015の無償のCommunity Editionで、Web Browserコントロールを埋め込んだMDIアプリを作って、埋め込みWebブラウザで手動で認証を済ませるという方法をとっていた。

その上で、新浪微博の画像アルバムページが内部的にWebブラウザに返しているJSONファイルの、アカウントごとのURLの生成規則を解析済みだったので、SNH48各メンバーの新浪微博のユーザIDからJSONファイルのURLをまず生成する。

そしてクライアント側でJSONファイルを開くデフォルト・アプリケーションをInternet Explorerに変更し、JSONファイルをVB.NETのWeb Browserコントロールで開くようにした上で、JSONファイルをVB.NETで解析し、個々の画像ファイルのURLをJSONファイル内のデータから生成する。

ここまでやってようやく、認証なしで新浪微博のWebサーバから画像ファイルを直接ダウンロードできるようになる。

ここまでの処理を単一のWindows用MDIアプリケーションで開発していたので、比較的効率よく無人ダウンロードできていた。

ところが年末に何かのアプリケーションをインストールしたこと、あるいはWindows 10の何かの更新モジュールが原因で、このVB.NETアプリケーションに埋め込まれたWeb Browserコンポーネントが、Adobe Flash Playerをロードしたとたんにクラッシュするようになった。

新浪微博のトップページにFlashがあるのはどうしようもないので、画像ダウンロードの自動化が不可能になり、困ってしまった。

とにかくOAuth認証を回避できる方法はないかといろいろ考えた結果、Google Chromeの拡張機能で実現することにした。こんどは使用する言語がVB.NETからJavaScriptとjQueryになる。

こちらはJSONファイルのダウンロードから解析まで、意外にあまり手間をかけずに拡張機能として完成させることができた。最初からこの方法にしておけばよかった。

しかしGoogle Chrome拡張機能はセキュリティ上の制限で、ローカルディスクにファイルを書き込むことができない。本当は画像ファイルをダウンロードする処理まで拡張機能で自動化したかったが、不可能なので仕方ない。

なのでGoogle Chromeのデバッグコンソールに、拡張機能からログをCSV形式でログを書き出すことにした。

全メンバー分の全画像への直接リンクURLと、ローカルディスクに保存するときのファイル名を、コンソールログにCSV形式で書き出し、拡張機能のバッチ処理(拡張機能をバッチ処理で使うなんてほとんどないと思うけれど)が完了した後、コンソールログをローカルディスクに保存する。

ここからは今度はPHPを使って、このコンソールログを1行ずつ解析しつつ、じっさいに画像をダウンロードして、ローカルディスクに所定のファイル名で書き込むバッチ処理を書く。

以上で、途中、Google Chromeのコンソールログを保存するところだけ手動になるが、その他は全自動。しかもすべてGUIなしの処理なので、VB.NETアプリケーションよりもはるかに高速。

過去数か月分の画層ファイルのダウンロードで比較すると、少なくとも20倍以上は高速化した。

おかげでダウンロード後の画像ファイルから、本当にそのメンバーが写っている写真をより分けて、ブログにアップロードする最後の純粋な手作業部分が、まったく追いつかなくなってしまった。

PHPで手軽に使える顔認識APIがあるといいのだが。そうすれば少なくとも人間の顔が写っていない画像はあらかじめ排除できるので。

こういう下らないことをネタにして、はじめていろんな言語の勉強になったりするので、下らない趣味を持つことも悪くない。