追記:2026年5月29日気象庁の変更に対応するため一部コードを変更しました(氾濫警報には現在対応していません)
初めに
現在出ている注意報・警報を取得したいと思うことは無いでしょうか?
現状、それらの情報を取得できるAPIはたいてい有料なことが多いです。
そこで今回は気象庁のWebAPI(?)を利用して取得しようかと思います。
事前準備
このページから地方エリアのコードと市町村区のコードを取得しておきます。
例えば東京都千代田区の場合、関東甲信地方の東京都東京地方を選択した後、千代田区を選択した際URLのclass20s&area_code=""の部分が市町村区のコードとなります。
実装
warninginfo.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import json
import urllib.request
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/r8/%s.json"
def warnings():
#コードと名称の変換
trans_warning = {
"02":"暴風雪警報",
"03":"大雨警報",
"04":"洪水警報",
"05":"暴風警報",
"06":"大雪警報",
"07":"波浪警報",
"08":"高潮警報",
"09":"土砂災害警報",
"10":"大雨注意報",
"12":"大雪注意報",
"13":"風雪注意報",
"14":"雷注意報",
"15":"強風注意報",
"16":"波浪注意報",
"17":"融雪注意報",
"18":"洪水注意報",
"19":"高潮注意報",
"20":"濃霧注意報",
"21":"乾燥注意報",
"22":"なだれ注意報",
"23":"低温注意報",
"24":"霜注意報",
"25":"着氷注意報",
"26":"着雪注意報",
"29":"土砂災害注意報",
"32":"暴風雪特別警報",
"33":"大雨特別警報",
"35":"暴風特別警報",
"36":"大雪特別警報",
"37":"波浪特別警報",
"38":"高潮特別警報",
"39":"土砂災害特別警報",
"43":"大雨危険警報",
"48":"高潮危険警報",
"49":"土砂災害危険警報"}
#情報の取得
area_data = urllib.request.urlopen(url=AREA_URL)
area_data = json.loads(area_data.read())
area = area_data["class20s"][CLASS_AREA_CODE]["name"]
class15s_area_code = area_data['class20s'][CLASS_AREA_CODE]['parent']
class10s_area_code = area_data['class15s'][class15s_area_code]['parent']
offices_area_code = area_data['class10s'][class10s_area_code]['parent']
warning_info = urllib.request.urlopen(url=url % (offices_area_code))
warning_info = json.loads(warning_info.read())
warning_codes = [warning["code"]
for dataTypeCode in warning_info
for class_area in dataTypeCode["warning"]['class20Items']
if class_area['areaCode'] == CLASS_AREA_CODE
for warning in class_area["kinds"]
if warning["status"] != "解除" and warning["status"] != "発表警報・注意報はなし"]
warning_texts = [trans_warning[code] for code in warning_codes]
return (warning_texts,area)
def main():
warning_texts,area = warnings()
print("https://www.jma.go.jp/bosai/warning/#area_type=class20s&area_code=%s&lang=ja" % (CLASS_AREA_CODE))
print("%sの気象警報・注意報" % area)
if warning_texts:
print("\n".join(warning_texts))
else:
print("現在発表警報・注意報はありません。")
if __name__ == "__main__":
main()
前回作ったこれと組み合わせたり、新たに警報・注意報が発表されたときLine等に送信するようにすれば有効活用できるかと思います。
#参考文献
JSONファイルにデータを追加する方法は?
新しい気象庁サイトからJSONデータが取得できる件
気象庁 全国の警報・注意報
「新たな防災気象情報」で提供されるデータはどう変わるのか