LoginSignup
28

More than 1 year has passed since last update.

気象庁公式の天気予報の情報(JSON)を curl・Node.js で取得し Node.js での処理を試す

Last updated at Posted at 2021-11-06

以前、話題になっていた以下の情報取得の話について、自分が仕様を理解するためや、後で見返したくなりそうな情報をまとめてメモしておく意味で記事を書きます。

記事に書いた内容

この記事で書いた内容は、主に以下です。

  • 天気予報の取得方法
    • 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);
  }
})();

上記のプログラムを実行した結果は、以下の通りです。
埼玉の3日間の天気.png

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);
  }
})();

上記を実行した結果は、以下のとおりです。

7日間の天気の取得

3日間の天気を取得した時のように、日本語で書かれた天気情報が取得できず、weatherCode が取得できるのみという形のようです。
weatherCode についてのツイートをされていた方がいて、そこから以下のアニメーションGIF にあるように、気象庁の週間天気のページで開発者ツールのコンソールを開いて、情報を取得することができました。

他の天気予報関連の情報の取得

以下のように、天気概況を取得できるものもあるようです。

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 を何らか使う、という方向で調べていて出てきた以下も気にはなったのですが、まずは手軽にできる方法でやってみました。

【追記】 こんなこともやってみました

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28