package WebService::Livedoor::Weather; use strict; use warnings; use Carp; use URI::Fetch; use XML::Simple; our $VERSION = '0.02'; sub new { my ( $class, %args ) = @_; $args{fetch} ||= {}; $args{fetch} = { %{$args{fetch}}, UserAgent => LWP::UserAgent->new( agent => "WebService::Livedoor::Weather/$VERSION" ) }; bless \%args,$class; } sub get { my $self = shift; my ($city,$day) = @_; croak('city is required') unless $city; $day ||= 'today'; my $cityid = $self->__get_cityid($city); my $res = URI::Fetch->fetch("http://weather.livedoor.com/forecast/webservice/rest/v1?city=$cityid&day=$day", %{$self->{fetch}}); croak("Cannot get weather information : " . URI::Fetch->errstr) unless $res; my $ref; eval{$ref = XMLin($res->content)}; croak('Oops! failed reading weather information : ' . $@) if $@; #temperature fixing ref $ref->{temperature}{max}{celsius} and $ref->{temperature}{max}{celsius} = undef; ref $ref->{temperature}{min}{celsius} and $ref->{temperature}{min}{celsius} = undef; ref $ref->{temperature}{max}{fahrenheit} and $ref->{temperature}{max}{fahrenheit} = undef; ref $ref->{temperature}{min}{fahrenheit} and $ref->{temperature}{min}{fahrenheit} = undef; return $ref; } sub __get_cityid { my ($self,$city) = @_; return $city if $city =~ /^\d+$/; my $cityname = pack('C0A*',$city); croak('Invalid city name. cannot find city id with ' . $city) unless exists $self->__forecastmap->{$cityname}; return $self->__forecastmap->{$cityname}; } sub __forecastmap{ my $self = shift; return $self->{forecastmap} if $self->{forecastmap}; my $res = URI::Fetch->fetch('http://weather.livedoor.com/forecast/rss/forecastmap.xml', %{$self->{fetch}}); croak("Couldn't get forecastmap.xml : " . URI::Fetch->errstr) unless $res; my $ref; eval{$ref = XMLin($res->content,ForceArray => [qw/pref area city/])}; croak('Oops! failed reading forecastmap.xml : ' . $@) if $@; my %forecastmap; foreach my $area (@{$ref->{channel}->{'ldWeather:source'}->{area}}){ foreach my $pref (@{$area->{pref}}){ $forecastmap{pack('C0A*',$pref->{city}->{$_}->{title})} = $_ for keys %{$pref->{city}}; } } $self->{forecastmap} = \%forecastmap; return $self->{forecastmap}; } 1; __END__ =head1 NAME WebService::Livedoor::Weather - Perl interface to Livedoor Weather Web Service =head1 SYNOPSIS use WebService::Livedoor::Weather; $lwws = WebService::Livedoor::Weather->new; my $ret = $lwws->get('63','tomorrow'); #63 is tokyo print $ret->{title}; print $ret->{description}; =head1 DESCRIPTION WebService::Livedoor::Weather is a simple interface to Livedoor Weather Web Service (LWWS) =head1 METHODS =item new $lwws = WebService::Livedoor::Weather->new; $lwws = WebService::Livedoor::Weather->new(fetch=>{ Cache=>$c }); creates an instance of WebService::Livedoor::Weather. C is option for URI::Fetch that used for fetching weather information. =item get(cityid or name,[day]) my $ret = $lwws->get('63','tomorrow'); #63 is tokyo my $ret = $lwws->get('cityname','today'); retrieve weather. You can get a city id from http://weather.livedoor.com/forecast/rss/forecastmap.xml =head1 SEE ALSO L http://weather.livedoor.com/weather_hacks/webservice.html (Japanese) =head1 AUTHOR Masahiro Nagano, Ekazeburo@nomadscafe.jpE =head1 COPYRIGHT AND LICENSE Copyright (C) 2006 by Masahiro Nagano This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.5 or, at your option, any later version of Perl 5 you may have available. =cut