Net::NicoVideo::JA - ニコニコ動画サイトへの Perl インタフェース
このモジュールは未完成です。 API は今後も変えられることが予想され、多くの機能が未実装です。
use Net::NicoVideo; my $video_id = $ARGV[0] or die; my $nnv = Net::NicoVideo->new({ email => 'your-nicovideo@email.address', password => 'and-password', }); my $info = $nnv->fetch_thumbinfo( $video_id ); my $flv = $nnv->fetch_flv( $video_id ); printf "download: %s\n". $info->title; if( $flv->is_economy ){ warn "now economy time, skip\n"; }else{ my $save_path = sprintf '%s/Movies/%s.%s', $ENV{HOME}, $video_id, $info->movie_type; $nnv->fetch_watch( $video_id ); $nnv->fetch_video( $flv, $save_path ); if( -s $save_path == $info->size_high ){ print "ok\n"; }else{ print "finished, but it may have broken.\n"; } }
ニコニコ動画は、日本で有名な動画共有サイトです。
配布 Net-NicoVideo は、ニコニコ動画のサイト内外でやりとりされる 各オブジェクト( HTTP メッセージ)へアクセスするためのインタフェースを提供します。 これにより、一貫したアクセス方法によってサイトへアクセスすることができ、 またカプセル化されたレスポンスを結果として得る事ができます。
そしてこのクラス Net::NicoVideo は、各オブジェクトを得る為の手続きを、 コンパクトに纏めたユーティリティとして、あります。
このクラスのインスタンスは、その内部では Net::NicoVideo::UserAgent を利用しています。 言い換えれば、クライアントはより低レベルの仕事のために Net::NicoVideo::UserAgent を使う事ができます。
その場合は、アクセスの段取りにクライアントは自ら注意を払う必要があることでしょう。 アクセス対象のサイトには、あるオブジェクトを得る為に、守るべきルールが存在するからです。
たとえば、動画ファイルを取得したい場合は、まずサイトにログインし、 flv と呼ばれるオブジェクトをリクエストし、更に動画を閲覧した上で、 動画の URL をリクエストしなければなりません。
クラス Net::NicoVideo のインスタンスはそうした暗黙のルールをメソッドとしてまとめ、 ユーザに便宜をはかります。
いずれにしても、このモジュールを使う際には、 サイトのオブジェクトについて(たとえば flv とは何か、 thumbinfo とは何かなど)、 ある程度の知識が要るかもしれません。 ただ、そういった事柄については Web を探す事ですぐに答を得る事が出来るでしょう。
なお、ニコニコ動画は 2012 年 5 月にサイトがリニューアルされました。 このモジュールが使える範囲は「ニコニコ動画(原宿)」と呼ばれる、リニューアル前のサイトです。 「ニコニコ動画(原宿)」は、いつまで使えるかは、このモジュールの作者は知りません。 ──このモジュールは、いまもまだ使えているでしょうか?
コンストラクタは、フィールドを定義するハッシュ・リファレンスを受け付けます。
my $nnv = Net::NicoVideo->new({ user_agent => LWP::UserAgent->new, email => 'your-nicovideo@email.address', password => 'and-password', delay => 1, });
各フィールドには同名のアクセス・メソッドがあります。 そちらの説明を参照して下さい。
フィールドへの低レベルのアクセス・メソッド。
デフォルトやバリデーションを介さない、 フィールドを直接に設定・取得するためのものです。 引数に値を与えた場合はその値をフィールドに設定します。
サイトへ HTTP (または HTTPS )でアクセスするための ユーザ・エージェントを取得、または設定します。 設定するユーザ・エージェントは LWP::UserAgent のインスタンスか、 そのサブクラスのインスタンスである必要があります。
$nnv->user_agent(LWP::UserAgent->new); $ua = $nnv->user_agent;
サイトにログインする際に要求されるメールアドレス。
$nnv->email($email); $email = $nnv->email;
サイトにログインする際に要求されるメールアドレスに対するパスワード。
$nnv->password($password); $password = $nnv->password;
サイトへ連続したアクセスをする際に、アクセスごとの間に差し挟む待ち時間(秒)。
$nnv->delay($seconds); $seconds = $nnv->delay;
フィールドへの、高レベルのアクセス・メソッド。
低レベルのそれに対し、バリデーション、デフォルト値が用意されています。 コンストラクタでフィールドを設定した後のフィールドへのアクセスは、 通常は、これらを利用します。
カスタマイズされたユーザ・エージェント Net::NicoVideo::UserAgent の インスタンスを作成して返します。
Net::NicoVideo::UserAgent はフィールド user_agent に設定されたインスタンスを 装飾するデコレータになっています。 フィールド user_agent が設定されていない場合は、 デコレートされるコンポーネントとして LWP::UserAgent のインスタンスが生成されます。
サイトにログインする際に要求されるメールアドレスを取得しますが、 フィールド email が未定義の場合は環境変数 NET_NICOVIDEO_EMAIL の値を返します。 それすらもなければ、単に undef が得られます。
ノート:要求しようとするサイトのコンテンツによっては、ログインが必要ない場合もあります。 従って、 email および password は、未設定が許容されます。
サイトにログインする際に要求されるメールアドレスに対するパスワードを取得しますが、 フィールド password が未定義の場合は環境変数 NET_NICOVIDEO_PASSWORD の値を返します。 それすらもなければ、単に undef が得られます。
連続するアクセスの間に差し挟むディレイ秒を取得します。
フィールド delay が未定義の場合は環境変数 NET_NICOVIDEO_DELAY の値を返します。 さもなければ、デフォルトの 1 が得られます。
コンテンツ・オブジェクトを取得するメソッド群。
このカテゴリのメソッドは、サイトの各コンテンツに対応しており、 それぞれ、取得したコンテンツを解析した結果を持っている Net::NicoVideo::Content のインスタンスを返します。
その、返されるオブジェクトの具体的な内容については、 コンテンツの種類ごとにサブクラスが定義されているため、 Net::NicoVideo::Content 以下の各サブクラスを参照して下さい。
video_id に関する Thumbinfo オブジェクトを取得します。 なお Thumbinfo を得る為に、ログインは必要ありません。
video_id に関する Flv オブジェクトを取得します。
video_id に関する Watch オブジェクトを取得します。
Watch オブジェクトは仮想的なもので、実際は動画ページへアクセスし、 そこから得られる情報を持ったコンテンツ・オブジェクトです。
これは、サイトに対して、クライアントが動画を閲覧することを示します。 そしてその振る舞いは、 fetch_video を呼ぶ直前に必要なことになっています。
第一引数に与えた video_id 、 flv オブジェクト、または直接の URL の動画のデータを取得します。 URL の場合、それは flv オブジェクトから取得できる URL でなければ意味をなさないでしょう。
取得したデータはそれ以降の引数によって処理される方法が異なります。 このメソッドは LWP::UserAgent の request メソッドと同じで、 実際、内部では透過的にそれを呼んでいます。 たとえば、第二引数にスカラー値を与えた場合は、それはファイル・パスとして解釈され、 動画コンテンツはそのファイルに保存されます。 詳しくは LWP::UserAgent の request メソッドを参照して下さい。
第一引数に与えた video_id もしくは flv オブジェクトが示す動画の、コメントを取得します。
第二引数のハッシュ・リファレンスはオプションで、次のキーと値のペアを受け取ります。
最新のものから何件のコメントを取得するか。デフォルトは 250 です。
取得するコメントを、動画オーナーのコメントだけに限定します。デフォルトは偽です。
タグ検索のためのメソッド。
keyword で指定したタグで動画検索を行い、結果を RSS 形式で返します。
オプションでハッシュリファレンス params を与える事ができます。 そのキーと値は次のとおりです。
検索結果を並び替えるキーワードを指定します。
f ... 投稿日時 v ... 再生数 r ... コメント数 m ... マイリスト数 l ... 再生時間
無指定のときは r コメント数になります。
並び替えの順序を指定します。 'a' を指定すると ASCEND つまり降順です。
無指定のときは DESCEND 昇順です。
検索結果が多い場合は、結果は幾つかのページに別れており、何番目のページを得るかを指定します。
無指定のときは 1 ページ目を得ます。
なお 1 ページは最大で 32 件です。
投稿日時の降順で得るように params を固定して fetch_tag_rss を呼び出すショートカットです。
引数にはタグと、オプションでページ番号を指定します。
マイリストの RSS を取得するためのメソッド。
引数に指定した mylist または mylist_id のマイリストの RSS を保持するコンテンツ・オブジェクトを返します。
ノート:非公開のマイリストでも、サイトにログインしていることで、それを得る事ができます(?)
NicoAPI へアクセスするための下地を得るためのメソッド群。
NicoAPI はマイリスト類を AJAX 手段で得る為に JavaScript で実装されているライブラリの名前空間で、 マイリスト類のデータの取得、更新、削除などのメソッドを持っています。 そして、取得するためのメソッド以外の実行には、アクセス・トークンが必要になります。
ログインしているユーザの「マイリスト」ページを取得し、 そのページを解析した結果を持つ Net::NicoVideo::Content::MylistPage オブジェクトを返します。
主にアクセス・トークンを得るためのものです。
ログインしているユーザで、 video_id に対する「マイリストの追加」ページを取得し、 そのページを解析した結果を持つ Net::NicoVideo::Content::MylistItem オブジェクトを返します。
これにより video_id の動画に対する "item_id" および "item_type" を得る事ができます。
なお "item_type" は、動画に対してはゼロ "0" が固定の値となっていますが、 このメソッドではそれをリクエストして得たページのコンテンツ内容から動的に取得します。 また、そのページではアクセス・トークンが得られるのでついでにそれも取得します。
NicoAPI.MylistGroup のメソッド群。
マイリスト・グループを操作するメソッド群です。 これらのメソッドで、何かを取得すること *以外* の実行には、 アクセス・トークンが必要になります。
ただしトークン省略しても、それは内部で自動的に取得され、用いられます。 しかしすでにアクセス・トークンを持っている場合は、それを指定する事で、 アクセス・トークンの取得の為のサイトへのアクセスをなくす事ができます。
ログインしたユーザのマイリスト・グループのリストを取得します。
これは、 NicoAPI.MylistGroup#list に相当します。
指定した grpup_id のマイリスト・グループを取得します。
これは、 NicoAPI.MylistGroup#get に相当します。
ログインしたユーザにマイリスト・グループを追加します。
これは、 NicoAPI.MylistGroup#add に相当します。
マイリスト・グループの情報を更新します。
これは、 NicoAPI.MylistGroup#update に相当します。
マイリスト・グループを削除します。
これは、 NicoAPI.MylistGroup#remove に相当します。
remove_mylistgroup のエイリアスです。
NicoAPI.Mylist のメソッド群。
マイリストのアイテムを操作するメソッド群です。 これらのメソッドで、何かを取得すること *以外* の実行には、 アクセス・トークンが必要になります。
group_id のマイリスト・グループのマイリスト一覧を得ます。 これは、 NicoAPI.Mylist#list に相当します。
マイリスト・アイテム item を group_id のマイリスト・グループに追加します。 これは、 NicoAPI.Mylist#add に相当します。
group_id のマイリスト・グループのマイリスト・アイテム item を更新します。 これは、 NicoAPI.Mylist#update に相当します。
group_id のマイリスト・グループのマイリスト・アイテム item を削除します。 これは、 NicoAPI.Mylist#remove に相当します。
remove_mylist のエイリアスです。
マイリスト・グループ src-group_id のマイリスト・アイテム item を マイリスト・グループ dst-group_id へ移動します。 これは、 NicoAPI.Mylist#move に相当します。
マイリスト・グループ src-group_id のマイリスト・アイテム item を マイリスト・グループ dst-group_id へ複製します。 これは、 NicoAPI.Mylist#copy に相当します。
その他ユーティリティ。
引数に与えたユーザ・エージェント Net::NicoVideo::UserAgent のインスタンスを、 ログイン・ページへ導き、そしてログインを行います。 そして、その結果を持たせた元のユーザ・エージェントを返却します。
引数に与えたインスタンスと、返却されるインスタンスは同じインスタンスです。
典型的には、次のように使われます。 ログインが必要なページを、まずログインすることなしにアクセスを試み、 そのレスポンスから、ログインが要求されている事を知ったとき、 はじめてそこでログインを試み、 そしてログインした状態でコンテンツを改めて取得します。
$res = $ua->request_mylist_rss($mylist); unless( $res->is_authflagged ){ # if not logged-in $ua = $self->through_login($ua); # login $res = $ua->request_mylist_rss($mylist); # try again }
ログインに失敗した際は croak されます。
動画ファイルをダウンロードするための一連の段取りをまとめた、 ショートカットです。
忙しい時には、ワンライナーでお望みの動画をダウンロードできます。 次のように:
$ perl -MNet::NicoVideo -e 'Net::NicoVideo->new->download(@ARGV)' \ smNNNNNN ./smile.mp4
ただし、これから説明する環境変数を予めセットしておく必要があるでしょう。
ノート:この例では、出力ファイルを MP4 と見越して拡張子を mp4 としていますが、 ニコニコ動画で扱われている動画のメディア・ファイルは、 MP4 かもしれませんが、 そうでないかもしれません。現在知られているのは MP4, FLV または SWF のいずれかです。 どの種類かは、前もって Thumbinfo を取得して、その内容から判断することもできます。
NET_NICOVIDEO_EMAIL NET_NICOVIDEO_PASSWORD NET_NICOVIDEO_DELAY
これらの明らかなる名前の環境変数が、その名の示すとおりの役割で有効です。
LWP::UserAgent Net::NicoVideo::Content Net::NicoVideo::UserAgent
Net::NicoVideo は Github にホストされ、その上で開発が進められています。
https://github.com/hiroaki/Net-NicoVideo
バグ情報、パッチ、激励のコメントを歓迎します。
WATANABE Hiroaki <hwat@cpan.org>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Net::NicoVideo, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Net::NicoVideo
CPAN shell
perl -MCPAN -e shell install Net::NicoVideo
For more information on module installation, please visit the detailed CPAN module installation guide.