About

天気予報 API(livedoor 天気互換)は、気象庁が配信している全国各地の今日・明日・明後日の天気予報・天気詳細・予想気温・降水確率と都道府県の天気概況情報を JSON データで提供しています。

去る 2020 年 7 月、livedoor 天気がサービス終了となりました。livedoor 天気の API はわかりやすく、認証も不要でとても利用しやすかったのですが、突然の終了となりとても残念です。
代替として使えそうな API を探しましたが、OpenWeatherMap は API キーが必要な上に予報自体が正確でなかったり、気象庁のサイトはそもそも API がなかったりなど livedoor 天気のように手軽に使える API は見つからず、こうして自作することとなりました。
(気象庁 HP のリニューアルにより現在は各種 API が存在しますが、公に公開されているものではないためドキュメントはなく、またデータが非常に取りづらい構造になっており、手軽に使えるかというと微妙…)

この API は、気象庁 から配信されている全国各地の天気予報を取得し、終了した livedoor 天気 の API と互換性のある JSON 形式のデータで提供するものです。URL を差し替えるだけで極力既存のコードを変えることなく利用できるようにしているつもりですが、livedoor 天気の API からの変更点や注意点もあります。利用される際は下記の 変更点・注意事項 をよく読んだ上でご利用ください。

気象庁 HP のリニューアルに対応しました。また、気象庁 HP の API を活用して 気象台名・見出し/本文のみの天気概況文・天気詳細・一時細分区域名 のプロパティを新たに追加し、より利用しやすくなりました。
気象データの取得処理が事実上すべて書き直しになった関係で、細かな挙動やこの API で追加されたプロパティが変更・統一されています(livedoor 天気との互換性は保っているはず)。詳細は下記の 変更点・注意事項レスポンスフィールド をご参照ください。

