アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

OpenWeatherMapから近い天気予報を取得するロジック

弊社の社内ポータルサイト的なやつに天気予報を載せてるのですが
(いや、そんなもんいらなくね? というツッコミはめんどくさいのでやらない)
それが軽くバグってたのでこっそり修正しつつロジックまとめておく。

天気予報は外部APIから取得しています。
http://openweathermap.org/
こちら。英語ですが(使い方は)そんな難しくないのでなんとかなる。

要件ざっくり

会社付近の天気予報を載せる。だけ。
はれ、くもり、あめ くらいが分かればいい超ざっくり仕様。
やっぱりなくていいんじゃ…

準備:APIキーを取得

  • 先述のサイトの上部メニューから「API」を選択
  • 欲しいデータの「Subscribe」を選択
  • 名前とメールアドレスとパスワードを入力して登録
    • 確認メールが届いたりはしません
  • 表示されるAPIキーを確保
    • 一応外部に漏れないよう注意

欲しいデータが取れるパラメータを設定

URLをコールして取得して整形してどうこうする

// APIのURL
$url = "http://api.openweathermap.org/data/2.5/forecast?zip=100-0000,JP&APPID=***";

// HTTP_Requestで取得し配列化
$option = array(
    'timeout' => 1,
    'readTimeout' =>array(3, 0),
);
$http_request = new HTTP_Request($this->config->weather_api_url, $option);
$http_request->sendRequest();
$json = $http_request->getResponseBody();
$weather_list = json_decode($json, true);

// 結果を整形
if (!is_array($weather_list['list']))
{
    // list階層がない場合のエラー処理とか
}
else
{
    // list階層には3時間ごとの天気が日時昇順で入っているようなので、
    // 順番に確認して、現在日時以降のが引っ掛かればそれを使う
    // (仕様が変わったらしぬ)
    foreach ($weather_list['list'] as $list)
    {
        if (strtotime($list['dt_txt']) >= time())
        {
            $now_list = $list;
            break;
        }
    }

    // 対象の情報に対して、晴れ・雨・それ以外の3種類にざっくり分類
    // (ここではアイコンの種類で判別)
    switch (substr($now_list['weather'][0]['icon'], 0, 2))
    {
        case "01":
        case "02":
            // 晴れのときの処理
            break;

        case "09":
        case "10":
        case "13":
            // 雨のときの処理
            break;

        default:
            // それ以外の処理(くもりとする)
            break;
    }
}

ちなみにアイコン一覧はこちら。
http://openweathermap.org/weather-conditions