いものやま。

雑多な知識の寄せ集め

ニコニコ動画のダウンロードツールをRubyで書いてみた。(まとめ)

これまでの各記事は、以下から。

これまでの内容を踏まえ、ちょっと整理したコードが以下。
元のNicovideo Downloaderを参考に、ダウンロードの進捗具合が分かるようになってる。

ニコニコ動画から動画をダウンロードする手順まとめ

以下のような流れで動画のダウンロードを行う。

  1. ログイン。
  2. 動画のURLにアクセス。
  3. 動画情報のURLにアクセス。
  4. 動画の実際の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'というフィールドで送る。

今日はここまで!