変更点・注意事項

  • 天気予報は気象庁 HP の公に公開されていない API から取得しているため、レスポンスに予期しないデータが入っていた場合や API のデータ構造が変更された場合などに、500 エラーで取得できなくなる可能性があります。
    • 気象庁 HP の API は仕様の継続性や運用状況のお知らせが保証されていません(参考)。
    • 万全は期しているつもりですが、アクセスする時間によってデータが変わるため、修正できていない不具合があるかもしれません。
    • また、API の不具合などの要因で、正確でない天気予報が取得されてしまう可能性もないわけではありません。
    • サービスの利用は無料ですが、この API を利用したことで何らかの不具合が発生しても責任は負えません。自己責任にてお願いします。
    • このため、天気アプリなどの天気を「正確に」「確実に」取得する必要がある用途での利用は推奨しません。 有料サービスなども検討してください。
  • API は HTTP 接続と HTTPS 接続両方に対応していますが、できるだけ HTTPS でアクセスすることを推奨します(証明書云々など HTTPS 接続が難しい環境向けに一応残しています)。
  • ピンポイント予報の発表地点を表す pinpointLocations は気象庁 HP の API からは取得できないため、廃止としました。
  • link はリクエストされたデータの地域に該当する気象庁 HP の天気予報の URL を返すようになりました。
  • copyright 内の項目は現状に合わせて変更しています。provider は気象庁としていますが、非公式です。
    • API のレスポンス内 ( copyright => provider => note ) に JSON データへ編集している旨を明記しています。
  • 明後日の降水確率や気温など、3日間天気予報から取得できなかった情報は週間天気予報から取得します。
    • 週間天気予報を発表している観測所は離島がある場合を除いて各都道府県ごとに一つのため、週間天気予報の観測が行われていない地点の ID が指定された場合、同じ都道府県内の週間天気予報を発表している観測所から代わりにデータを取得します。
    • 奄美地方 (ID: 460040) のように県庁所在地でないにも関わらず週間天気予報の観測が行われている場合は、ID で指定された方の観測所からデータを取得します。
    • 以前は週間天気予報からのデータ取得を行っていなかったため、特に明後日の天気では null になるプロパティが目立っていましたが、これにより天気詳細(0時~5時の明後日分)・予想気温(今日終了分)・降水確率(今日終了分)以外のプロパティでは常にデータが返されるようになります。
  • 気象庁から配信されているデータの関係上、今日の最低気温は取得できません( null になります)。
    • 17時発表の予報では今日の最高気温も取得できないようです。今日の予想気温は取得できない場合も考慮して実装してください。
    • 明後日の予想気温は常に週間天気予報から取得します。明日の予想気温も、0時~5時の間は週間天気予報から取得します。
    • 以前の最高気温/最低気温が取得できなかった際に max/min の要素ごと null になる挙動は削除され、celsius・fahrenheit それぞれの要素に null が設定されるようになりました。
  • 日付が変わってから今日分の天気が配信されるまでの0時~5時の間は、気象庁 HP の API で明日分として配信されている天気を今日の天気、明後日分として配信されている天気を明日の天気として返します。
    • 0時~5時の間、明後日の天気は週間天気予報から取得します。
  • forecasts => image は気象庁 HP にてホストされている各天気アイコンの URL を返します。
    • 以前は livedoor 天気からサルベージした天気アイコンを使用していましたが、気象庁側で定義されている天気の種類があまりにも多く livedoor 天気の天気アイコンだけでは表現しきれないため、気象庁 HP の天気アイコン(SVG 画像)へ変更しました。
    • SVG はベクター形式の画像のため、API クライアントによっては別途対応が必要かもしれません。
    • これにより、天気アイコンの画像サイズも 50 × 31 から 80 × 60 へ変更になっています。
  • publicTimeFormatted と description => publicTimeFormatted を追加しました。publicTime を 年/月/日 時間:分:秒 の形式で取得できます。
    • 以前は publicTime_format というプロパティ名でしたが、API 全体での命名規則(lowerCamelCase)に合わせました。
  • publishingOffice を追加しました。予報を発表した気象台(例・福岡管区気象台)を取得できます。
  • description => headlineText・description => bodyText を追加しました。見出し/本文のみの天気概況文を取得できます。
    • description => headlineText は見出しのみの天気概況文です。
    • description => bodyText は本文のみの天気概況文です。
    • description => text は今まで通り見出しと本文の両方を含んだ天気概況文です。
  • 天気詳細を表す detail を追加しました。詳細な天気情報・風の強さ・波の高さを取得できます。
    • 週間天気予報に存在しないデータのため、0時~5時の間、明後日の天気詳細はいずれのプロパティも null になります。
    • 波の高さ (detail => wave) は海に面している地域のみです。海に面していない地域では null になります。
  • 降水確率を表す chanceOfRain を追加しました。今日と明日の 0時~6時・6時~12時・12時~18時・18時~24時 の降水確率を取得できます。
    • プロパティ名は T00_06(00時~06時)・T06_12(06時~12時)・T12_18(12時~18時)・T18_24(18時~24時)へ統一しました。
    • 今日分の降水確率のうち、過ぎた分(例・12時に API にアクセスしたときの0時~6時の降水確率)は --% になります。
    • 明後日の降水確率は常に週間天気予報から取得します。明日の降水確率も、0時~5時の間は週間天気予報から取得します。
    • 週間天気予報から取得する場合は時間帯ごとの降水確率のデータが週間天気予報にないため、すべての時間帯で同じ降水確率になります。
  • location => district を追加しました。「八幡」のような地域名に加え、「北九州地方」のような一次細分区域名を取得できます。
  • API の CORS (Access-Control-Allow-Origin) は許可しているので、JavaScript でブラウザ側からこの API を利用することも可能だと思います。
    • ただし、前述した通り天気を確実に取得する必要のある用途での利用は推奨しません。天気ウィジェットなど、動かなくても問題がない程度のものにとどめておくのが無難だと思います。
  • テストアプリや開発用途以外で利用される場合は独自のユーザーエージェント(例・WeatherApp/1.0.0)を設定してください。
    • どのアプリケーションからどれくらいアクセスがあるかをサーバーログで把握するためです。
    • あまり強いサーバーではないので、API に連続してアクセスする場合は最低でも 0.5 秒以上間隔を空けてから行ってください。
    • 短時間に連続してアクセスした場合、この API だけでなく気象庁 HP にも負荷をかけてしまうことになるため、絶対にやめてください。
  • この API はできる限り維持するつもりですが、サーバーの負荷が高くなったり気象庁 HP の API 構造が大幅に変更された場合など、やむを得ず終了する可能性があります。あらかじめご了承ください。
  • コードは GitHub にて公開しています。なにか不具合があれば Issues へお願いします。
    • 未検証ですが、自分のサイトでこの API をホストすることも可能です。

