ニコニコ動画ダウンローダー

404 Blog Not Found:perl - ニコニコ動画ダウンローダー新認証対応版

からの変更点は

  • YAML解析ライブラリは(私がYAML::Syckをインストールしていないので)YAMLに変更
  • STDINから動画IDを改行区切りで複数渡すことにした
  • nmから始まるIDの動画もあるので動画IDの形式チェックはやらない
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request;
use HTTP::Headers;
use CGI;
use YAML;

sub get_nicovideo($$){
  my $ua = shift;
  my $video_id = shift;
  $ua->get("http://www.nicovideo.jp/watch/$video_id");
  my $res = $ua->get("http://www.nicovideo.jp/api/getflv?v=$video_id");
  my $q   = CGI->new( $res->content );
  my $url = $q->param('url') or die "Failed: " . $res->content;
  warn "$url => $video_id.flv\n";
  $res = $ua->request( HTTP::Request->new( GET => $url ), "$video_id.flv" );
  warn "saving comments as $video_id.xml\n";
  my $header = HTTP::Headers->new;
  $header->header( Content_Type => 'text/xml' );
  my $thread_id = $q->param('thread_id');
  my $req       = HTTP::Request->new(
    POST => $q->param('ms'),
    $header,
    qq{<thread res_from="-500" version="20061206" thread="$thread_id" />}
  );
  $res = $ua->request( $req, "$video_id.xml" );
}

my $yaml = "nicovideo.yml";
my $conf = YAML::LoadFile($yaml) or die "$yaml:$!";

my $ua = LWP::UserAgent->new( keep_alive => 1 );
$ua->cookie_jar( {} );
warn "login as $conf->{mail}\n";
$ua->post( "https://secure.nicovideo.jp/secure/login?site=niconico" => $conf);

while(<STDIN>){
  chomp;
  my $video_id = $_;
  get_nicovideo($ua, $video_id);
}

でlistファイルに動画のIDを1行1つの形式で記述し、こんな感じのバッチファイルを作って起動。

perl nicoget.pl < list