理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

天気予報をスクレイピングして毎日携帯にメールできるようにしてみる

動機

スクレイピングでなにをするかなーって思って,ぼくは気象庁から天気予報をブッこぬいてきて,毎日携帯電話にメールできたら便利だなーって考えました.ぼくは日々テキトーに生きているので,天気予報とか見ずに屋外に飛び出した結果,ズブ濡れになって帰ってくるような状況になることがあるのです.

大学生のときにはアメール - あなたのケータイへ雨が降る前にお知らせ!というサービスを利用していて,これは毎朝降水確率をメールしてくれるサービスでとても便利です.ところが,指定できる配信時刻は午前 7 時が一番早くて,社会人となったぼくはその時間には会社へと飛び出している.結果としてアメールはぼくがズブ濡れにならないような方向にはなんの貢献もしてくれなくなっちゃって,困ったものだ!

もちろん聡明なみなさんは,天気予報を見ればいいじゃんとか,117 (177?)に電話すればいいじゃんとか思ったことでしょう.しかし,天気予報を見るのはメンドい.ずっと天気予報をしてくれてればいいのに,ワイドショーをやってたり,黄色い爺さんが諸国を放浪していたりと,みんながぼくをジャマをします!! ムカつく!

それに能動的な行動を取るというのはメンドいので,いつしか人間は受動的な方向に流れていきます.つまり,ぼくがいくら毎日天気予報を見ようとおもっても,いつしか天気予報を見るのがメンドくなっちゃって,結果として屋外に飛び出した後にズブ濡れになってしまうのは避けられない.

ぼくが気象庁から天気予報を拝借したのちに,携帯にメールさせようというのは,そういう大変な事情があるのです.

プログラム

プログラムはこんな感じですね.あんまし長くなくてよかった!
同じような部分からデータを取るときに, Web::Scraper に下のように渡すのはどうなのかなって思いましたけど,ほかに方法が思いうかばなかった.

それと,ぼくは sakura の SMTP サーバを使わせてもらうつもりだったんですけど,ムカつく事情とかがあって gmailSMTP(S) サーバを使うことになってしまった.

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Web::Scraper;
use Encode;
use URI;
use Net::SMTP::TLS;

# 千葉県北西部の天気予報ページ
my $uri = URI->new( "http://www.jma.go.jp/jp/yoho/318.html" );

# 降水確率などを取得
my $s = scraper {
    process 'table[class="forecast"] table[class="rain"] td[align="left"]',
        'time[]' => 'TEXT';
    process 'table[class="forecast"] table[class="rain"] td[align="right"]',
        'rain[]' => 'TEXT';
    process_first 'table[class="forecast"] td[class="temp"] td[class="min"]',
        'min' => 'TEXT';
    process_first 'table[class="forecast"] td[class="temp"] td[class="max"]',
        'max' => 'TEXT';
    result qw(time rain min max);
};
my $result = $s->scrape( $uri );

# メール情報
my $from = 'gmail address'
my $to   = 'mobile phone address'
my $subject = 'weather news';

# メールヘッダの生成
my $header = <<HEADER;
From: $from
To: $to
Subject: $subject
Content-Type: text/plain; charset="utf-8"

HEADER

# 本文の作成
my $msg = <<WEATHER;
[降水確率]
$result->{time}[0]: $result->{rain}[0]
$result->{time}[1]: $result->{rain}[1]
$result->{time}[2]: $result->{rain}[2]
[気温]
min: $result->{min}
max: $result->{max} 


WEATHER

# メール送信
my $mailer = new Net::SMTP::TLS(
    'smtp.gmail.com',
    Hello        => 'address',
    Port         => 587,
    User         => $from,
    Password     => 'gmail password',
    ExactAddress => 1,
);
$mailer->mail( $from );
$mailer->to( $to );
$mailer->data;
$mailer->datasend( $header );
$mailer->datasend( $msg );
$mailer->dataend;
$mailer->quit;