昔は2chというものを毛嫌いしていたのに、気がつくと2chのスレッドを常にチェックしている毎日。
新たな書き込みの有無を確認するのが段々面倒になってきたのでGrowlに通知するスクリプトを書いてみました。似たようなものが多分あるのだろうけど、探すのが面倒だった。
#!/usr/local/bin/perl use strict; use URI; use Web::Scraper; use Data::Dumper; use Encode; use Mac::Growl ':all'; use vars qw($url $chkwords $interval $threads $last); $url = 'http://hobby10.2ch.net/auto/subback.html'; $chkwords = 'rx-8'; $interval = 300; if( $ARGV[0] eq 'init' ){ RegisterNotifications( "2chChecker", # 登録するアプリケーション名 ['alert', 'note', 'info'], # 登録したアプリケーションで使用する通知の種類。 ['note'] # デフォルトで使用する通知の種類 ); } while(1){ $threads = get_threads(); for(keys %$threads){ my $update; if( $last and $threads->{$_}->{res} > $last->{$_}->{res} ){ $update = $threads->{$_}->{res} - $last->{$_}->{res}; my $msg = "新しいレスがありました。($update)"; Encode::from_to($msg, 'MacRoman', 'utf8'); # 10.4では不要 my $title = $threads->{$_}->{title}; Encode::from_to($title, 'MacRoman', 'utf8'); # 10.4では不要 PostNotification( "2chChecker", 'note', $msg, $title, ); }; } $last = $threads; sleep($interval); } sub get_threads{ my $hash; my $details = scraper { process 'a','data' => 'TEXT'; process 'a','href' => '@href'; result 'data', 'href'; }; my $list = scraper { process 'small#trad a','lists[]' => $details; result 'lists'; }; my $res = $list->scrape( URI->new( $url ) ); for( @$res ){ my $data = encode_utf8( $_->{data} ); $data =~ m/^(\d+)\:\s{1}(.*)\s{1}\((\d+)\)$/; my $url = $_->{href}; $url =~ s/\/150$//; $hash->{$url} = { 'title' => $2, 'res' => $3, }; delete $hash->{$url} if $chkwords and $2 !~ /$chkwords/i; } return $hash; }
動作環境はMacOSX 10.x。
準備として、Growlと必要なPerlモジュールをインストールしておく。Growlの1.1.2はMac::Growlが対応していなかったので0.7.6をいれます。
# ./growl.pl init
スクリプトをGrowlにアプリケーションとして登録する必要があるので、初回は上記のように引数付きで実行します。上記例ではアプリケーション名を「2chChecker」にしてあります。
$urlに、板のスレッド一覧URLを指定。(↑これ。)
$chkwordsにチェックしたいスレッドのタイトルに含まれるキーワードを入力して実行すると、スレッドが更新された際にデスクトップにこのような通知を出すことができます。
※上記の例では、車種・メーカースレの「rx-8」が含まれるスレッドの新着をチェックしています。(((;・∀・)
whileで回す処理はあんまりだとかPOEとかデータをDBにいれた方がいいとかそれplaとかもうちょっと汎用性があったほうがいいとか2ch全体のスレ検索ができたほうがいいとか、いろいろ拡張すると楽しそうではあるけど、スレの巡回チェック作業をやめるという当初の目的は果たしたので終了、と。
参考
- http://search.cpan.org/~cnandor/Mac-Growl-0.67/lib/Mac/Growl.pm
- http://my.opera.com/aloe/blog/2008/01/20/mac-growl
- http://veadardiary.blog29.fc2.com/blog-entry-317.html
- http://d.hatena.ne.jp/mteramoto/20070404/p1