ベーコンナンバー 整理整頓
3月 21

以前ニコニコ動画をダウンロードするスクリプトを書いたけど、
あれは純粋に動画だけで、コメントがダウンロードできてない。

ということで、今度はコメントもダウンロードしてみる。

はじめにざっとニコニコ動画の仕様をおさらいすると、

  1. 動画画面へアクセスする(例えばhttp://www.nicovideo.jp/watch/sm2721967)
  2. Flashデータを取りにhttp://www.nicovideo.jp/api/getflv?v={動画ID}へアクセス(動画IDは1でいうsm2721967)
  3. 2のレスポンスで動画に関する様々なデータが返ってくる
  4. 3のレスポンスの中のurl=hogehogeへアクセスすると動画をダウンロードできる
だったけど、コメントはデータさらに2のレスポンスの中のms=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でニコニコ動画をダウンロードするスクリプトにコメントデータ取得部分を
追加しただけです。

それでは快適なニコニコライフを!

Leave a Reply