ニコニコ動画が倒せない(ブラウザ上でニコニコの動画にアクセスする)
2012年6月28日追記:7割方倒せました「ニコニコ動画のオレオレ外部プレイヤーの算段がついた」
ひょんなことからニコニコ動画の動画ファイルへアクセスするのが意外に簡単だと言うことがわかったので、ここ数日取り組んだことのご報告的ななにか。
やりたいこと「ニコニコ動画のオレオレ外部プレイヤーを作る」
欲しいものの仕様
- 実装はFlash
- ニコニコ動画の動画を再生出来ること ← 重要
- 再生、停止、一時停止、音量調整などの基本的な操作ができること
- JavaScriptから上記操作を制御出来ること
- 再生完了や音量の変化などのイベントをJavaScriptでフックできること
- 再生動画のIDをembedのparamやJavaScriptで指定できること
- 設置にscriptタグを必要としないこと
下の4つが公式外部プレイヤーではできないことが取り組んでみた動機である。
以下、ニコニコ動画の動画ファイルにアクセスする手順
- ニコニコ動画にログインする
- getflv APIで動画ファイルのURLを調べる ( http://flapi.nicovideo.jp/api/getflv/sm9 )
- ニコニコ動画のwatchページにアクセスする ( http://www.nicovideo.jp/watch/sm9 )
- 動画ファイルのURLにアクセスする
なんで手順3が必要かというと、動画ファイルへの要求でCookieを見ているかららしい。nicohistoryというクッキーを見ているらしい(Refererを見ていると言っているページもあるけど、動画ファイルのURLに直にアクセスして取得出来るので違うと思う)。
nicohistoryのクッキーはwatchページ、あるいは公式外部プレイヤーで使っているthumb_watchにアクセスすることでもらえる(スマートホン向けのページあたりは未調査)。
結論から言うと、FlashにせよJavaScriptにせよオレオレ外部プレイヤーを作ることはできない。nicohistory Cookieをもらう手段がない。FlashのLoaderはcrossdomain.xmlで弾かれる。JavaScriptのXMLHttpLoaderはaccess-control-allow-originヘッダで弾かれる。Flashは要求リソースにアクセスする前にエラーになるんだけど、JavaScriptはとりあえずリソースは持ってくるのでSet-Cookie通るかな(レスポンスボディはいらない)と思ったんだが、そもそもログインクッキーを送ってくれない。
iOS版のプレイヤーの通信を見てみると何かわかるかも知れない。proxy立てるのが面倒なのでやるのはもうちょっと後だろうけど。ただ根本的な問題はFlash / JavaScriptのクロスドメインの制限なのであまり期待しない。
たぶんニコニコ動画は倒せない。ということで、出来ないものは出来ないと諦めてさっさと次にいこう。
余談
getflvからの動画取得ってみんなダウンローダー的なところを目的として調査しているみたいで、突っ込んだところを解析していないねぇ・・・という感じ。