以前、話題になっていた以下の情報取得の話について、自分が仕様を理解するためや、後で見返したくなりそうな情報をまとめてメモしておく意味で記事を書きます。
一番伸びてるのはこれかしら。仕様の継続性や運用状況のお知らせを気象庁はお約束していないという意味で、APIではないと申し上げざるを得ないのですが、一方で政府標準利用規約に準拠してご利用いただけます。 https://t.co/QLuhI4DNDv
— TOYODA Eizi (@e_toyoda) February 24, 2021
記事に書いた内容
この記事で書いた内容は、主に以下です。
- 天気予報の取得方法
- URL
- 地域の指定
- 取得できる JSON の構造
- 取得した情報の処理
- 一部のみを取り出してみる
気象庁が提供している情報を取得する
天気予報の情報を取得
いろいろなサイト・SNS上の投稿に情報がありますが、以下のページを参照して進めてみます。
●新しい気象庁サイトからJSONデータが取得できる件 | MindTech
https://mindtech.jp/?p=1754
まずは、気象庁のページをいくつか見てみます。
以下に、いくつか書きだしてみます。
それでは、地域のみ指定したJSONの情報取得を見ていきます。
以下は、地域を東京都(130000)に指定しただけで情報を取得したもののようで、ブラウザの URL欄から開けば、JSON で情報を取得することができます。
https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json
こちらは、その日を含めた3日分の情報と1週間分の情報、といった内容が取得できるようです。
curl で情報を取得してファイルに保存する
上記の JSON の情報を curl で取得して、ファイルに保存してみます。
curl 'https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json' > wf_130000.json
ここに取得できた情報を掲載します(長いので掲載部分を折りたためる形にしました)。
こちらは、ダウンロードしたファイルを JSON閲覧用のアプリで開き、そこで整形された後の内容を掲載しています。
[
{
"publishingOffice": "気象庁",
"reportDatetime": "2021-11-06T17:00:00+09:00",
"timeSeries": [
{
"timeDefines": [
"2021-11-06T17:00:00+09:00",
"2021-11-07T00:00:00+09:00",
"2021-11-08T00:00:00+09:00"
],
"areas": [
{
"area": {
"name": "東京地方",
"code": "130010"
},
"weatherCodes": [
"111",
"200",
"200"
],
"weathers": [
"晴れ 夜 くもり",
"くもり 昼前 から 昼過ぎ 晴れ",
"くもり"
],
"winds": [
"北東の風",
"北の風 後 北東の風",
"北の風 後 東の風"
],
"waves": [
"0.5メートル",
"0.5メートル",
"0.5メートル"
]
},
{
"area": {
"name": "伊豆諸島北部",
"code": "130020"
},
"weatherCodes": [
"200",
"203",
"202"
],
"weathers": [
"くもり 所により 雨 で 雷を伴う",
"くもり 時々 雨 所により 昼前 まで 雷を伴い 激しく 降る",
"くもり 一時 雨"
],
"winds": [
"北東の風 やや強く",
"北東の風 やや強く",
"東の風 やや強く"
],
"waves": [
"2.5メートル うねり を伴う",
"2メートル 後 2.5メートル うねり を伴う ただし 新島 では 2.5メートル 後 3メートル うねり を伴う",
"2.5メートル 後 3メートル うねり を伴う ただし 新島 では 3メートル うねり を伴う"
]
},
{
"area": {
"name": "伊豆諸島南部",
"code": "130030"
},
"weatherCodes": [
"214",
"203",
"202"
],
"weathers": [
"くもり 夜遅く 雨 所により 雷 を伴う",
"くもり 時々 雨 所により 昼前 まで 雷を伴い 激しく 降る",
"くもり 一時 雨"
],
"winds": [
"東の風 やや強く",
"東の風 やや強く 後 強く",
"東の風 強く"
],
"waves": [
"3メートル うねり を伴う",
"3メートル 後 4メートル うねり を伴う ただし 三宅島 では 3メートル うねり を伴う",
"4メートル 後 5メートル うねり を伴う ただし 三宅島 では 3メートル 後 4メートル うねり を伴う"
]
},
{
"area": {
"name": "小笠原諸島",
"code": "130040"
},
"weatherCodes": [
"200",
"214",
"203"
],
"weathers": [
"くもり",
"くもり 昼過ぎ から 雨 所により 雷 を伴う",
"くもり 時々 雨"
],
"winds": [
"東の風",
"東の風 後 南東の風 やや強く",
"南の風 やや強く 後 南西の風 やや強く"
],
"waves": [
"2.5メートル うねり を伴う",
"2.5メートル 後 3メートル うねり を伴う",
"4メートル うねり を伴う"
]
}
]
},
{
"timeDefines": [
"2021-11-06T18:00:00+09:00",
"2021-11-07T00:00:00+09:00",
"2021-11-07T06:00:00+09:00",
"2021-11-07T12:00:00+09:00",
"2021-11-07T18:00:00+09:00"
],
"areas": [
{
"area": {
"name": "東京地方",
"code": "130010"
},
"pops": [
"10",
"20",
"10",
"10",
"20"
]
},
{
"area": {
"name": "伊豆諸島北部",
"code": "130020"
},
"pops": [
"40",
"60",
"60",
"50",
"50"
]
},
{
"area": {
"name": "伊豆諸島南部",
"code": "130030"
},
"pops": [
"50",
"60",
"60",
"50",
"40"
]
},
{
"area": {
"name": "小笠原諸島",
"code": "130040"
},
"pops": [
"20",
"30",
"40",
"60",
"60"
]
}
]
},
{
"timeDefines": [
"2021-11-07T00:00:00+09:00",
"2021-11-07T09:00:00+09:00"
],
"areas": [
{
"area": {
"name": "東京",
"code": "44132"
},
"temps": [
"11",
"19"
]
},
{
"area": {
"name": "大島",
"code": "44172"
},
"temps": [
"14",
"18"
]
},
{
"area": {
"name": "八丈島",
"code": "44263"
},
"temps": [
"16",
"21"
]
},
{
"area": {
"name": "父島",
"code": "44301"
},
"temps": [
"22",
"25"
]
}
]
}
]
},
{
"publishingOffice": "気象庁",
"reportDatetime": "2021-11-06T17:00:00+09:00",
"timeSeries": [
{
"timeDefines": [
"2021-11-07T00:00:00+09:00",
"2021-11-08T00:00:00+09:00",
"2021-11-09T00:00:00+09:00",
"2021-11-10T00:00:00+09:00",
"2021-11-11T00:00:00+09:00",
"2021-11-12T00:00:00+09:00",
"2021-11-13T00:00:00+09:00"
],
"areas": [
{
"area": {
"name": "東京地方",
"code": "130010"
},
"weatherCodes": [
"200",
"200",
"203",
"101",
"101",
"101",
"101"
],
"pops": [
"",
"40",
"70",
"20",
"20",
"20",
"20"
],
"reliabilities": [
"",
"",
"A",
"A",
"A",
"A",
"A"
]
},
{
"area": {
"name": "伊豆諸島北部",
"code": "130020"
},
"weatherCodes": [
"203",
"202",
"203",
"201",
"101",
"201",
"201"
],
"pops": [
"",
"50",
"70",
"30",
"20",
"20",
"20"
],
"reliabilities": [
"",
"",
"A",
"A",
"A",
"B",
"A"
]
},
{
"area": {
"name": "伊豆諸島南部",
"code": "130030"
},
"weatherCodes": [
"203",
"202",
"203",
"200",
"200",
"200",
"201"
],
"pops": [
"",
"50",
"70",
"40",
"40",
"30",
"30"
],
"reliabilities": [
"",
"",
"A",
"C",
"B",
"C",
"B"
]
},
{
"area": {
"name": "小笠原諸島",
"code": "130040"
},
"weatherCodes": [
"214",
"203",
"201",
"201",
"201",
"200",
"200"
],
"pops": [
"",
"60",
"20",
"20",
"20",
"30",
"30"
],
"reliabilities": [
"",
"",
"B",
"A",
"A",
"B",
"C"
]
}
]
},
{
"timeDefines": [
"2021-11-07T00:00:00+09:00",
"2021-11-08T00:00:00+09:00",
"2021-11-09T00:00:00+09:00",
"2021-11-10T00:00:00+09:00",
"2021-11-11T00:00:00+09:00",
"2021-11-12T00:00:00+09:00",
"2021-11-13T00:00:00+09:00"
],
"areas": [
{
"area": {
"name": "東京",
"code": "44132"
},
"tempsMin": [
"",
"12",
"15",
"12",
"10",
"10",
"9"
],
"tempsMinUpper": [
"",
"14",
"17",
"14",
"12",
"12",
"12"
],
"tempsMinLower": [
"",
"9",
"14",
"10",
"8",
"8",
"7"
],
"tempsMax": [
"",
"19",
"20",
"21",
"20",
"20",
"18"
],
"tempsMaxUpper": [
"",
"20",
"25",
"24",
"23",
"22",
"21"
],
"tempsMaxLower": [
"",
"16",
"19",
"18",
"17",
"16",
"14"
]
},
{
"area": {
"name": "大島",
"code": "44172"
},
"tempsMin": [
"",
"15",
"17",
"15",
"14",
"14",
"13"
],
"tempsMinUpper": [
"",
"16",
"19",
"17",
"16",
"16",
"15"
],
"tempsMinLower": [
"",
"13",
"15",
"14",
"12",
"12",
"11"
],
"tempsMax": [
"",
"20",
"21",
"20",
"18",
"18",
"18"
],
"tempsMaxUpper": [
"",
"23",
"22",
"22",
"20",
"20",
"21"
],
"tempsMaxLower": [
"",
"18",
"19",
"18",
"16",
"16",
"16"
]
},
{
"area": {
"name": "八丈島",
"code": "44263"
},
"tempsMin": [
"",
"16",
"18",
"16",
"16",
"16",
"16"
],
"tempsMinUpper": [
"",
"18",
"20",
"18",
"17",
"18",
"18"
],
"tempsMinLower": [
"",
"14",
"16",
"15",
"14",
"14",
"14"
],
"tempsMax": [
"",
"21",
"23",
"21",
"20",
"19",
"20"
],
"tempsMaxUpper": [
"",
"23",
"24",
"22",
"22",
"21",
"22"
],
"tempsMaxLower": [
"",
"20",
"21",
"19",
"18",
"18",
"18"
]
},
{
"area": {
"name": "父島",
"code": "44301"
},
"tempsMin": [
"",
"22",
"23",
"22",
"22",
"22",
"22"
],
"tempsMinUpper": [
"",
"23",
"24",
"24",
"23",
"23",
"23"
],
"tempsMinLower": [
"",
"20",
"21",
"21",
"20",
"21",
"20"
],
"tempsMax": [
"",
"26",
"28",
"27",
"26",
"26",
"26"
],
"tempsMaxUpper": [
"",
"27",
"29",
"28",
"27",
"28",
"27"
],
"tempsMaxLower": [
"",
"25",
"27",
"26",
"25",
"25",
"24"
]
}
]
}
],
"tempAverage": {
"areas": [
{
"area": {
"name": "東京",
"code": "44132"
},
"min": "9.9",
"max": "17.8"
},
{
"area": {
"name": "大島",
"code": "44172"
},
"min": "12.3",
"max": "18.7"
},
{
"area": {
"name": "八丈島",
"code": "44263"
},
"min": "15.0",
"max": "20.8"
},
{
"area": {
"name": "父島",
"code": "44301"
},
"min": "22.2",
"max": "26.4"
}
]
},
"precipAverage": {
"areas": [
{
"area": {
"name": "東京",
"code": "44132"
},
"min": "4.6",
"max": "23.7"
},
{
"area": {
"name": "大島",
"code": "44172"
},
"min": "16.6",
"max": "56.3"
},
{
"area": {
"name": "八丈島",
"code": "44263"
},
"min": "39.3",
"max": "83.5"
},
{
"area": {
"name": "父島",
"code": "44301"
},
"min": "7.4",
"max": "30.7"
}
]
}
}
]
地域を指定する
地域の指定は、こちらを見れば良いようです。
https://www.jma.go.jp/bosai/common/const/area.json
他に、例えば埼玉の情報を取得するには、以下になるようです。
https://www.jma.go.jp/bosai/forecast/data/forecast/110000.json
curl で取得2(地域の指定を変える)
こちらの埼玉の情報を、先ほどと同様に curl で取得してファイルに保存してみます。
curl 'https://www.jma.go.jp/bosai/forecast/data/forecast/110000.json' > wf_110000.json
ここに取得できた情報を掲載します(長いので掲載部分を折りたためる形にしました)。
こちらも、ダウンロードしたファイルを JSON閲覧用のアプリで開き、そこで整形された後の内容を掲載しています。
[
{
"publishingOffice": "熊谷地方気象台",
"reportDatetime": "2021-11-06T17:00:00+09:00",
"timeSeries": [
{
"timeDefines": [
"2021-11-06T17:00:00+09:00",
"2021-11-07T00:00:00+09:00",
"2021-11-08T00:00:00+09:00"
],
"areas": [
{
"area": {
"name": "北部",
"code": "110020"
},
"weatherCodes": [
"111",
"201",
"200"
],
"weathers": [
"晴れ 夜遅く くもり",
"くもり 朝 から 昼過ぎ 晴れ",
"くもり"
],
"winds": [
"東の風",
"北西の風 後 南東の風",
"北の風 後 東の風"
]
},
{
"area": {
"name": "南部",
"code": "110010"
},
"weatherCodes": [
"111",
"201",
"200"
],
"weathers": [
"晴れ 夜遅く くもり",
"くもり 朝 から 昼過ぎ 晴れ",
"くもり"
],
"winds": [
"東の風 後 北の風",
"北の風",
"北の風 後 東の風"
]
},
{
"area": {
"name": "秩父地方",
"code": "110030"
},
"weatherCodes": [
"111",
"201",
"200"
],
"weathers": [
"晴れ 夜遅く くもり",
"くもり 朝 から 昼過ぎ 晴れ",
"くもり"
],
"winds": [
"東の風 後 南の風",
"南の風 日中 東の風",
"南西の風 後 東の風"
]
}
]
},
{
"timeDefines": [
"2021-11-06T18:00:00+09:00",
"2021-11-07T00:00:00+09:00",
"2021-11-07T06:00:00+09:00",
"2021-11-07T12:00:00+09:00",
"2021-11-07T18:00:00+09:00"
],
"areas": [
{
"area": {
"name": "北部",
"code": "110020"
},
"pops": [
"10",
"20",
"0",
"10",
"10"
]
},
{
"area": {
"name": "南部",
"code": "110010"
},
"pops": [
"10",
"20",
"0",
"10",
"10"
]
},
{
"area": {
"name": "秩父地方",
"code": "110030"
},
"pops": [
"10",
"20",
"0",
"10",
"20"
]
}
]
},
{
"timeDefines": [
"2021-11-07T00:00:00+09:00",
"2021-11-07T09:00:00+09:00"
],
"areas": [
{
"area": {
"name": "熊谷",
"code": "43056"
},
"temps": [
"9",
"20"
]
},
{
"area": {
"name": "さいたま",
"code": "43241"
},
"temps": [
"9",
"20"
]
},
{
"area": {
"name": "秩父",
"code": "43156"
},
"temps": [
"6",
"19"
]
}
]
}
]
},
{
"publishingOffice": "熊谷地方気象台",
"reportDatetime": "2021-11-06T17:00:00+09:00",
"timeSeries": [
{
"timeDefines": [
"2021-11-07T00:00:00+09:00",
"2021-11-08T00:00:00+09:00",
"2021-11-09T00:00:00+09:00",
"2021-11-10T00:00:00+09:00",
"2021-11-11T00:00:00+09:00",
"2021-11-12T00:00:00+09:00",
"2021-11-13T00:00:00+09:00"
],
"areas": [
{
"area": {
"name": "埼玉県",
"code": "110000"
},
"weatherCodes": [
"201",
"200",
"203",
"101",
"101",
"101",
"101"
],
"pops": [
"",
"40",
"70",
"20",
"20",
"20",
"20"
],
"reliabilities": [
"",
"",
"A",
"A",
"A",
"A",
"A"
]
}
]
},
{
"timeDefines": [
"2021-11-07T00:00:00+09:00",
"2021-11-08T00:00:00+09:00",
"2021-11-09T00:00:00+09:00",
"2021-11-10T00:00:00+09:00",
"2021-11-11T00:00:00+09:00",
"2021-11-12T00:00:00+09:00",
"2021-11-13T00:00:00+09:00"
],
"areas": [
{
"area": {
"name": "熊谷",
"code": "43056"
},
"tempsMin": [
"",
"11",
"14",
"10",
"8",
"7",
"7"
],
"tempsMinUpper": [
"",
"12",
"16",
"12",
"10",
"9",
"9"
],
"tempsMinLower": [
"",
"6",
"12",
"9",
"6",
"5",
"5"
],
"tempsMax": [
"",
"18",
"19",
"21",
"19",
"19",
"18"
],
"tempsMaxUpper": [
"",
"19",
"25",
"24",
"23",
"22",
"21"
],
"tempsMaxLower": [
"",
"14",
"18",
"18",
"16",
"15",
"15"
]
}
]
}
],
"tempAverage": {
"areas": [
{
"area": {
"name": "熊谷",
"code": "43056"
},
"min": "8.3",
"max": "17.9"
}
]
},
"precipAverage": {
"areas": [
{
"area": {
"name": "熊谷",
"code": "43056"
},
"min": "0.9",
"max": "12.1"
}
]
}
}
]
Node.js で取得(特定の情報のみ取り出す)
Node.js での情報取得には Axiosを用います。
npm i axios
を実行して、パッケージをインストールしておいてください。
3日間の天気予報の取得
以下、埼玉の 3日間の天気を取得するプログラムです。
const axios = require("axios");
const url = "https://www.jma.go.jp/bosai/forecast/data/forecast/";
const area = "110000"; // 埼玉
(async function getWeatherForecast() {
try {
const response = await axios.get(`${url}${area}.json`);
for(const area of response.data[0].timeSeries[0].areas){
console.log(`----${area.area.name}----`);
for(const weather of area.weathers){
console.log(weather);
}
}
} catch (error) {
console.error(error);
}
})();
7日間の天気予報の取得
今度は、埼玉の 7日間の天気を取得するプログラムです。
const axios = require("axios");
const url = "https://www.jma.go.jp/bosai/forecast/data/forecast/";
const area = "110000"; // 埼玉
(async function getWeatherForecast() {
try {
const response = await axios.get(`${url}${area}.json`);
for(const area of response.data[1].timeSeries[0].areas){
console.log(`----${area.area.name}----`);
for(const weatherCode of area.weatherCodes){
console.log(weatherCode);
}
}
} catch (error) {
console.error(error);
}
})();
上記を実行した結果は、以下のとおりです。
3日間の天気を取得した時のように、日本語で書かれた天気情報が取得できず、weatherCode が取得できるのみという形のようです。
weatherCode についてのツイートをされていた方がいて、そこから以下のアニメーションGIF にあるように、気象庁の週間天気のページで開発者ツールのコンソールを開いて、情報を取得することができました。
気象庁の weatherCode、
— you (@youtoy) November 6, 2021
「コンソールから Forecast.Const.TELOPS と入力」というやつは、こういうことか。https://t.co/a3D3sHuOTN pic.twitter.com/Ng4yj1gQB0
他の天気予報関連の情報の取得
以下のように、天気概況を取得できるものもあるようです。
3日間の天気概況
【東京を指定して取得】
https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json
7日間の天気概況
【東京を指定して取得】
https://www.jma.go.jp/bosai/forecast/data/overview_week/130000.json
おわりに
特にアカウント作成をしたり、APIキーを用意したりすることなく、3日間の天気と7日間の天気の情報について、それぞれ気象庁の予報の情報を得ることができました。
7日間の天気は、weatherCode の状態でしか取得できないようなので、実際に利用するときにはもう一手間かける必要がありそうです。
今回の天気予報の情報取得の話について、某コンテスト向けに Azure を何らか使う、という方向で調べていて出てきた以下も気にはなったのですが、まずは手軽にできる方法でやってみました。
こういうこともできるのか!
— you (@youtoy) November 6, 2021
●Azure Maps Weather Services API の天気予報を試してみる - Qiita
https://t.co/Za82KCYomO
【追記】 こんなこともやってみました
jqコマンドによる処理も試してみました。
●curl で取得した気象庁公式の天気予報の情報(JSON)を jqコマンドで処理する - Qiita
https://qiita.com/youtoy/items/db5b515d400d2aa96420
そして、Node.js で filter()・find() を使った検索も試してみました。
●気象庁公式の天気予報の情報を Node.js で取得し中身を検索する(ライブラリに Got を用いる) - Qiita
https://qiita.com/youtoy/items/c7dba010ab7d0763e879