ニートワークエンジニア

浪人、留年、休学、中退、ニート、エンジニア。回り道人生を謳歌中

AniTubeのダウンローダをPHPで作ってみる

ブラウザのアドオンを利用すれば簡単に動画をダウンロードできるんだけど、その為だけにブラウザを常駐させたりGUIにリソースを割くのがもったいないので、CUIのみで動作するプログラムを作ってみた。

動画ファイルのURLの見つけ方

まず動画ページに貼り付けられた動画ファイル(*.mp4)の在り処を突き止める必要がある。これにはブラウザの開発者ツールを活用する。

ChromeでもFirefoxでもどちらでも良いが、ファイル転送状況をモニタできるモードにしておく。その状態で動画ページを開く。

するとhtmlやjs、画像ファイルなどといったダウンロードされたファイルが一覧表示される。その中から動画ファイルを示す拡張子がmp4のファイルを探しだす。Firefoxの場合Mediaでフィルタすれば簡単に見つかる。

f:id:pacstrap:20150525150954p:plain

見つかった動画ファイルの欄をクリックするとリクエストの詳細情報が表示されるので動画ファイルのURLが判明する。

例えば、http://www.anitube.se/video/50855/Psycho-Pass-01 の場合、動画ファイルのURLが http://lax03.vid.anitu.be/c9dGyFLw6oPTG6N1LWpTeg/1432544647/50855.mp4 であることがわかる。

ただしこれは一時的なURLっぽいので、ある程度時間がたつとこのアドレスでは動画にアクセスできなくなる。

また毎回動画ページを開いてネットワークをキャプチャして…というのは面倒なので、出来れば動画ページのURLから直接動画ファイルのURLを関連付けたい。

動画ページのソースを確認

まずは動画ページのソース内に先ほど見つけた動画ファイルのURLが含まれていないか確認する。

もしHTMLファイルから直接呼びだされているのであれば簡単だが、今回の場合ソース自体にはmp4に関する記述がなかった。

おそらく、まずHTMLファイルがJSを呼び出し、Ajaxで何かしらのAPI的なものを叩いて動画ファイルのURLを取得、それをページ内に埋め込む、といった流れだろう。なので次はAPIを見つける必要がある。

APIっぽいリクエストを探す

開発者ツールでそれっぽいリクエストを探してみる。ImageやCSSを除外して探しているとconfig.php?key=*といういかにも怪しいリクエストが発見できた。

http://www.anitube.se/player/config.php?key=148aeb69d98605fb05b2

これにアクセスしてみると、案の定、動画に関する情報をJSとして返しているようだ。もちろん最初に見つけた動画ファイルURLもここに含まれていた。

ページのソースをもう一度確認してみると、このconfig.php?key=*を呼び出すブロックがあった。これで動画ページから動画ファイルを引っ張りだすロジックが判明できた。

適当にスクリプトを書く

f:id:pacstrap:20150525153705p:plain

ここまで来たらダウンローダは完成したようなものだ。

動画ページのソースから動画ファイルのURLを抜き出す為のマッチング処理などを関数化したりしてゴリゴリ書いていく。

あとは標準入力で動画ページのURLを入力し、そこからHTML、APIという2段階のHTTP処理を内部で行い、wgetなどの外部コマンドを使ってダウンロードを開始させるようなスクリプトを作ればよい。

他の動画サイトも同様にダウンロード可能

AniTubeに限らず、その他の動画サイトもmp4ファイルの在り処さえ掴めれば同じように意図的なダウンロードが可能だ。ニコ動のようにログイン処理が間に入るものは少し面倒ではあるが(ニコ動ダウンローダは1年前ぐらいに作った気がする)。

YouTubeは少し凝っている。PCサイトの方は数100kb程度の断片的なバイナリを返しながらブラウザで動画として表示させているっぽいので一括ダウンロードの方法はよくわからない。ただ、モバイル版(http://m.youtube.com/watch?v=*)の方は普通にmp4を返してくれるので、やはり今回書いた方法で直接ダウンロードできてしまう。

ストリーミングは合法でダウンロードは違法とか、アホらしいなって思う。受信しているってことは紛れもなくダウンロードだというのに。

まあそのうち正規ファイルを認証するための電子透かし技術とか、ネットワーク転送時にファイルを自動劣化させるシステムとかが実装されたら、著作物が垂れ流されている現状は変わりそうだ。

ちなみに僕の動画ファイルはtmpfs(ramdisk)上にあるからPC再起動で勝手に削除される。よってこれはダウンロードでは無くストリーミングですよ(白目)。