ニコニコ動画を快適に見る
ニコニコ動画から適当なキーワードの新着動画を表示させる…まあ例によってスクレイピングです。
これでいちいちログインして気になるキーワードの更新確認しなくてもいいですね。(とっても僕はあんまりニコニコ見ないですけど。)
use strict; use warnings; use Web::Scraper; use WWW::Mechanize; use URI; use Encode; open(my $out, '>', 'nico.html')or die('could not open file'); # html template print $out qq(<!DOCTYPE html>\n<html lang="ja">\n); print $out qq(<head>\n<meta charset="UTF-8">\n<title>nicovi</title>\n); print $out qq(<style>); for (0..29) { print $out "#box$_,"; print $out "#box30" if ($_ eq 29) } print $out qq({ display:none; }</style>); print $out qq(<script src="nico.js"></script>\n</head>\n<body>\n); my $mech = new WWW::Mechanize; # キーワード「TPP」の新着 my $url = 'http://www.nicovideo.jp/search/TPP?page=1&sort=f&order=d'; $mech->get($url); # 色々取得してるけど今回使っているのはtitleとlinksだけ my $scraper = scraper { process '.thumb_num', 'when[]' => 'TEXT', process '.vinfo_length', 'vinfo_length[]' => 'TEXT', process '.vinfo_res', 'comment[]' => 'TEXT', process '.vinfo_mylist', 'mylist[]' => 'TEXT', process '.vinfo_uadp', 'ad[]' => 'TEXT', process '.watch', 'title[]' => 'TEXT', process '.watch', 'links[]' => '@href', process '.uad_thumbfrm img', 'img[]' => '@src', }; my $res = $scraper->scrape($mech->content); # 30動画くらい表示する for(0..30) { my $time = shift @{ $res->{when} }; my $length = shift @{ $res->{vinfo_length} }; my $comment = shift @{ $res->{comment} }; my $mylist = shift @{ $res->{mylist} }; my $ad = shift @{ $res->{ad} }; my $title = shift @{ $res->{title} }; my $img = shift @{ $res->{img} }; my $link = shift @{ $res->{links} }; $link =~ s/watch//; print $out encode_utf8(qq{<a href="javascript:void(0);" onclick="javascript:disp$_();"><img src="$img">$title</a>}); # ニコニコ外部プレイヤー print $out encode_utf8(qq{<div id="disp"><div id="box$_"><script type="text/javascript" src="http://ext.nicovideo.jp/thumb_watch$link"></script></div></div>}); } print $out qq(</body>\n</html>); close($out);
外部プレイヤーの表示・非表示を切り替えるためにJavaScriptを使いました。
JavaScriptはほとんど初めてでわけわかめでしたが良いサイトがあったので丸々使わせてもらいました。
面倒なのでPerlに書いてもらうことにします。
use strict; use warnings; open(my $out, ">", "nico.js"); print $out "var i = 0;\n"; for (0..30) { print $out "function disp$_() {\n"; print $out "if(i%2==0)\n"; print $out qq{document.getElementById("box$_").style.display="block";\n}; print $out "\n"; print $out "else\n"; print $out qq{document.getElementById("box$_").style.display="none";\n}; print $out "\ni++;\n}\n"; } close($out);