ニコニコ動画の動画をダウンロード

  • 69
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

ニコニコ動画の動画をダウンロードするコードを書いたので説明

動画の保存場所の入手

動画の保存場所を入手するgetflvというAPIがあります
http://flapi.nicovideo.jp/api/getflv/sm#{id}
ニコニコ動画のAPIを使う準備としてとりあえず、ニコニコ動画にログインする
ログインをしてるCookieとその動画へのアクセスが無いと動画などを保存しているURLなどを返してくれない
楽がしたいのでとりあえずmechanize

require 'rubygems'
require 'mechanize'

mail = "ニコニコ動画に登録してるメールアドレス"
pass = "ニコニコ動画に登録しているパスワード"
agent = Mechanize.new;
agent.post("https://secure.nicovideo.jp/secure/login?site=niconico","mail"=>mail,"password"=>pass);
agent.get("http://www.nicovideo.jp/watch/sm#{id}");

あとはgetflvにアクセスすると動画の保存されてるURLを教えてくれる

moviedate = agent.get("http://www.nicovideo.jp/api/getflv?v=sm#{id}");

そうすると

thread_id=1173108780&l=319&url=http%3A%2F%2Fsmile-com42.nicovideo.jp%2Fsmile%3Fv%3D9.0468&link=http%3A%2F%2Fwww.smilevideo.jp%2Fview%2F9%2F16899326&ms=http%3A%2F%2Fmsg.nicovideo.jp%2F10%2Fapi%2F&ms_sub=http%3A%2F%2Fsub.msg.nicovideo.jp%2F10%2Fapi%2F&user_id=16899326&is_premium=0&nickname=%E3%81%8D%E3%81%BF%E3%81%A8%E3%81%BC%E3%81%8F%E3%81%AE%E4%B8%83%E6%97%A5%E9%96%93&time=1363070293743&done=true&hms=hiroba01.nicovideo.jp&hmsp=2527&hmst=1000000003&hmstk=1363070353.H4EKrVgto621n76tb4IRpYJ7h_0&rpu=%7B%22count%22%3A1886330%2C%22users%22%3A%5B%22%5Cu30e9%5Cu30b9%5Cu30af%22%2C%22huto%22%2C%22EX%5Cu3059%5Cu305a%5Cu304d%22%2C%22%5Cu30d2%5Cu30ed%22%2C%22%5Cu3044%5Cu3061%5Cu3054%22%2C%22yamasan%22%2C%22%5Cu30a8%5Cu30fc%5Cu30b9%22%2C%22%5Cu672a%5Cu7d17%22%2C%22%5Cu30bb%5Cu30c3%5Cu30ad%5Cu30fc%22%2C%22Wen+Chi%22%2C%22%5Cu3068%5Cu3089%5Cu3053%22%2C%22%5Cu5bdd%5Cu5e8a%22%2C%22dieu%22%2C%22%5Cu304d%5Cu306e%5Cu3053%22%2C%22%5Cu30c1%5Cu30e3%5Cu30d4%5Cu30bf%5Cu30f3%22%2C%22%5Cu3082%5Cu3049%5Cu3061%5Cu3083%5Cu3093%22%2C%22%5Cu86ed%5Cu5b50%28%5Cu30d2%5Cu30eb%5Cu30b3%29%22%2C%22kai%22%2C%22abe%22%2C%22%5Cu304e%5Cu308b%5Cu3055%5Cu3093%5Cu2462%22%5D%2C%22extra%22%3A9%7D

みたいな感じの物が返ってくるのでその中から正規表現で=となっている物を取り出せば良いのでscanコマンドで頑張ってみる
この返ってくる文字列は&で区切られてるのでそれで頑張る、RublarっていうRubyの正規表現が試せるページがあるのでこれで試行錯誤しながらがんばったら

map = {};
moviedate.body.scan(/([^&]+)=([^&]*)/).each do |i|
  map[i[0]] = i[1];
end

みたいな感じになるのでそれをmapに保管しとく

動画のファイル形式を入手

あとは、この保存するファイルの形式の所得をして保存するだけ
動画の形式を知るのはgetthumbinfoっていうAPIを使う
http://ext.nicovideo.jp/api/getthumbinfo/sm#{id}

require 'open-uri'
require 'rexml/document'

doc = REXML::Document.new(open("http://ext.nicovideo.jp/api/getthumbinfo/sm#{id}"));
filetype = doc.elements['nicovideo_thumb_response/thumb/movie_type'].text.to_s;

動画の保存

require 'cgi'

title = doc.elements['nicovideo_thumb_response/thumb/title'].text.to_s
open("#{title}.#{filetype}","wb") do |i|
  i.print agent.get_file(CGI::unescape(map["url"]));
end

cgiはmapに入れられたurlの文字列がURLエンコードされているのをデコードしてる
これでニコニコ動画の動画が保存出来たよ,
動画のIDは保存したい動画のIDに変えてねっ、