2006/09/13

Livedoor Weather Web Service 取得

最近LWWS関係で検索して、たどり着かれた人が居る様なので、すぐ出来ると思ってコードを書いてみたけど、Perl久しぶりすぎて色々忘れまくりで、qw(…)を%w(…)みたいな事したりしてたら1時間近く掛かった様な。Ruby初めて使ったときはPerlは最高と思ったけど、要は慣れだね。
Perlとかcgiというキーワードも多いので(何故かtdiaryのreferrerには記録されてないけど)、初めはperlでcgiにしてcache<%= fn 'Cache::Cacheとかインストールしちゃった…' %>とかもばっちりにしようかと思ったけど、思いのほか時間が掛かったので、途中で諦めてDumperで逃げました。結局RESTの基本みたいなコードになってしまいましたが。
HTTPヘッダ出して、適当なテンプレートエンジン使って出力したらCGI対応も比較的すぐ出来ると思います。
LWWS->newの引数は、city_idとday(0:今日 , 1:明日 , 2:明後日)です。
例では、お天気Webサービス仕様にならって、久留米の明後日の情報が取得されます。utf-8で保存してください。
バックスラッシュが何故か?です。なんでだろ?

コード

#!/usr/bin/env perl

use strict;
use warnings;
use LWP::Simple;
use XML::Simple;
use Data::Dumper;

binmode(STDOUT, ":utf8");

$XML::Simple::PREFERRED_PARSER = 'XML::Parser';

my $lw = LWWS->new(113, 2);
my $data = $lw->get();
print Dumper($data);
print $data->{location}->{city} . "?n";

package LWWS;

sub new {
my ($class, $city, $day) = @_;
bless {
'city' => $city,
'day' => $day,
}, $class;
}

sub get {
my $self = shift;
my $parser = XML::Simple->new();
my $xml_doc = LWP::Simple::get($self->_mk_path);
return $parser->XMLin($xml_doc);
}

sub _mk_path {
my $self = shift;
my $url = "http://weather.livedoor.com/forecast/webservice/rest/v1";
$url .= "?city=" . $self->{city} . "&day=" . _exchg_day($self->{day});
}

sub _exchg_day {
my $idx = shift;
return qw(today tomorrow dayaftertomorrow)[$idx];
}