ニコニコダウンローダを作ってみた
id:rubycoさんのニコニコ動画のダウンローダを読んで驚いた。
nicovideoパッケージなんて便利なものあるんだ><
ということで、これを使わないで1から書いてみた。
動画のタイトルは出ないけど、突貫工事でやってみた。
でも、1つ使う上で面倒臭いこと1つ。
ログイン時に使用するSSL証明書を用意しないといけない。
方法は
アクセスしたいサイトをIEで表示して、鍵マークをクリックし証明書の表示をクリックします。
次に、証明書のパスのタブを開き、ツリーの一番上に表示されているアイコンをクリックし、証明書の表示をクリックします。
開いたウインドウの詳細の中のファイルにコピーをクリックしウイザードに従います。
エクスポート形式は、Base64 encoded X.509(.CER)を選択してエクスポートした物を使います。
ニコニコ動画の場合は
にアクセスした際のルート証明書でおk。
それを、nico.cerという名前で保存します。
まずはコード
7/17コードを若干変更(DL成功の可否と動画名を出すようにしました)
require 'net/https' require 'uri' require 'cgi' require 'yaml' require 'rubygems' require 'mechanize' $KCODE = 'UTF8' def getNicoTitle(videoId) agent = WWW::Mechanize.new agent.max_history = 1 agent.user_agent_alias = 'Windows IE 6' title = (agent.get("http://www.nicovideo.jp/watch/#{videoId}")/"/html/head/title").inner_text title.gsub("‐ニコニコ動画(夏)","") end def userInfo settings = YAML::load(File.open('nicoVideo.yaml')) @id = settings['id'] @pass = settings['pass'] end def downloadNicoVideo(videoID) begin https = Net::HTTP.new('secure.nicovideo.jp',443) https.use_ssl = true https.ca_file = './nico.cer' https.verify_mode = OpenSSL::SSL::VERIFY_PEER https.verify_depth = 5 https.start { |access| respons = access.post("/secure/login?site=niconico","next_url=&mail=#{@id}&password=#{@pass}") cookie1 = respons['Set-Cookie'] cookies = cookie1.scan(/user_session=user_session_[\w]+/) Net::HTTP.start('www.nicovideo.jp'){ |nico| videoID.each {|id| printf("%s\t%s\t",id,getNicoTitle(id)) respons = nico.get("/watch/#{id}","Cookie"=>cookies[0]) cookie2 = respons['Set-Cookie'].split(';')[0] respons2 = nico.get("/api/getflv?v=#{id}","Cookie"=>cookies[0]) api_res = CGI.unescape(respons2.body) thread_id = api_res.scan(/thread_id=\d+/) api_res.scan(/url=http:\/\/(.*)(\/smile\?(v|m|s)+=[\d\.]+)/) Net::HTTP.start($1){ |flv| video = flv.get($2,'Cookie'=>cookie2) File.open("#{id}.flv",'wb') do |f| f.write(video.body) end } puts "[OK]" sleep 3 } } } rescue => ex puts "[NG] #{ex}" end end def showUsage print "***** HELP *****\n" print "#ruby nicoDownLoader.rb smXXX smYYY\n" exit 0 end showUsage if ARGV.length == 0 userInfo downloadNicoVideo ARGV
nicoVideo.yamlというファイルを作って、メルアドとパスワードを書く。
id: MailAddress pass: PASSWORD
使い方は
ruby nicoDownLoad.rb smXXX smYYY
といった感じ。
いくつも連続で指定できます。
こんな感じですかね?
突貫工事で作ってみましたが、指摘などあったらコメントをお願いします。