【PHP】OpenWeatherMapでAPI接続テストをしたやり方と記録

2023.06.02

今回はOpenWeatherMapという天気情報を取得するAPIを利用した接続テストで実験を行ってみたので、その記録を残しておく。

本当は「livedoor天気交換」というAPIを使う予定だったが、こちらは2020年にサービスが終了したようで、現在地はOpenWeatherMapがメジャーな天気関連のAPIとなっている様だ。

OpenWeatherMapに接続するためのコード

今回は無料版を利用し、指定した都市の天気情報を文字情報として取得するところまでを行う。

注意点としては、各自でOpenWeatherMapのサイトで会員登録をしてAPIキーを取得する必要があり、それをPHPのコードに入れる必要があるので、予め取得しておいてもらいたい。

APIキーを取得したら下記のPHPコードを用意し、ブラウザを叩く。

<h1>天気予報投稿</h1>
<br><br><br>
<h2>api(OpneWeather)テスト</h2>

<?php
// OpenWeatherMap API
$apiKey = "文字と数字のAPIキー";//サイトからapiキーを発行して入力
$cityName = "tokyo";//都市名を入れる

$url = "http://api.openweathermap.org/data/2.5/weather?q=$cityName&appid=$apiKey";//都市名、apiキーがパラメーターとして入ったリンクを変数に格納

$response = file_get_contents($url);//指定されたURLからデータを取得しています。これにより、OpenWeatherMapのAPIからの応答が取得される
$data = json_decode($response, true);//urlから取得した情報(元からjson形式になっている)をphp用データとして復元し、配列として格納しています。この配列には、天気情報などのさまざまな情報が含まれている。

if ($data && isset($data['weather'][0]['description'])) {//$dataが存在し、かつ$data['weather'][0]['description']が存在するかどうかをチェック(取得した配列データの中から天気の説明を取得するためのキー)。
    //$dataはAPIから取得したデータを格納した配列。['weather']は天気情報を格納しているキー。[0]は最初の要素を指定。['description']は天気の説明を表すキー。他のキーも使える(json_to~参照)
    $weatherDescription = $data['weather'][0]['description'];//$weatherDescription変数に取得した天気の説明を代入
    echo "Current weather: $weatherDescription";
} else {
    echo "Failed to retrieve weather information.";
}

// ここからはapiで取得したデータ(配列等)の検証用(apiの通信が走るたびに下記のファイルも更新される)
//①取得したjsonデータをローカルのjsonファイルに移植し、配列を確認
$target_dir_json = dirname(__FILE__);//今いるディレクトリ
$target_file_json = $target_dir_json . "/json_to_php.json";//今いるディレクトリにjsonファイル追加
$json_data = json_encode($data);//既にphp用にでコードされているデータをjson用にエンコード
file_put_contents($target_file_json, $json_data);//上記の内容をjsonファイルに置く

//②取得したjsonデータ(既にphp用にデコードしてあるもの)をローカルのphpファイルに移植し、配列を確認
$target_dir_php = dirname(__FILE__);
$target_file_php = $target_dir_php . "/json_to_php.php";
// PHPコードとして配列を書き込む
$file_content = "<?php\n";
$file_content .= var_export($data, true) . ";\n?>"; //var_export()関数を使用して$data配列をPHPコードの文字列に変換し、$file_contentに追加。※.=のドットは既存の文字列に新しい文字列を追加するために使用(お作法)
file_put_contents($target_file_php, $file_content);
?>

ちなみに、実装するだけなら7~21行目だけでも可能であり、それ以降の行はjsonデータを確認するために作ったものだ(後ほど解説)

7~21行目をざっくりと解説すると、下記のような仕組みになっている。

  • ①各自のAPIキーと任意の都市名をパラメーターとして入力し、OpenWeatherMapと通信
  • ②通信の結果URLからデータを取得
  • ③配列として復元したデータから天気情報と説明文を取得し、条件分岐をつけて画面に表示

関数の意味などは細かくコメントアウトしているので、そちらを参考にしてもらいたい。

※注意点としてAPIキーは発行後すぐには反映されず、数時間以内にアクティベートされるっぽい。それまではFailed to retrieve weather information.のエラーが出ることになる。

受け取ったjsonデータを確認してみる

先ほど少し触れたが、APIキーと都市情報をサービス側に送ることで、URLから取得したデータ(json形式)を受け取ることができる。

そのデータをPHPの連想配列データとして復元し、処理を行っているのだ(12、13行目)。

ここではそのその受け取ったjsonの中身とPHPに変換したときの中身をあえて記録する実験をしてみる。

まずは受けっとたjsonデータの内容は下記の通りだ。

{
    "coord": {
        "lon": 139.6917,
        "lat": 35.6895
    },
    "weather": [
        {
            "id": 520,
            "main": "Rain",
            "description": "light intensity shower rain",
            "icon": "09n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 290.62,
        "feels_like": 290.41,
        "temp_min": 287.45,
        "temp_max": 292.94,
        "pressure": 1005,
        "humidity": 76
    },
    "visibility": 10000,
    "wind": {
        "speed": 8.75,
        "deg": 40
    },
    "rain": {
        "1h": 2.73
    },
    "clouds": {
        "all": 75
    },
    "dt": 1684763403,
    "sys": {
        "type": 2,
        "id": 2001249,
        "country": "JP",
        "sunrise": 1684697520,
        "sunset": 1684748639
    },
    "timezone": 32400,
    "id": 1850144,
    "name": "Tokyo",
    "cod": 200
}

weather.phpの25~28行目にてPHP連想配列用にエンコードしたjsonデータを逆にでコードし、復元している。

そして31~36行目にてその既にPHP連想配列用にエンコードされているデータをjson_to_php.phpというファイルを作成し、file_put_contents関数で移植してみる。

<?php
array (
  'coord' => 
  array (
    'lon' => 139.6917,
    'lat' => 35.6895,
  ),
  'weather' => 
  array (
    0 => 
    array (
      'id' => 520,
      'main' => 'Rain',
      'description' => 'light intensity shower rain',
      'icon' => '09n',
    ),
  ),
  'base' => 'stations',
  'main' => 
  array (
    'temp' => 290.26,
    'feels_like' => 289.96,
    'temp_min' => 287.45,
    'temp_max' => 292.38,
    'pressure' => 1005,
    'humidity' => 74,
  ),
  'visibility' => 10000,
  'wind' => 
  array (
    'speed' => 8.75,
    'deg' => 40,
  ),
  'rain' => 
  array (
    '1h' => 0.58,
  ),
  'clouds' => 
  array (
    'all' => 75,
  ),
  'dt' => 1684764717,
  'sys' => 
  array (
    'type' => 2,
    'id' => 2001249,
    'country' => 'JP',
    'sunrise' => 1684697520,
    'sunset' => 1684748639,
  ),
  'timezone' => 32400,
  'id' => 1850144,
  'name' => 'Tokyo',
  'cod' => 200,
);
?>

上記のように問題なくjsonデータを受け取り、それをPHPの連想配列として格納することができていることが確認できた。

ちなみに、上記2ファイルは通信を行う(URLを叩く等)をすれば自動で更新されるが、実験用なので不必要ならば消してもらってオッケー。

OpenWeatherMapのAPI実験・まとめ

今回は無料版OpenWeatherMap APIで実験を行ってみたが、有料プランでの利用も可能だ。その場合、さらに多くの機能を扱うことも可能らしいので、そちらもいずれ実験してみたい。

PIC UP