3 月 21
以前ニコニコ動画をダウンロードするスクリプトを書いたけど、
あれは純粋に動画だけで、コメントがダウンロードできてない。
ということで、今度はコメントもダウンロードしてみる。
はじめにざっとニコニコ動画の仕様をおさらいすると、
- 動画画面へアクセスする(例えばhttp://www.nicovideo.jp/watch/sm2721967)
- Flashデータを取りにhttp://www.nicovideo.jp/api/getflv?v={動画ID}へアクセス(動画IDは1でいうsm2721967)
- 2のレスポンスで動画に関する様々なデータが返ってくる
- 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位のニコニコ動画のコメントを取得するスクリプトはこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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(/smd+$/).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 = "<thread user_id="#{hash['user_id']}" res_from="-500" version="20061206" thread="#{hash['thread_id']}" />" 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でニコニコ動画をダウンロードするスクリプトにコメントデータ取得部分を
追加しただけです。
それでは快適なニコニコライフを!
5 月 6th, 2009 at 15:46:06
[...] 基本的に昔書いたrubyでニコニコ動画のコメントを取得するスクリプトと内容は同じ。 [...]