2009年2月17日

天気予報を毎朝自動でメール送信

 実は最近Rubyを勉強していたりします^^;
 で、勉強ついでに天気予報を毎朝自動でメールしてくれるプログラムを作ってみました。今まで携帯でチェックしていたんですが、朝の慌ただしい時間のなかちまちまとチェックするのもめんどうだし、パケット代もかかるしで、それなら作ってしまおうと思い立った次第です。
 このプログラムを作るにあたって、下記の気象庁データをXMLデータに変換して公開しているサイトが非常に役に立ちました。お礼のメールをしようと思ったのですがお問合せが見つからず・・この場を借りてお礼申し上げますm(__)m

 drk7.jp

 ソースを参考程度に載せておきます。あくまで個人的に使おうと思って作ったものなので、汎用性は低いかもしれません。特徴らしい特徴といえば、メールアドレスを複数登録することで一括で複数人にメール可能です。解析出来るのはひとつの地域のみです。ちなみに愛知県での使用を前提につくったものなので、都合が悪いところはカスタマイズしてください^^


#!/usr/local/bin/ruby

# WeatherInfo v1.00
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
# Created: 2009/02/17
# Updated: None
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#

$KCODE = 'utf8';

require 'uri';
require 'kconv';
require 'net/http';
require 'net/smtp';
require 'rexml/document';

Net::HTTP.version_1_2;

# Setup Start ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
getXmlUri = URI( 'http://www.drk7.jp/weather/xml/23.xml' );
toMailAddr = [
'to1@mail.address',
'to2@mail.address',
];
from = 'from@mail.address';
# Setup End ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#

#############################################################################
class Weather
@@mailContents = Array.new;

def initialize( day, xml )
@day = day;
@xml = xml;
end

def prepare()
weather = Array.new;
weather.push( "[#{@day}の天気]" );
weather.push( @xml.elements['weather'].text );

if @xml.elements['temperature'] then
weather.push( '最高気温: ' );
weather.push( '最低気温: ' );

tempMax = @xml.elements['temperature/range[@centigrade=\'max\']'].text;
tempMin = @xml.elements['temperature/range[@centigrade=\'min\']'].text;
tempMax = sprintf( "%2d", tempMax ) + '℃' if /^-?\d+$/ =~ tempMax;
tempMin = sprintf( "%2d", tempMin ) + '℃' if /^-?\d+$/ =~ tempMin;
tempMax = '--' if ! tempMax;
tempMin = '--' if ! tempMin;
weather[2] += tempMax;
weather[3] += tempMin;
end

if @xml.elements['rainfallchance'] then
weather.push( '降水確率( 00-06 ): ' );
weather.push( '降水確率( 06-12 ): ' );
weather.push( '降水確率( 12-18 ): ' );
weather.push( '降水確率( 18-24 ): ' );

rain0006 = @xml.elements['rainfallchance/period[@hour=\'00-06\']'].text;
rain0612 = @xml.elements['rainfallchance/period[@hour=\'06-12\']'].text;
rain1218 = @xml.elements['rainfallchance/period[@hour=\'12-18\']'].text;
rain1824 = @xml.elements['rainfallchance/period[@hour=\'18-24\']'].text;
rain0006 = sprintf( "%2d", rain0006 ) + '%' if /^\d+$/ =~ rain0006;
rain0612 = sprintf( "%2d", rain0612 ) + '%' if /^\d+$/ =~ rain0612;
rain1218 = sprintf( "%2d", rain1218 ) + '%' if /^\d+$/ =~ rain1218;
rain1824 = sprintf( "%2d", rain1824 ) + '%' if /^\d+$/ =~ rain1824;
rain0006 = '--' if ! rain0006;
rain0612 = '--' if ! rain0612;
rain1218 = '--' if ! rain1218;
rain1824 = '--' if ! rain1824;
weather[4] += rain0006;
weather[5] += rain0612;
weather[6] += rain1218;
weather[7] += rain1824;
end

weather[-1] += "\n";
@@mailContents.push( weather );
end

def Weather.sendmail( to, from )
head = "To: #{to}\n";
head += "From: #{from}\n";
head += "Mime-Version: 1.0\n";
head += "Content-Transfer-Encoding: 7bit\n";
head += "Content-Type: Text/Plain; charset=iso-2022-jp\n";
head += "Subject: WeatherInfo\n";

src = head + "\n" + Kconv.tojis( @@mailContents.join( "\n" ) );

m = Net::SMTPSession.new( address = 'localhost', port = '25' );
m.start();
m.sendmail( src, from, to );
m.finish();
end
end

#############################################################################
getResponse = '';
Net::HTTP.start( getXmlUri.host, getXmlUri.port ) do |http|
getResponse += http.get( getXmlUri.path ).body;
end

xml = REXML::Document.new getResponse;

targetArea = xml.elements['weatherforecast/pref/area[@id=\'西部\']'];

todayWeather = Weather.new( '今日', targetArea.elements['info[1]'] );
tomorrowWeather = Weather.new( '明日', targetArea.elements['info[2]'] );

todayWeather.prepare();
tomorrowWeather.prepare();

toMailAddr.each do |to|
Weather.sendmail( to, from );
end