Perlでニコニコ動画のflvとコメントxmlをダウンロードする (Yusukebe::Tech)
perl - 勝手に添削 - ニコニコ動画ダウンローダー (404 Blog Not Found)
と言う訳でRubyの勉強のためにネタをパクってきました。ソースは以下。
#!/usr/bin/env ruby -Ku使い方としては、要mechanizeで、
require 'yaml'
require 'rubygems'
require 'mechanize'
require 'cgi'video_id = ARGV.first.scan(/sm\d+$/).first
agent = WWW::Mechanize.new
agent.post('http://www.nicovideo.jp/login', YAML.load_file('nico.yaml'))agent.get_file('http://www.nicovideo.jp/watch/' + video_id)
content = agent.get_file('http://www.nicovideo.jp/api/getflv?v=' + video_id)
params = content.scan(/([^&]+)=([^&]*)/).inject({}){|h, v| h[v[0]] = v[1]; h}
video_url = CGI.unescape(params['url'])puts "downloading url : " + video_url
video_file = open(video_id + '.flv', 'w')
video_file.print agent.get_file(video_url)
video_file.close
% sudo gem install mechanizeした後、
-をnico.yamlに保存して、
- your@mail.jp
-
- password
- yourpass
% ruby nicodown.rb sm673443な感じ。
% ruby nicodown.rb http://www.nicovideo.jp/watch/sm673443もok。
以下思った点。
1) mechanizeをログイン状態の保持だけに使うのは、狐狩りにミサイル持ってくるようなもんだと思うんだけど、何が適当なんだろ。
2) mechanizeでpostの引数がArray of Arrayなのが気持ち悪い。
3) まだ全然よく分かってない(ファイルの書き出しが分からなくてリファレンス引いたww)
まあでも2ヶ月でFizzBuzzが書けないよレベルからニコ動落とせるよレベルになれて嬉しい。あんまり変わってない気もするけど。
(訂正)
あっ、postの引数はHashでも行けた。すみません。
コメント (6)
Win32環境でMechanizeをインストールして試しましたが駄目でした。ので報告まで
C:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.6.10/lib/mechanize/inspect.rb:44: undefined method `pretty_inspect' for lass `WWW::Mechanize::Page' (NameError)
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21:in `require'
from C:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.6.10/lib/mechanize.rb:42
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from C:/nikovideo.rb:5
投稿者: 匿名 | 2007年09月03日 17:30
おろ、ありがとうございます。
こちらの環境はOS Xでした。
投稿者: negipo | 2007年09月03日 19:11
すみません。上記はrubyのバージョンが1.8.4だったのが原因なようです。
最新のものに入れ替えたところ、pretty_inspectのエラーは解消しました。
現状はNotFound (WWW::Mechanize::ResponseCodeError)
で止まってます。
投稿者: 匿名 | 2007年09月06日 02:21
ニコ動の仕様が変わってるみたいなのでもう少し自分で試してから報告しますね…OTL
投稿者: 匿名 | 2007年09月06日 02:40
win32で動きました。変更部分は2点
>agent.post('https://www.nicovideo.jp/login', YAML.load_file('nico.yaml'))
>video_file = open(video_id + '.flv', 'wb')
お目汚し失礼しました(^^;
投稿者: 匿名 | 2007年09月06日 05:42
ありがとうございます :D
実は自宅のネットが止まってるので、全然ホリデープログラミング出来てないんですよ。
そのうち新認証対応版書いたり、なんか変なの作る時に参考にさせていただきます。
投稿者: negipo | 2007年09月06日 20:15