リクエストパラメータ

JSON データをリクエストする際のベースとなる URL は以下になります。
https://weather.tsukumijima.net/api/forecast
この URL に下の表のパラメータを加え、実際にリクエストします。

パラメータ名 説明
city 地域別に定義された ID 番号を表します。
リクエストする地域と ID の対応は、livedoor 天気で使われていた 全国の地点定義表 内で
「一次細分区域(cityタグ)」の ID をご参照ください。(例・佐賀県 伊万里 = 410020 )
(例)「福岡県・久留米の天気」を取得する場合
下記 URL にアクセスして JSON データを取得します。http:// でのアクセスも可能です。
基本 URL + 久留米の ID (400040)
https://weather.tsukumijima.net/api/forecast/city/400040
クエリで取得することもできます。
https://weather.tsukumijima.net/api/forecast?city=400040

レスポンスフィールド

取得した JSON データは以下の定義に基づいて構成されています(プロパティ名は順不同)。
下線 の項目はこの API で新たに追加されたプロパティです。

プロパティ名 内容
publicTime 予報の発表日時( ISO8601 形式 / 例・2020-09-01T05:00:00+09:00 )
publicTimeFormatted 予報の発表日時(例・2020/09/01 05:00:00 )
publishingOffice 予報を発表した気象台(例・福岡管区気象台)
title タイトル・見出し(例・福岡県 久留米 の天気)
link リクエストされたデータの地域に該当する気象庁 HP の天気予報の URL
description
天気概況文
プロパティ名 内容
publicTime 天気概況文の発表時刻( ISO8601 形式 / 例・2020-09-01T04:52:00+09:00 )
publicTimeFormatted 天気概況文の発表時刻(例・2020/09/01 04:52:00 )
headlineText 天気概況文(見出しのみ)
bodyText 天気概況文(本文のみ)
text 天気概況文
forecasts
都道府県天気予報の予報日毎の配列
プロパティ名 内容
date 予報日
dateLabel 予報日(今日・明日・明後日のいずれか)
telop 天気(晴れ、曇り、雨など)
detail
天気詳細
プロパティ名 内容
weather 詳細な天気情報
wind 風の強さ
wave 波の高さ(海に面している地域のみ)
temperature
max・・・最高気温
min・・・最低気温
プロパティ名 内容
celsius 摂氏 (°C)
fahrenheit 華氏 (°F)
chanceOfRain
降水確率
プロパティ名 内容
T00_06 0 時から 6 時までの降水確率
T06_12 6 時から 12 時までの降水確率
T12_18 12 時から 18 時までの降水確率
T18_24 18 時から 24 時までの降水確率
image
天気アイコン
プロパティ名 内容
title 天気(晴れ、曇り、雨など)
url 天気アイコンの URL(SVG 画像)
width 天気アイコンの幅
height 天気アイコンの高さ
location
予報を発表した地域を定義
プロパティ名 内容
area 地方名(例・九州)
prefecture 都道府県名(例・福岡県)
district 一次細分区域名(例・北九州地方)
city 地域名(気象観測所名)(例・八幡)
copyright
プロパティ名 内容
title コピーライトの文言
link 天気予報 API(livedoor 天気互換)の URL
image 天気予報 API(livedoor 天気互換)のアイコン
provider 天気予報 API(livedoor 天気互換)で使用している気象データの配信元(気象庁)

JSON データサンプル

livedoor 天気の API では ASCII の範囲外の文字はすべてエスケープされていましたが、この API ではエスケープは行いません。

