2009年7月2日木曜日

CLIで天気予報を表示する

 最近perlを触る機会があり、perlをいじるのは初めてだったのですが、なんとかでっち上げてみました。perlなんて記号だらけの省略記法だらけで大嫌いだったのでですが、時代は変わり、最近ではモジュールを活用してブロックを組み立てるかのように書けるとか。
 実際 CPAN の充実ぶりは凄いですね。あらためて perl を見直しました。

 んで今回はYahooから天気予報を取得して表示するコマンドです。前回は今現在の気象情報を表示するだったのですが今回は予報です。

インストール

 以下のスクリプトを適当な名前、yohou.pl みたいな名前で ~/bin/ あたりにでも保存し、chmod +x yohou.pl として実行属性を付けておいてください。

#!/usr/bin/perl
# last updated : 2009/07/02 15:46:45 JST
#
# Yahooから天気予報を取得する。

use utf8;
use strict;
use warnings;
use XML::TreePP;

binmode STDOUT, ":utf8";


# url
# 以下のurlから調べて下さい。
# http://weather.yahoo.co.jp/weather/public/rss.html
my $url = "http://rss.weather.yahoo.co.jp/rss/days/4410.xml";
# カットする文字列。
my $cut = " 東京(東京) ";




my $tpp = XML::TreePP->new(array_element => [qw( item )]);
$tpp->set( utf8_flag => 1 );
my $tree = $tpp->parsehttp( GET => $url);
my $channelhash = $tree->{rss}->{channel};
print $channelhash->{title} . "\n";
my $itemarray = $channelhash->{item};
foreach my $itemhash ( @$itemarray ) {
my $base = $itemhash->{title};
unless ($base =~ /^\[PR\]/) {
$base =~ s/ - Yahoo!天気情報$//;
$base =~ s/ (\d)日/ 0$1日/;
if ($base =~ /^【 \d\d日/) {
my $idx = rindex($base, '】');
my $day = substr($base, 0, $idx + 1);
$day =~ s/$cut//;
my $wea = substr($base, $idx + 2);
my @tenki = split(/ - /, $wea);
$tenki[0] = trim($tenki[0]);
print sprintf("%s %-4s %s", $day, ume($tenki[0]), $tenki[1]) . "\n";
}
else {
print $base . "\n";
}
}
}
print $channelhash->{copyright} . "\n";

sub trim {
my $val = shift;
$val =~ s/^\s*(.*?)\s*$/$1/;
return $val;
}

sub ume {
my $val = shift;
my $len = length($val);
if ($len < 4) {
$val = $val . " " x (4 - $len);
}
return $val;
}

 次に自分の住んでいる地域の天気予報を表示するために、http://weather.yahoo.co.jp/weather/public/rss.html から地域のurlをコピーして
my $url = ”http://rss.weather.yahoo.co.jp/rss/days/4410.xml"
の行を変更しておいてください。その下の my $cut も同じく地域に合わせて変更を。$cut は単に冗長な部分を削除するだけですから、ほっといても特に問題ありません。

 次にこのスクリプトは XML::TreePP というモジュールを利用しているので、
sudo apt-get install libxml-treepp-perl
としてインストールしておいて下さい。
 以上で準備は完了です。後は ~/bin/yohou.pl とでもして実行すれば、
~$ yohou
Yahoo!天気情報 - 東京(東京)の天気
【 02日(木)】 雨後曇  26℃/21℃
【 03日(金)】 曇り   26℃/21℃
【 04日(土)】 曇時々雨 25℃/22℃
【 05日(日)】 曇時々雨 27℃/21℃
【 06日(月)】 曇り   28℃/22℃
【 07日(火)】 曇時々雨 28℃/22℃
【 08日(水)】 曇時々雨 27℃/22℃
【 09日(木)】 曇時々雨 26℃/22℃
【 23区西部 】警報・注意報はありません
【 23区東部 】警報・注意報はありません
【 多摩北部 】警報・注意報はありません
【 多摩西部 】警報・注意報はありません
【 多摩南部 】警報・注意報はありません
Copyright (C) 2009 Yahoo Japan Corporation. All Rights Reserved.
な感じで天気予報が表示されます。天気情報コマンドと合わせて使えばいいでせう。


# ん〜それにしてもperl の文字列処理のやり方がまだ理解していない・・・でもモジュールは便利だね。というか便利すぎ。
# いままでrubyばかりだったけど、perlで便利なモジュールがある場合はperlを使おう。