あっという間の十年ブログ【Ruby篇】

"詮ずるところ#{プログラミング}は、ただ年月長く倦まずおこたらずして、はげみつとむるぞ肝要にて、学びやうは、いかやうにてもよかるべく、さのみかかはるまじきことなり。いかほど学びかたよくても、おこたりてつとめざれば、功はなし。また、人々の才と不才とによりて、その功いたく異なれども、才不才は、生まれつきたることなれば、力に及びがたし。されど、大抵は、不才なる人といへども、おこたらずつとめだにすれば、それだけの功は有る物なり。" - 本居宣長

ニコニコ動画を快適に見る

ニコニコ動画から適当なキーワードの新着動画を表示させる…まあ例によってスクレイピングです。
これでいちいちログインして気になるキーワードの更新確認しなくてもいいですね。(とっても僕はあんまりニコニコ見ないですけど。)

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);

スクリプトではTPP動画を取得していますが、TPPを選んだ理由はとくにないです。。
結果