camel
初出2007.08.26; 追記2011.08.13

この仕様変更の影響は、ニコニコ動画ダウンローダーにも及びます。というわけで改訂版。

パスワード変更のお知らせ【更新 20:31】 - ニコニコ動画 開発者ブログ(新着情報)
以前プレミアムパスを設定していなかった、または設定したが忘れてしまった方はログインフォームの下にある【パスワードを忘れた】から新しいパスワードを設定してください。

とはいっても、変更する必要があったのはわずか一カ所、認証用のURIだけでしたが。

#!/usr/bin/env perl
#
# $Id: nicoget.pl,v 0.3 2011/08/13 12:12:02 dankogai Exp dankogai $
# original: http://yusukebe.com/tech/archives/20070803/124356.html
#

use strict;
use warnings;
use LWP::UserAgent;
use CGI;
use YAML;

my $yaml = "$ENV{HOME}/.nicovideo.yml";
my $conf = YAML::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,
    cookie_jar => {},
);
$ua->env_proxy(); # set HTTPS_PROXY and HTTP_PROXY to make use of it
warn "login as $conf->{mail}\n";
$ua->post( "https://secure.nicovideo.jp/secure/login?site=niconico" => $conf );
$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\n";
$res = $ua->request( HTTP::Request->new( GET => $url ), $video_id );
$res->is_success or die "Failed: " . $res->status_line;
my $ext = $res->headers->header('Content-Type') =~ /mp4/ ? 'mp4' : 'flv';
warn "$video_id => $video_id.$ext\n";
rename $video_id => "$video_id.$ext";

よく見るとわかるのですが、認証用のURIはhttps:ですので、LWPをSSL対応させるために、Crypt::SSLeayもインストールしておいてください。この当たりの事情はLWP付属のREADME.SSLに書いてあります。

Enjoy!

Dan the (Nico|Perl)Monger

追記[2011.08.13

  • LWP 6.xからSSLに必要なモジュールがLWP::Protocol::httpsに変わりました。
  • ついでにproxy対応その他を追加しました