以前ニコニコ動画をダウンロードするスクリプトを書いたけど、
あれは純粋に動画だけで、コメントがダウンロードできてない。
ということで、今度はコメントもダウンロードしてみる。
はじめにざっとニコニコ動画の仕様をおさらいすると、
- 動画画面へアクセスする(例えばhttp://www.nicovideo.jp/watch/sm2721967)
- Flashデータを取りにhttp://www.nicovideo.jp/api/getflv?v={動画ID}へアクセス(動画IDは1でいうsm2721967)
- 2のレスポンスで動画に関する様々なデータが返ってくる
- 3のレスポンスの中のurl=hogehogeへアクセスすると動画をダウンロードできる
ただしアクセスする際は
<thread user_id=”{user_id}” res_from=”{取得コメント数}” version=”20061206″ thread=”{thread_id}” />
をポストしてやる必要がある。
user_idはニコニコ画面上でも確認できるuser_idのこと。一応2のレスポンスに含まれてるので、それを使えばいい。
上の取得コメント数はres_from=”-500″とすると500件分のコメントがダウンロードできる。
thread_idは2のレスポンスデータに含まれているthread_idをセット。
ということで、当日ランキング1位のニコニコ動画のコメントを取得するスクリプトはこんな感じ。
require ‘rubygems’
require ‘mechanize’
require ‘kconv’
require ‘cgi’
agent = WWW::Mechanize.new
#ログインする
agent.post(’https://secure.nicovideo.jp/secure/login?site=niconico’,
‘mail’ => ‘メールアドレス’,'password’ => ‘パスワード’)
#ランキングページから1位の動画ページへ遷移
ranking_page = agent.get(’http://www.nicovideo.jp/ranking/mylist/daily/all’)
video_link = (ranking_page.parser/”a.video”).first
video_id = video_link[”href”].scan(/sm\d+$/).first
agent.get(video_link[”href”])
#動画URLの取得
content = agent.get(’http://www.nicovideo.jp/api/getflv?v=’ + video_id)
hash = Hash.new
content.body.scan(/([^&]+)=([^&]*)/).each {|v| hash[v[0]] = v[1]}
video_url = CGI.unescape(hash[’url’])
#動画ファイルダウンロード
open(video_id+’.flv’,'wb’){|f| f.print agent.get_file(video_url)}
#コメントデータ取得
comment_host, path = %r{http://([\w\.]+)(.*)}.match(CGI.unescape(hash[’ms’])).to_a.values_at(1,2)
post_data = “”
comment = Net::HTTP.start(comment_host,80){|http|
res = http.post(path,post_data)
res.body
}
open(video_id+’_comment.xml’,'wb’){|f| f.print comment}
基本的にrubyでニコニコ動画をダウンロードするスクリプトにコメントデータ取得部分を
追加しただけです。
それでは快適なニコニコライフを!