LoginSignup
68
68

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-03-12

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

動画の保存場所の入手

動画の保存場所を入手する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に変えてねっ、

68
68
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
68
68