« LastFMの最近聞いた曲にAmazonの情報を付加して書き出す | メイン | Danさんに勝手に添削されて学んだこと »

Perlでニコニコ動画のflvとコメントxmlをダウンロードする

さんざん既出かもしれないけどPerlでニコニコ動画のflvファイルとコメントのxmlファイルをダウンロードするスクリプト。 非公式ながら扱うことのできるニコニコ動画のAPIなんだけど、いくつかポイントがある。flvファイルのパスやコメントを表すスレッドのIDなどを取得するためのURLは

http://www.nicovideo.jp/api/getflv?v=ビデオID

になっていてる。ここにアクセス(GET)して得られる値のサンプルは以下のようなもの。 主なものを解説すると、urlというのがflvのパス、thread_idがコメントを示すスレッドのID、msがそのスレッドを取得できるAPIのURL。

thread_id:1184806392
l:91
url:http://smile-clb51.nicovideo.jp/smile?v=659632.44622
link:http://www.smilevideo.jp/view/659632/991267
ms:http://msg41.nicovideo.jp/api/
user_id:991267
is_premium:0
nickname:yournickname
done:true

このAPIをたたく時、またはflvをダウンロードするときには注意がすべきことがある。 まずニコニコ動画にログインした状態のセッションを保持したクッキーをもったUserAgentでアクセスしなくてはいけないのはまず当たり前で、 さらに取得しようとしている動画のパーマリンク、つまり以下のアドレスにアクセスした状態でなくてはエラーがでてしまうのだ。

http://www.nicovideo.jp/watch/ビデオID

これがWebフォーム型のニコニコ動画ダウンロードがうまくいかない理由であり、一方、動画のページにダウンロードボタンを追加するGreasemonkeyではダウンロードが成功するゆえんでもある。 また、コメントのXMLを取得するには、上記APIで取得したmsの値であるURLに対して以下のXMLをPOSTすれば最近の500件を得ることができる。

<thread res_from="-500" version="20061206" thread="スレッドID" />

以上を踏まえて以下のflvとコメントxmlをダウンロードするスクリプトが完成。

#!/usr/bin/perl

use strict;
use LWP::UserAgent;
use HTTP::Cookies;
use URI::Escape;
use HTTP::Request;
use HTTP::Headers;

my $video_id = $ARGV[0] || "sm721154";

my $mail = "yourmailaddress";
my $password = "yourpassword";

my $ua = LWP::UserAgent->new;
$ua->cookie_jar( HTTP::Cookies->new(
                                                                        file => 'cookie.lwp',
                                                                        autosave => 1,
                                                                ));
&login();
$ua->get( "http://www.nicovideo.jp/watch/$video_id" );

my $res = $ua->get( "http://www.nicovideo.jp/api/getflv?v=$video_id" );

my $content = uri_unescape($res->content);
my %data;
my @temp = split("&",$content);
foreach my $prop (@temp){
        if($prop =~ /(.*?)=(.*)/){
                $data{$1} = $2;
        }
}

#save flv
$res = $ua->get( $data{url} );
&save($res->content, $video_id . ".flv");

#save xml
my $post_data = "<thread res_from=\"-500\" version=\"20061206\" thread=\"" . $data{thread_id} ."\" />";
my $header = HTTP::Headers->new;
$header->header('Content-Type' => 'text/xml');
my $req = HTTP::Request->new('POST', $data{ms}, $header, $post_data );
$res = $ua->request($req);
&save($res->content, $video_id . ".xml");

sub login{
        $ua->post( "http://www.nicovideo.jp/login",
                             [
                                mail => $mail,
                                password => $password,
                        ]);
}

sub save{
        my ($content, $filename) = @_;
        open FH, ">$filename";
        binmode FH;
        print FH $content;
        close FH;
}

トラックバック

このエントリーのトラックバックURL:
http://yusukebe.com/mt/mt-tb.cgi/2137

この一覧は、次のエントリーを参照しています: Perlでニコニコ動画のflvとコメントxmlをダウンロードする:

» perl - 勝手に添削 - HTTP::MobileUserID::Japanese 送信元 404 Blog Not Found
スライドもなんとか上がったので、リハビリもかねて久々の添削。 Perlでニコニコ動画のflvとコメントxmlをダウンロードする (Yusuk... [詳しくはこちら]

» [PHP][phpNico]PHPだとこんな感じで 送信元 WebProgを極めて居酒屋を開発する
Perlでニコニコ動画のflvとコメントxmlをダウンロードする (Yusukebe::Tech) が今頃上がってきてるので。 PHPの場合は、コマンド... [詳しくはこちら]

» mechanize.rbでニコニコ動画のflvをダウンロード 送信元 polog
Perlでニコニコ動画のflvとコメントxmlをダウンロードする (Yusuke... [詳しくはこちら]

» 8/4の気になったもの 送信元 Xtyle::blog
最近の若い子たちの発想は...んっ? 元MS-CTO古川享氏のブログ.こういう熱... [詳しくはこちら]

» [php] PHPでニコニコ動画をダウンロードする方法 その1 送信元 replore的日記
perlでニコニコ動画ダウンロードという記事がはやってるので、同じ事をphpでもやってみました。 やってること自体はPerlと同じです。 以下がソースと... [詳しくはこちら]

» Plagger::Plugin::Filter::FetchNicoVideo / ver0.01 送信元 Yusukebe::Tech
非公式なニコニコ動画のAPIの制限を加味して、linkがニコニコ動画のビデオページ(http://www.nicovideo.jp/watch/sm... [詳しくはこちら]

» [python]pythonでニコニコ動画のflvをダウンロードする 送信元 spacecadetの日記
Perlでニコニコ動画のflvとコメントxmlをダウンロードするという記事を拝見しまして、「pythonでもできないかなー」と思ってやってみました。 コ... [詳しくはこちら]

» [memo] ニコニコ動画APIのコメントXMLについて少々 送信元 岩家ぶろぐ
以前からやってみたいことがあったので,ニコニコ動画の API をちょっと触ってみてます. 実装ついては,以下のエントリを参考にさせていただいてます. P... [詳しくはこちら]

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


ブログSEO対策:track word seo