トップ » 技術記事 » 毎朝天気予報をメールするスクリプトの製作

毎朝天気予報をメールするスクリプトの製作 はてなブックマーク数 このエントリーをブックマークに追加

今回は、PHP を使って、天気予報を毎朝メール送信してくれるスクリプトを作成してみたいと思います。PHP は、Webページを動的生成するのに便利なプログラミング言語ですが、これをバッチ処理に使うこともできます。いまや、天気予報に関連するプログラムは、Web APIを利用することで簡単に作ることができます。そこで、これを利用して、毎朝、携帯電話に天気予報を通知するプログラムを作ってみます。

問題:天気予報を知りたいだけなのにパソコンを起動しないといけないのか?

今朝、中学校にあがった娘から次のように頼まれました。「今日、雨降るかな?ネットで天気予報調べてみてよ。」私は、お安い御用だとパソコンを起動しました。ところが、パソコンの電源を入れると、ガリガリと時間がかかり、朝の忙しい時間に、私は若干イライラして起動を待ちました。パスワードを入力して、ようやくログインすると、ウィルス対策ソフトが、ウィルス定義ファイルを更新しはじめたのです。かなりの時間を浪費した後、ようやく天気予報のページを開くことができました。そして、予報結果を伝えようと思ったのですが、娘は既に家を出かけてしまった後でした。

これはフィクションですが(笑)、毎朝、天気予報を知りたい場面は多くあります。ニュースを見れば教えてくれるのですが、なかなかニュースを見ている時間もないときもあります。携帯電話が便利なのは、情報を直接手元まで届けてくれることです。そこで、毎朝7時頃にメールで携帯電話に天気予報を通知してくれるスクリプトを作ってみたいと思います。

天気予報の RSS を利用しよう

ちょっと前ならば、気象庁のページか、どこかのニュースサイトにある天気予報のHTMLをダウンロードして、そのページ情報を解析して天気予報の情報を抜き出してみないといけなかったのですが、今は便利なことに、既に RSS (或いは、Web API)として天気予報の情報が各所から配布されています。

さっそく検索エンジンで「天気予報 RSS」のキーワードで調べてみると、さまざまなRSSが見つかります。残念ながら、本家?の気象庁からは、RSSが配信されていませんが、goo や、livedoor、Yahoo! のページがヒットします。

しかし、これらのサイトから配信されている RSS には、情報の偏りがあります。そこで、どんな情報が RSS に記録されているかまとめてみました。

天気予報の RSS を配布しているサイトまとめ(2008/1/29調べ)
サイト名 予報 気温 週間 降水確率
goo天気 × × ×
kenbo.net ×
Weather Hacks ×
ひとくち予報
Yahoo!天気情報 ×
drk7.jp

ここから、お天気キャスターや気象予報士によるオリジナルのお天気解説がついている「ひとくち予報」と、個人で気象庁の情報を変換している「drk7.jp」のサイトの情報が、魅力的だと思いました。

そこで、今回は、drk7.jp の情報を元に天気予報を携帯電話にメールしてみようと思います。

プログラムの手順

では、お天気情報のソースを取ってきて携帯電話にメールするまでの流れをまとめてみようと思います。プログラムの流れは次のようになるでしょう。

  • 1. RSS をダウンロードする
  • 2. RSS を解析して必要な情報を得る
  • 3. メールの形式にするために整形する
  • 4. メールを送信する

この中で、RSS を解析するのが大変そうなのですが、PHP に XML を解析するのに便利なライブラリが用意されているので、これを利用すればなんとかなりそうです。プログラムを組むのに、PHP を選んだのは、なんとなくです。Javaでも、Perlでも、なでしこでも何でも良かったのですが、最近、PHPを触ることが多いので、PHPで作ることにしました。

プログラムは、以下よりダウンロードすることができます。

※なお、RSS の形式が変わってしまったときなどは、情報がうまくとれなくなるので、その際は本稿の解説を読んでプログラムを変更してみてください。

ちなみに、なでしこで作ったものがあり、以下の記事が参考になります。

  • 日経 PCオンライン - RSSを使って天気予報をメールするプログラムを作ろう
RSS のダウンロードと解析

RSSの解析には、PHP のライブラリ「SimpleXML」を使いました。これを使うと、次のような簡単な一文で、RSSのダウンロードと解析を行うことができます。

<?php
$area_xml = "http://www.drk7.jp/weather/xml/14.xml";
$xml =  simplexml_load_file($area_xml);
?>

どんな情報が取れたのか、画面に表示するには、次のように書きます。

<?php
$area_xml = "http://www.drk7.jp/weather/xml/14.xml";
$xml =  simplexml_load_file($area_xml);
echo '<pre>';
print_r($xml);
?>

