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】'
q=
パラメータ部分で場所を指定する。OpenWeather のサイト上で狙った土地が検索できたら、その文言を使うと良いだろうunits=metric
で摂氏 (℃) 表記になる。指定しないと華氏 (°F) 表記になる
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 にして表示している。
天気と気温は大きくは外れていないようだが、精度が高いともいえないかな。簡易的に知るぐらいならコレでいいかも。