{
    "publicTime": "2021-03-03T05:00:00+09:00",
    "publicTimeFormatted": "2021/03/03 05:00:00",
    "publishingOffice": "福岡管区気象台",
    "title": "福岡県 久留米 の天気",
    "link": "https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=400000",
    "description": {
        "publicTime": "2021-03-03T04:43:00+09:00",
        "publicTimeFormatted": "2021/03/03 04:43:00",
        "headlineText": "福岡、北九州地方では、3日夕方まで高波に注意してください。福岡県では、4日まで空気の乾燥した状態が続くため、火の取り扱いに注意してください。",
        "bodyText": " 福岡県は、寒気の影響により曇りとなっている所がありますが、高気圧に覆われて概ね晴れています。\n\n 3日は、寒気の影響によりはじめ曇りとなる所がありますが、高気圧に覆われて概ね晴れとなるでしょう。\n\n 4日は、高気圧に覆われて晴れとなる所もありますが、気圧の谷や湿った空気の影響により概ね曇りで、夜遅くは雨となるでしょう。",
        "text": "福岡、北九州地方では、3日夕方まで高波に注意してください。福岡県では、4日まで空気の乾燥した状態が続くため、火の取り扱いに注意してください。\n\n 福岡県は、寒気の影響により曇りとなっている所がありますが、高気圧に覆われて概ね晴れています。\n\n 3日は、寒気の影響によりはじめ曇りとなる所がありますが、高気圧に覆われて概ね晴れとなるでしょう。\n\n 4日は、高気圧に覆われて晴れとなる所もありますが、気圧の谷や湿った空気の影響により概ね曇りで、夜遅くは雨となるでしょう。"
    },
    "forecasts": [
        {
            "date": "2021-03-03",
            "dateLabel": "今日",
            "telop": "晴れ",
            "detail": {
                "weather": "晴れ",
                "wind": "北の風",
                "wave": "0.5メートル"
            },
            "temperature": {
                "min": {
                    "celsius": null,
                    "fahrenheit": null
                },
                "max": {
                    "celsius": "14",
                    "fahrenheit": "57.2"
                }
            },
            "chanceOfRain": {
                "T00_06": "--%",
                "T06_12": "0%",
                "T12_18": "0%",
                "T18_24": "0%"
            },
            "image": {
                "title": "晴れ",
                "url": "https://www.jma.go.jp/bosai/forecast/img/100.svg",
                "width": 80,
                "height": 60
            }
        },
        {
            "date": "2021-03-04",
            "dateLabel": "明日",
            "telop": "曇のち一時雨",
            "detail": {
                "weather": "くもり 時々 晴れ 夜遅く 雨",
                "wind": "北の風 後 北東の風",
                "wave": "0.5メートル"
            },
            "temperature": {
                "min": {
                    "celsius": "4",
                    "fahrenheit": "39.2"
                },
                "max": {
                    "celsius": "18",
                    "fahrenheit": "64.4"
                }
            },
            "chanceOfRain": {
                "T00_06": "10%",
                "T06_12": "10%",
                "T12_18": "20%",
                "T18_24": "60%"
            },
            "image": {
                "title": "曇のち一時雨",
                "url": "https://www.jma.go.jp/bosai/forecast/img/212.svg",
                "width": 80,
                "height": 60
            }
        },
        {
            "date": "2021-03-05",
            "dateLabel": "明後日",
            "telop": "雨のち曇",
            "detail": {
                "weather": null,
                "wind": null,
                "wave": null
            },
            "temperature": {
                "min": {
                    "celsius": "10",
                    "fahrenheit": "50"
                },
                "max": {
                    "celsius": "20",
                    "fahrenheit": "68"
                }
            },
            "chanceOfRain": {
                "T00_06": "70%",
                "T06_12": "70%",
                "T12_18": "70%",
                "T18_24": "70%"
            },
            "image": {
                "title": "雨のち曇",
                "url": "https://www.jma.go.jp/bosai/forecast/img/313.svg",
                "width": 80,
                "height": 60
            }
        }
    ],
    "location": {
        "area": "九州",
        "prefecture": "福岡県",
        "district": "筑後地方",
        "city": "久留米"
    },
    "copyright": {
        "title": "(C) 天気予報 API(livedoor 天気互換)",
        "link": "https://weather.tsukumijima.net/",
        "image": {
            "title": "天気予報 API(livedoor 天気互換)",
            "link": "https://weather.tsukumijima.net/",
            "url": "https://weather.tsukumijima.net/logo.png",
            "width": 120,
            "height": 120
        },
        "provider": [
            {
                "link": "https://www.jma.go.jp/jma/",
                "name": "気象庁 Japan Meteorological Agency",
                "note": "気象庁 HP にて配信されている天気予報を JSON データへ編集しています。"
            }
        ]
    }
}