« Hash.newよくわかんね | main | きょうじんAPI »

mechanize.rbでニコニコ動画のflvをダウンロード

Perlでニコニコ動画のflvとコメントxmlをダウンロードする (Yusukebe::Tech)
perl - 勝手に添削 - ニコニコ動画ダウンローダー (404 Blog Not Found)

と言う訳でRubyの勉強のためにネタをパクってきました。ソースは以下。

#!/usr/bin/env ruby -Ku
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

使い方としては、要mechanizeで、
% sudo gem install mechanize
した後、
- 
- mail
- your@mail.jp
-
- password
- yourpass
をnico.yamlに保存して、
% 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でも行けた。すみません。

トラックバック

このエントリーのトラックバックURL:
http://polog.org/mt-tb.cgi/383

コメント (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

おろ、ありがとうございます。
こちらの環境はOS Xでした。

すみません。上記はrubyのバージョンが1.8.4だったのが原因なようです。
最新のものに入れ替えたところ、pretty_inspectのエラーは解消しました。
現状はNotFound (WWW::Mechanize::ResponseCodeError)
で止まってます。

ニコ動の仕様が変わってるみたいなのでもう少し自分で試してから報告しますね…OTL

win32で動きました。変更部分は2点
>agent.post('https://www.nicovideo.jp/login', YAML.load_file('nico.yaml'))
>video_file = open(video_id + '.flv', 'wb')

お目汚し失礼しました(^^;

ありがとうございます :D

実は自宅のネットが止まってるので、全然ホリデープログラミング出来てないんですよ。
そのうち新認証対応版書いたり、なんか変なの作る時に参考にさせていただきます。

コメントを投稿

Powered by
Movable Type 3.34