理系学生日記

おまえはいつまで学生気分なのか

Web::Scraper と Mac::Growl で雨が降り始めたら Growl で通知する

ぼくは基本的に PC の前にいて、PC の方を向いています。部屋のレイアウト的に、ぼくは家にいる時間の大部分を窓と反対方向を向いて過ごすことになります。
しかし今日のように、いつ雨が降り出すか分からないような状況で洗濯物を干していると、雨が降り始めたのに PC に集中してしまい、せっかく干した洗濯物がずぶぬれ、明日着ていく服がなくなるという悲劇にみまわれてしまいます。

ですから、気象庁のページにアクセスして降水量のデータをスクレイピングし、雨が降りはじめたら Growl で通知してくれるスクリプトを書いた。気象庁のページは 1 時間毎しか更新されないのがちょっと痛いけど、ないよりはマシだと思います。

こんなかんじになる。

#!/usr/bin/perl
use strict;
use warnings;
use URI;
use Web::Scraper;
use Time::Piece;
use Mac::Growl ':all';

# scrape 先の URL (デフォルトは船橋)
my $url = shift || 'http://www.jma.go.jp/jp/amedas_h/today-45106.html?groupCode=31&areaCode=206';

# scraping 実行
my $rainfalls = scraper {
    process '//td[@class="block middle"][2]', 'rainfall[]' => sub {
        # 実はこのコールバックは必要なかった。。
        my $text = $_->as_text;
        return ($text =~ /\d+(?:\.\d+)/)? $text : "0.0";
    };
    result 'rainfall';
}->scrape( URI->new( $url ) );

# 1 時間前の降水量と現在時刻の降水量を取得
my $hour = localtime()->hour;
my ($prev, $cur) = @{$rainfalls}[$hour-2, $hour-1];

# 1 時間前に降ってなくて、現在時刻で降っているようなら通知
if ( $prev == 0 and $cur > 0 ) {
    my $app    = __FILE__;
    my $as_app = 'GrowlHelperApp.app';
    my $notif  = 'hoge';

    RegisterNotifications($app, [$notif], [$notif], $as_app);
    PostNotification($app, $notif, 'Weather Notification', '雨が降り始めたよ。。。', 1);
}