まめ畑

ゆるゆると書いていきます

ニコニコダウンローダを作ってみた

id:rubycoさんのニコニコ動画のダウンローダを読んで驚いた。
nicovideoパッケージなんて便利なものあるんだ><


ということで、これを使わないで1から書いてみた。
動画のタイトルは出ないけど、突貫工事でやってみた。
でも、1つ使う上で面倒臭いこと1つ。
ログイン時に使用するSSL証明書を用意しないといけない。

方法は

アクセスしたいサイトをIEで表示して、鍵マークをクリックし証明書の表示をクリックします。
次に、証明書のパスのタブを開き、ツリーの一番上に表示されているアイコンをクリックし、証明書の表示をクリックします。
開いたウインドウの詳細の中のファイルにコピーをクリックしウイザードに従います。
エクスポート形式は、Base64 encoded X.509(.CER)を選択してエクスポートした物を使います。


ニコニコ動画の場合は

https://secure.nicovideo.jp/

にアクセスした際のルート証明書でお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

といった感じ。
いくつも連続で指定できます。


こんな感じですかね?
突貫工事で作ってみましたが、指摘などあったらコメントをお願いします。


しっかし、相変わらずRubySSLは使いにくい。