ニコニコ動画がYouTubeからアクセス禁止を受けて一時閉鎖した際、 YouTubeからどうやって動画を取得していたかが少し話題になりました。

YouTubeAPIには、Flashの動画形式であるflvファイルのパスそのものは記述されていない ため、おそらくいったんページのHTMLを取得して、そこからflvのパスを 取得していると考えられます。

サンプルソースを書いてみました。

var _this=this; var _lv:LoadVars=new LoadVars(); var url="http://www.youtube.com/watch?v=DQoh5DsLJvc"; _lv.sendAndLoad( url, _lv , "POST" ); _lv.onData=function( _str ){     _this.parseHTML( _str ); } function parseHTML( _str ){     var targetLine:String=     _str.substring(_str.indexOf("player2.swf"), _str.indexOf("\", \"movie_player") );     var vID=targetLine.substring( targetLine.indexOf("video_id=")+9, targetLine.indexOf("&l="));     var after_t=targetLine.substring( targetLine.indexOf("&t=")+3);     var t;     if( after_t.indexOf("&")!=-1 ){         t=after_t.substring( 0, after_t.indexOf("&"));     }else{         t=after_t;     }     this._nowFlvPath="http://youtube.com/get_video.php?video_id="+vID+"&l&t="+t; trace("this._nowFlvPath="+this._nowFlvPath); }

パブリッシュしたところ、YouTubeのFLV動画が直接取得できました。 しかしアクセスし過ぎると、YouTubeに弾かれる恐れがあるので、 実行される方は確認程度にとどめてください。

現在は、ニコニコ動画自体からflvファイルを取得することができます。 例えば、下記のビデオの場合。

http://www.nicovideo.jp/watch/sm191763

動画IDである「sm191763」を、下記APIにパラメーターとして付与します。

http://www.nicovideo.jp/getflv?v=sm191763

すると、下記の返り値が取得できます。(user_idとnicknameは仮です。)

thread_id=1177422773& l=270& cms=SMILEVIDEO& url=http%3A%2F%2Fs-clb4.smilevideo.jp%2Fsmile%3Fv%3D191763.75663& link=http%3A%2F%2Fwww.smilevideo.jp%2Fview%3Fvideo_id%3D191763& ms=http%3A%2F%2Fmsg22.nicovideo.jp%2Fapi%2F& user_id=xxxxxx& nickname=xxxxxxx& done=true

URLデコードしてみました。

thread_id=1177422773& l=270& cms=SMILEVIDEO& url=http://s-clb4.smilevideo.jp/smile?v=191763.75663& link=http://www.smilevideo.jp/view?video_id=191763& ms=http://msg22.nicovideo.jp/api/& user_id=xxxxxx& nickname=xxxxxxx& done=true

上記のurlパラメータの値がニコニコ動画のFLV本体です。

試しにダウンロードするプログラムをFlashによるexe形式で作成しました。 ただし現在のニコニコ動画はクローズドサービスなので、あらかじめログイン している必要があります。

ニコニコ動画ダウンローダー(DownLoad)

なお、上記プログラムは、参照先のプログラムが変更された場合、使用できなくなる可能性がございます。あらかじめご了承ください。また、コメントはFLVファイル外のデータなので、ダウンロードされるのは動画データのみになります。

HTML5飯