プログラムの実行結果

ちなみに、元のRSSは以下のような形式になっています。

RSSの形式

そして、天気予報のXMLの要素にアクセスするには、「$xml->pref->area[0]->info..」のようにXMLの階層を「->」でたどることができます。例えば、その日の天気の概要を知りたければ、次のようなプログラムで取り出すことができます。

<?php
$area_xml = "http://www.drk7.jp/weather/xml/14.xml";
$xml  =  simplexml_load_file($area_xml);
$info = $xml->pref->area[0]->info[0];
echo "weather:".$info->weather;
?>

この XML の中で、地域を表す area や 情報を表す info には複数の値が含まれています。こうした複数の値を持つ要素には、配列アクセスで、area[0] や info[1] のようにして取得できます。

ただし、SimpleXMLを使っていてちょっと面倒だなと感じたのが次の属性の取得です。例えば、pref->area の一番はじめの要素の、id を取得してみます。このためには、次のようなプログラムを記述します。

<pre><?php
#$area_xml = "http://www.drk7.jp/weather/xml/14.xml";
$area_xml = "14.xml";
$xml  = simplexml_load_file($area_xml);
$attr = $xml->pref->area[0]->attributes(); // ←ここがポイント
echo $attr["id"];
?>

実行結果は「東部」と表示されました。このように、属性の必要なノードに対して「ノード->attributes()」と書くと、属性を取得することができるのです。

ちなみに、プログラムを作るときは、XMLファイルをローカルにダウンロードしてテストすると、テストも楽になりますし、何度もサーバにアクセスして、サーバに迷惑をかけることもありません。

メール形式に整形する

そして、こうして解析したRSSデータをメールの本文に埋め込みます。メールを開いたときに読みやすいように、半角22文字程度になるように配慮して、以下のように変数の値を埋め込んで表示するようにしました。

$body = <<<__EOS
日付:{$date}
天気:{$info->weather}
確率:{$chance}%(6h毎)
気温:{$temp}度
詳細:{$info->weather_detail}
週間予報:
{$week}
__EOS;

週間予報までばっちり送ってくるのですが、私はソフトバンクを使っており、ソフトバンクだと、通知メールに半角384文字までの制限があり、それより長い文章だと、以降は改めて受信しなくてはなりません。そこで、週間予報を入れると文字数をオーバーしてしまうので、はじめの3日分だけ表示されるようにしています。携帯電話にメールを送る場合は、できるだけパケット料金がかからないように1バイトでも本文を削る工夫が必要になるでしょう。

メールの送信

そして、メールの送信ですが、PHPには、日本語のメールを送るのに便利な「mb_send_mail」という関数があるので、これを利用します。メールの送信は、以下のように書きます。

$subject = "天気予報".$date;
$header  = "From:<{$mailfrom}>";
mb_send_mail($mailto, $subject, $body, $header);

「mb_send_mail()」の引数には、1つ目に宛先、2つ目に件名、3つ目に本文、そして、4つ目には、From などの送信ヘッダを指定します。

cron に登録して毎朝実行~Linux編

そして、プログラムが完成したら、定期的にこのスクリプトが実行されるように、cron に登録します。このとき、PHP がコマンドラインから動くように、PHPのプログラムの冒頭に「#!/usr/local/bin/php」のようなPHPのパスをつけます。PHPのパスが分からない場合は「which php」で表示されるパスを「#!」の後ろに記述します。

#!/usr/local/bin/php
<?php
mb_language("ja");
mb_internal_encoding("UTF-8");
//...

cron が動いているかコマンドから確認してみましょう。

/etc/rc.d/init.d/crond status

動いていなければ、次のコマンドを入力して起動します。。

/etc/rc.d/init.d/crond start

毎朝、7時にコマンドを実行するように、/etc/crontab を編集します。このファイルを直接編集することは推奨されていないため、crontab コマンドを使って編集を行います。

crontab -e

設定ファイルの最後に、以下の行を追加します。

0  7 * * * root run-parts /etc/cron.daily7

これで、毎朝7時に、/etc/cron.daily7 のディレクトリにあるスクリプトが実行されます。

まとめ

以上、天気予報を毎朝メールするスクリプトを作ってみました。製作時間は2時間以内でしたが、毎朝携帯電話にメールが届き非常に便利です。


このサイトについて

八角研究所
株式会社八角研究所のWEBサイトですよー。 いろんなものを創り出すことのできる環境をコツコツ構築中。 いったい、いつになったらできるのか。 この技術情報サイトもそのための活動の一環のつもり。

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :

参考にさせていただきました!

if ($date === $wdate){
では、文字列の一致は判定できませんでした。
いろいろありますが、下記で正常に動作しました。
if (strcmp($date,$wdate) == 0)