現在出ている気象警報・注意報を取得する


初めに

現在出ている注意報・警報を取得したいと思うことは無いでしょうか?
現状、それらの情報を取得できるAPIはたいてい有料なことが多いです。
そこで今回は気象庁のWebAPI(?)を利用して取得しようかと思います。

事前準備

このページから地方エリアのコードと市町村区のコードを取得しておきます。
例えば東京都千代田区の場合、関東甲信地方の東京都東京地方のURLのoffices&area_code=""の部分が地方エリアコードとなります。
そのあと千代田区を選択した際URLのclass20s&area_code=""の部分が市町村区のコードとなります。

また、以下のファイルを適当な場所に作成してください

transweather.json
{
 "warninginfo":{
                "02":"暴風雪警報",
                "03":"大雨警報",
                "04":"洪水警報",
                "05":"暴風警報",
                "06":"大雪警報",
                "07":"波浪警報",
                "08":"高潮警報",
                "10":"大雨注意報",
                "12":"大雪警報",
                "13":"風雪注意報",
                "14":"雷注意報",
                "15":"強風注意報",
                "16":"波浪注意報",
                "17":"融雪注意報",
                "18":"洪水注意報",
                "19":"高潮注意報",
                "20":"濃霧注意報",
                "21":"乾燥注意報",
                "22":"なだれ注意報",
                "23":"低温注意報",
                "24":"霜注意報",
                "25":"着氷注意報",
                "26":"着雪注意報",
                "32":"暴風雪特別警報",
                "33":"大雨特別警報",
                "35":"暴風特別警報",
                "36":"大雪特別警報",
                "37":"波浪特別警報"
        }
}

実装

以下のファイルを上記のファイルと同じディレクトリ内に作成してください

warninginfo.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import json
import urllib.request
import os.path

base = os.path.dirname(os.path.abspath(__file__))

WEATHER_TRANS = json.load(open(base + "/transweather.json", "r"))
OFFICES_AREA_CODE = "130000" #地方エリアのコード
CLASS_AREA_CODE = "1310100" #市町村区のコード
AREA_URL = "https://www.jma.go.jp/bosai/common/const/area.json"

url = "https://www.jma.go.jp/bosai/warning/data/warning/%s.json" % (OFFICES_AREA_CODE)
def warnings():
        area_data = urllib.request.urlopen(url=AREA_URL)
        area_data = json.loads(area_data.read())
        area = area_data["class20s"][CLASS_AREA_CODE]["name"]
        warning_info = urllib.request.urlopen(url=url)
        warning_info = json.loads(warning_info.read())
        warning_codes = [warning["code"]
                        for class_area in warning_info["areaTypes"][1]["areas"]
                        if class_area["code"] == CLASS_AREA_CODE
                        for warning in class_area["warnings"]
                        if warning["status"] != "解除" and warning["status"] != "発表警報・注意報はなし"]
        warning_texts = [WEATHER_TRANS["warninginfo"][code] for code in warning_codes]
        return (warning_texts,area)

def main():
        print("https://www.jma.go.jp/bosai/warning/#area_type=class20s&area_code=%s&lang=ja" % (CLASS_AREA_CODE))
        print("%sの気象警報・注意報" % (warnings()[1]))
        if warnings()[0] == []:
                print("現在発表警報・注意報はありません。")
        else:
                print("\n".join(warnings()[0]))
if __name__ == "__main__":
        main()

前回作ったこれと組み合わせたり、新たに警報・注意報が発表されたときLine等に送信するようにすれば有効活用できるかと思います。

参考文献

JSONファイルにデータを追加する方法は?
新しい気象庁サイトからJSONデータが取得できる件
気象庁 全国の警報・注意報