Monday, December 5, 2011

ツイッターボット お天気編

何度も言います。Perlとか書けませんからw
イロイロパクってなんとか動いただけです。
余計なモンとか入ってる可能性ありですw

で。。。
今日であれば最低気温は表示せず、最高気温表示のみ。
明日 or 明後日であれば最低気温と最高気温を表示。
みたいな感じになってます。

ユーザのcrontabで起動する際に エリアコード と ひにち(today/tomorrow/dayaftertomorrow) を指定します。

例) 横浜の明日の天気

tweet-weather.pl 70 tomorrow >/dev/null 2>&1

例) 東京の今日の天気

tweet-weather.pl 63 today >/dev/null 2>&1

詳細はこちらで:
お天気Webサービス仕様

ごーく マレに文字化けするときがあるのですが、
そもそものデータが地域や時間によって無い場合があるみたいで、
そういうときはウマク動きません。。。データがカラの場合の処理を入れないとダメなんでしょうね。キットw
メンドイのでとりあえずコレで。。。

2011/12/28 追記
といいつつ
カラの場合はついーとしないようにしました。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
binmode STDIN,  ":utf8";
binmode STDOUT, ":utf8";
use Net::Twitter;
use LWP::UserAgent;
use XML::Simple;
use XML::TreePP;
use Jcode;

# Twitter OAuth key and token
my $consumer_key = 'my key';
my $consumer_key_secret = 'my key secret';
my $access_token = 'my token';
my $access_token_secret = 'my token secret';

# Twitter OAuth
my $nt = Net::Twitter->new(
  traits          => ['API::REST', 'OAuth'],
  consumer_key    => $consumer_key,
  consumer_secret => $consumer_key_secret,
);
$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);

# URL parameters
my $area = $ARGV[0];
my $day = $ARGV[1];

# Obtain weather from livedoor weather
my $url = "http://weather.livedoor.com/forecast/webservice/rest/v1?city=$area&day=$day";
my $ua = LWP::UserAgent->new();
$ua->agent('Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
$ua->timeout(10);
$ua->env_proxy();
my $res2 = $ua->get($url);
$res2->is_success or die 'Can't connect to weather.livedoor.com.';
my $xml = $res2->content;
my $data = XMLin($xml);

# get area name, weather, and temparatures
my $telop=$data->{telop};
my $title=$data->{title};
my $temp_min = $data->{temperature}->{min}->{celsius};
my $temp_max = $data->{temperature}->{max}->{celsius};

# post to twitter. change parameters depending on day
if ($day eq "today" and $temp_max ne "") {
    my $post='【天気予報】' . $title . ' ' . $telop . ' 最高 ' . $temp_max . '度';
    my $res = $nt->update($post);

} elsif ($day ne "today" and $temp_min ne "" and $temp_max ne "") {
    my $post='【天気予報】' . $title . ' ' . $telop . ' ' . $temp_min . '度/' . $temp_max . '度';
    my $res = $nt->update($post);
} else {
    exit;
}

exit;

Add comment

Fill out the form below to add your own comments