Cocoa::Growlで遊ぶ。
モジュールのアップデート書けてたら Growl::Anyがアップデートされてて
なんだろって思ったら、Cocoa::Growl対応となっていた。なんじゃそりゃ
って思った。調べていると最近できたモジュールらしいです。
詳しいことはhttp://perl-users.jp/articles/advent-calendar/2010/hacker/15にあります。
Mac::Growlだと文字コード周りでいろいろ使いづらいところがあったけど、
Cocoa::Growlだと普通の文字コード処理の流れで問題ないっぽい。
クリックした場合のコールバックも設定できるし、これからは Cocoa::Growl
使ってればいいんじゃないかと思いました。
で、遊びで書いてみたコードが以下のもの。
#!/usr/bin/env perl use strict; use warnings; use utf8; use Cocoa::Growl qw(:all); use Web::Scraper; use Encode; use Time::HiRes; use AnyEvent; use AnyEvent::Impl::NSRunLoop; my $cv = AnyEvent->condvar; growl_register( app => 'Dmm Actress Ranking', notifications => [qw(actress_ranking)], ); my $actress_ranking = scraper { process "td.bd-b", "rankings[]" => scraper { process 'span.rank', rank => 'TEXT', process 'a > img', name => '@alt', image => '@src'; process 'div > a', href => '@href', title => 'TEXT'; }; }; my @actresses; my $base = 'http://www.dmm.co.jp/mono/dvd/-/ranking/=/term=monthly/mode=actress/rank='; for my $page (qw/1_20 21_40 41_60 61_80 81_100/) { my $url = $base . $page . '/'; my $res = $actress_ranking->scrape(URI->new($url)); for my $rank (@{$res->{rankings}}) { push @actresses, $rank; } } my $w = AnyEvent->timer( after => 0, interval => 3, cb => sub { my $actress = shift @actresses; growl_notify( name => 'actress_ranking', title => encode_utf8($actress->{rank} . "位: " . $actress->{name}), icon => $actress->{image}, description => encode_utf8($actress->{title}), on_click => sub { `open $actress->{href}`; }, ); if (scalar @actresses == 0) { $cv->send; } } ); $cv->recv;
DMM.co.jpのAV女優売り上げランキングから上位 100位の人を
取ってきてそれを Growlに通知。名前と顔写真と最新の作品を
表示するようにしています。クリックするとその商品の
ページに飛ぶようになってます。
cronで一時間に一回ぐらい回せば、どんな女優のどんな作品が
売れているというのがわかるのではないでしょうか。