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

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

上記のスクリプトをコピペしても動かなくなっていたので、調査して対応しました。
といっても、原因を完全に突き止めたわけではないので、応急処置的な部分があります。

use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request;
use HTTP::Request::Common;
use HTTP::Headers;
use CGI;
use YAML::Syck;
use Furl;

my $yaml = "$ENV{HOME}/.nicovideo.yml";
my $conf = YAML::Syck::LoadFile($yaml) or die "$yaml:$!";

$ARGV[0] =~ /(sm\d+)$/ or die "$0 [video_id|uri]";
my $video_id = $1;

my $ua = LWP::UserAgent->new( keep_alive => 1);
$ua->cookie_jar( {} );

warn "login as $conf->{mail}\n";
my $cookies = login($conf);
$ua->cookie_jar($cookies);
$ua->get("http://www.nicovideo.jp/watch/$video_id");
my $res = $ua->get("http://flapi.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" );


sub login {
    my ($config) = @_;

    my $f = Furl->new(max_redirects => 0);
    my $req = POST 'https://secure.nicovideo.jp/secure/login?site=niconico', $config;
    my $res = $f->request($req)->as_http_response;
    $res->request($req);
    my $cookies = HTTP::Cookies->new();
    $cookies->extract_cookies($res);

    return $cookies;
}


変更点は、以下の2点。

  • 動画のURLを取得するためのAPI先を変更
  • ログイン処理部分をFurlで行うようにした
    • ログイン部分でLWP::UserAgentを使うとなんか無限リダイレクトが起こるっぽい、$ua->max_redirect(0)としても変わらず