これまでの各記事は、以下から。
- ニコニコ動画のダウンロードツールをRubyで書いてみた。(その1) - いものやま。
- ニコニコ動画のダウンロードツールをRubyで書いてみた。(その2) - いものやま。
- ニコニコ動画のダウンロードツールをRubyで書いてみた。(その3) - いものやま。
- ニコニコ動画のダウンロードツールをRubyで書いてみた。(その4) - いものやま。
- ニコニコ動画のダウンロードツールをRubyで書いてみた。(その5) - いものやま。
これまでの内容を踏まえ、ちょっと整理したコードが以下。
元のNicovideo Downloaderを参考に、ダウンロードの進捗具合が分かるようになってる。
ニコニコ動画から動画をダウンロードする手順まとめ
以下のような流れで動画のダウンロードを行う。
- ログイン。
- 動画のURLにアクセス。
- 動画情報のURLにアクセス。
- 動画の実際のURLにアクセス。
1. ログイン
ログインするには、https://secure.nicovideo.jp/secure/login?site=niconico
へアクセスし、以下のデータをPOSTメソッドで送信する。
(ACCOUNTはニコニコのアカウント、PASSWORDはパスワード)
current_form=login&mail=ACCOUNT&password=PASSWORD&login_submit=Log+In
そうすると"user_session"というキーのCookieが返ってくるので、その中で値が"deleted"でないものを保持する。
以降、HTTPリクエストを送るときに、このCookieも送るようにする。
2. 動画のURLにアクセス
ダウンロードしたい動画のURLにアクセスする。
このとき、"nicohistory"というキーのCookieが返ってくるので、これを保持する。
以降、HTTPリクエストを送るときに、このCookieも送るようにする。
3. 動画情報のURLにアクセス
http://www.nicovideo.jp/api/getflv?v=VIDEO_ID&as3=1
にアクセスし、動画情報を取得する。
(VIDEO_IDは、動画のID)
動画情報はCGIのクエリの形式で返ってくるので、デコードして読み取る。
動画の実際のURLは、'url'というフィールドに入っているので、それを取得する。
URLのスキームがRTMPEの場合、'fmst'というフィールドの値も必要になるので、それも保持しておく。
(この値はコロンで区切られていて、コロンの左側の値をfmst2、コロンの右側の値をfmst1としておく)
4. 動画の実際のURLにアクセス
動画の実際のURLにアクセスして、データをダウンロード、ファイルに書き出す。
このとき、スキームがRTMPEの場合には、rtmpdumpを使用するといい。
rtmpdumpの実行例は、以下。
$ rtmpdump \ -q \ -e \ -r (動画の実際のURLの、クエリ以外の部分) \ -t (同上) \ -p (ダウンロードしたい動画のURL) \ -y (動画の実際のURLの、クエリのKEY=VALUEのVALUEの部分) \ -C S:(fmst1) \ -C S:(fmst2) \ -C S:(動画の実際のURLの、クエリのKEY=VALUEのVALUEの部分) \ -o (出力先のファイル名)
Ruby Tips
.netrcの情報を読み出す
netrcというgemを使うといい。
GitHub - heroku/netrc: Reads and writes netrc files.
HTTP/HTTPSで通信を行う
標準添付ライブラリのnet/http、net/httpsを使う。
Net::HTTPのインスタンスを作成し、getメソッドやpostメソッドを使うことで、HTTPリクエストを送ることが出来る。
これらはNet::HTTPResponseのインスタンスを返すので、そこから情報を取得する。
レスポンスのボディを少しずつ読みだしたい場合には、getのかわりにrequest_getメソッドをブロック付きで呼び出す。
Cookieの送受信
サーバからのCookieは、HTTPヘッダの'Set-Cookie'というフィールドに入っている。
これは、Net::HTTPHeader#get_fieldsなどで取得できる。(Net::HTTPResponseはNet::HTTPHeaderをincludeしている)
サーバへCookieを送るときは、HTTPヘッダの'Cookie'というフィールドで送る。
今日はここまで!