OpenWeather API で天気予報を取得する

天気予報をウェブアプリに組み込みたいなーと思い、Web API で取得する方法を調べていた。気象庁のサイトに掲載されている天気予報はスクレイピングが必要そうなので却下。Dark Sky というサイトが REST API を公開していたのだが、Apple が買収したためか、現在は API を利用するためのアカウント登録ができなくなっていた。

残るは OpenWeather というサイトの API。Dark Sky より精度が劣る印象だが、無料の会員登録だけで使える天気予報 API としてはココくらいしかないので、とりあえず試してみる。

目次

OpenWeather に登録する

まずは上の公式サイトにアクセスし、アカウントを作成する。するとメンバーページで既にデフォルトの API Key が発行されているので、コレを取得しておく。

curl で API をコールしてみる

API のコールは以下のように行える。

$ curl 'http://api.openweathermap.org/data/2.5/forecast?q=Tokyo,jp&units=metric&appid=【API Key】'

API の詳細は以下を参照。

結果は JSON 形式なので、jq で整形したりすると良いだろう。以下は抜粋。

{
  "cod": "200",
  "message": 0,
  "cnt": 40,
  "list": [
    {
      "dt": 1606705200,
      "main": {
        "temp": 12.46,
        "feels_like": 7.42,
        "temp_min": 12.46,
        "temp_max": 12.46,
        "pressure": 1024,
        "sea_level": 1024,
        "grnd_level": 1019,
        "humidity": 40,
        "temp_kf": 0
      },
      "weather": [
        {
          "id": 800,
          "main": "Clear",
          "description": "clear sky",
          "icon": "01d"
        }
      ],
      "clouds": {
        "all": 0
      },
      "wind": {
        "speed": 4.2,
        "deg": 360
      },
      "visibility": 10000,
      "pop": 0,
      "sys": {
        "pod": "d"
      },
      "dt_txt": "2020-11-30 03:00:00"
    },
    // …略…
  ],
  "city": {
    "id": 1850144,
    "name": "Tokyo",
    "coord": {
      "lat": 35.6895,
      "lon": 139.6917
    },
    "country": "JP",
    "population": 12445327,
    "timezone": 32400,
    "sunrise": 1606253224,
    "sunset": 1606289385
  }
}

予想時刻、天気、気温をざっと抽出してみると、以下のようになった。

$ curl -sS 'http://api.openweathermap.org/data/2.5/forecast?q=Tokyo,jp&units=metric&appid=【API Key】' | jq -r '.list | map((.dt | .+32400 | todate) + " : " + .weather[0].main + " : " + (.main.temp | tostring))[]'
2020-11-25T15:00:00Z : Clouds : 13.23
2020-11-25T18:00:00Z : Clouds : 13.55
2020-11-25T21:00:00Z : Clouds : 13.58
2020-11-26T00:00:00Z : Clouds : 13.69
2020-11-26T03:00:00Z : Clouds : 13.52
2020-11-26T06:00:00Z : Clouds : 12.87
2020-11-26T09:00:00Z : Clouds : 13.69
2020-11-26T12:00:00Z : Clouds : 15.81
2020-11-26T15:00:00Z : Clouds : 16.85
2020-11-26T18:00:00Z : Clouds : 16.26
2020-11-26T21:00:00Z : Clouds : 15.34
2020-11-27T00:00:00Z : Clouds : 14.66
2020-11-27T03:00:00Z : Clouds : 14.13
2020-11-27T06:00:00Z : Rain : 13.36
2020-11-27T09:00:00Z : Rain : 11.75
2020-11-27T12:00:00Z : Rain : 11.49
2020-11-27T15:00:00Z : Rain : 11.46
2020-11-27T18:00:00Z : Clouds : 11.49
2020-11-27T21:00:00Z : Rain : 11.47
2020-11-28T00:00:00Z : Rain : 11.53
2020-11-28T03:00:00Z : Clouds : 11.39
2020-11-28T06:00:00Z : Clouds : 11.12
2020-11-28T09:00:00Z : Clouds : 13.09
2020-11-28T12:00:00Z : Clear : 14.96
2020-11-28T15:00:00Z : Clear : 13.83
2020-11-28T18:00:00Z : Clouds : 11.81
2020-11-28T21:00:00Z : Clouds : 10.57
2020-11-29T00:00:00Z : Clouds : 10.31
2020-11-29T03:00:00Z : Clouds : 10.01
2020-11-29T06:00:00Z : Clouds : 9.37
2020-11-29T09:00:00Z : Clouds : 9.61
2020-11-29T12:00:00Z : Clouds : 10.46
2020-11-29T15:00:00Z : Clouds : 11.22
2020-11-29T18:00:00Z : Clouds : 10.29
2020-11-29T21:00:00Z : Clear : 10.08
2020-11-30T00:00:00Z : Clear : 9.75
2020-11-30T03:00:00Z : Clear : 9.3
2020-11-30T06:00:00Z : Clear : 8.86
2020-11-30T09:00:00Z : Clear : 10.01
2020-11-30T12:00:00Z : Clear : 12.46

dt がエポック秒、dt_txt がそれの UTC 文字列表記なので、9時間 (32400秒) 足して JST にして表示している。

天気と気温は大きくは外れていないようだが、精度が高いともいえないかな。簡易的に知るぐらいならコレでいいかも。