« FreeBSD6.0 + Apache2.2にmod_layout5.1をいれてみる | メイン | Mac::Growlで2chの更新スレッドを通知する(続き) »

Mac::Growlで2chの更新スレッドを通知する

昔は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」にしてあります。

sure.jpg

$urlに、板のスレッド一覧URLを指定。(↑これ。)

growl.jpg

$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

About

2008年03月22日 13:12に投稿されたエントリーのページです。

ひとつ前の投稿は「FreeBSD6.0 + Apache2.2にmod_layout5.1をいれてみる」です。

次の投稿は「Mac::Growlで2chの更新スレッドを通知する(続き)」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。