livedoor 天気互換の天気予報 API をリリースした話

唐突ですが、天気予報 API(livedoor 天気互換) なるサイトをリリースしました。
livedoor 天気のサービス終了に伴い利用できなくなった API の代替として利用できます。

Sponsored Link

About

気象庁が配信している天気予報データを、livedoor 天気 API と互換性のある JSON データで返す API です。
情報元が異なるためいくつか変更点もありますが、概ね livedoor 天気 API の URL と差し替えるだけで、ほとんど既存のコードを変更することなく使えると思います。
詳細は ドキュメントページ に譲るとして、この記事では簡単な概要だけ紹介します。

リクエストパラメータの地域 ID は livedoor 天気 API と同じものを採用しています。リクエストする地域と ID の対応は、livedoor 天気で使われていた全国の地点定義表 内で「1次細分区(cityタグ)」の ID を参照してください。(例・神奈川県 横浜 = 140010 )
存在しない地域 ID の場合は"The specified city ID does not exist." とエラーになります。

レスポンスフィールドは基本的に互換性を保っているつもりですが、pinpointLocations は気象庁 HP から取得できないため削除しました。このほか、データ元の変更ともなう仕様変更、新たに降水確率などのデータを追加したりといった変更も行っています。詳細は 変更点・注意事項 をご覧ください。

注意

個人利用・商用利用ともに OK としますが、注意点として、気象庁から配信されている天気予報をスクレイピングして取得している関係上、予期されていないデータが入ったり html の構造が変わったりがあると 500 エラーになってしまうかもしれません。そのため、天気を「確実に」「正確に」取得する必要がある用途での利用は推奨しません。 有料サービスなども検討してください。

また、この API を叩くごとに1回、気象庁 HP へのリクエストが行われます。この API を過剰に叩くとこのサーバーが落ちる可能性があるだけでなく、結果的に気象庁のサーバーにまで負荷をかけてしまいます。できるだけ API へのアクセス回数が少なくなるようにコーディングするようお願いします。

異常な量のリクエストを確認した場合、負荷軽減のため当該 IP アドレスからのアクセスをブロックすることがあります。あらかじめご了承ください(強いサーバーではないので…)。
普通に使ってれば大丈夫ですが、全国の天気を取得したいなど何度か API にアクセスする必要がある場合は少し間を空けてから行うようにしてください。

もし 500 エラーになってしまった場合は Issues にて報告していただけると助かります。エラーになった地域 ID と気象庁 HP で公開されているその地域の天気予報を添えてください。

API は常時稼働していますが、(サーバー料金未払いとかで)停止してしまっていることがないとも限りません。
ソースコードは GitHub で公開しています(Laravel 製)。
もし確実に常時稼働させておきたいのであれば、(他の環境で動くかは未検証ですが)README やコードを参考に自分のサイトでホストしても良いと思います。

開発当時の経緯

以下の経緯は最初にこの API を開発した 2020 年 7 月時点のものです。現在では気象庁 HP のリニューアルと、それにともなう(クローズドな)API の公開により状況が変わっています。

2020 年 7 月、無料で登録なしに利用できる API を提供していることで知られていた livedoor 天気から突如7月末でサービスを終了するという発表があり、代替を探す間もなくあっという間にサービス終了してしまいました。

無料で使える API としては(提供データは多くはないものの)JSON 形式で(!)最低限の天気予報データを提供しており、また登録なしで利用できたことから重宝されていた印象です。

様々なサイトで livedoor 天気の API を利用したプログラムが公開されていたり、私自身いくつかの Twitter Bot で使っていたのですが、突然の終了となってしまい残念です。

livedoor 天気「自体の」利用者はさほど多くない上、API や各種ウィジェットのアクセス数ばかり増えるようでは(あの Weather Hacks のページも10年以上前からあったようだし)サービス終了もやむなしかな…とは思いますが、なかなか代替となる API が見つかりません。

日本の天気 API 事情

天気予報 API 自体は tenkiapi.jpyumake.jp日本気象協会が出してる API などいくつか見つかりますが、いずれも有料な上、個人利用は基本的に対象外です(月数万円〜数十万円は個人じゃとても無理…)。
人気の天気APIをまとめてみた には無料で使える API が複数載っていますが、全て海外サイトのようです。

このうちポピュラーで比較的利用者が多いのが OpenWeatherMap ですが、登録必須なことに併せて日本国内の天気予報は変な予報が出ることが多く、あまりアテになりません…(Linux のデスクトップ環境入れて天気ウィジェット入れるととんちんかんな予報の天気が表示されるのはだいたい OpenWeatherMap のせい)

YOLP の気象情報 API も検索でヒットしますが、こちらもデベロッパー登録が必須です。ただし、Yahoo! JAPAN ID があれば取得できるので、登録自体はさほど面倒ではありません。
ただし、この API は雨の予想降水量のみで天気予報自体は取得できないため、こちらも却下です(アプリ解析すれば非公開の API とか見つけられるんだろうけど…)。

気象庁の天気 API

「なら気象庁は?」というところですが、気象庁は API を公開していません(IT後進国…)。
厳密には 気象庁防災情報XMLフォーマット形式電文の公開(PULL型) にて Atom フィード(気象庁的には『電文』らしい)の形式で天気予報を含めた各種情報を公開していますが、そこから天気予報を取得するには、

  1. 長期フィード:定時 から数日間分の全入電(気象庁の各発表)が記述された XML のリストを取得する
    • 天気概況以外の詳細データは <link> に記述された UUID の XML 内に記述されている
  2. 取得した長期フィードから天気概況だけを抜き出し、各都道府県ごとに整理する
  3. 実際の天気予報データを <link> 内の XML にアクセスして取得する
  4. XML 内から必要なデータを取得する

という具合でかなり面倒な手順を踏まないと取得できません。さらに長期フィードの XML 自体が重く(ロードに数秒かかる)、また都道府県ごとにデータがまとめられているわけではないので、目当てのデータを探す処理を入れる必要が出てきます。
速度的にも利便性的にも API として使うのは厳しそうです。

実は AITC(先端IT活用推進コンソーシアム)が気象庁の XML データを随時取得し、REST API で利用できる形で提供されていたりもしたのですが、PULL 型ではなく PUSH 型の電文配信を利用していたため、気象庁からの PUSH 配信の終了にともない、今年の8月末でサービス終了となってしまいました。
今でもアクセス自体は可能ですが、データの更新が 2020/09/01 で止まってしまっています。

…というわけで、

  • 個人が無料で使える
  • 予報が正確である
  • livedoor 天気で提供されていた天気予報全てを提供している

という条件をつけると、(少なくとも、私が調べた限りでは)ほとんど代替となりうる選択肢がありません。

ほぼ唯一の選択肢は個人の方が公開されている気象庁の天気予報情報を XML で配信 の API を利用することですが、ソースに気象庁の週間天気予報を利用しているためか、都道府県ごとにしか予報が取得できないのがネックです。

スクレイピング

正直昔に作った Bot を今更改修するのも気が引けたので、「いっそ気象庁のサイトからスクレイピングして livedoor 天気 API の URL と差し替えるだけで使える API 作るか!」と開発した、というのが経緯だったりします。
データを気象庁のフィードから取得することも検討しましたが、気象庁 HP からスクレイピングした方が速度的にも手間的にも手っ取り早いと考え、スクレイピングする実装としました。

気象庁いわく、気象庁 HP で公開されている各種データはスクレイピング含め自由に利用できるとのことなので、とくに問題はないと考えています(出典と編集・加工を行っている旨を API のレスポンスに記載しています)。

気象庁 HP のリニューアル

2021年2月に気象庁 HP が十数年ぶりにリニューアル (SPA化) され、気象データは HTML 埋め込みではなく、API から適宜取得する形に変更されました。

ようやくといったところですが、この API は外部への公開を目的としたものではないようで、実際お世辞にも使いやすいとはいえませんでした。HP に表示する処理に合わせた JSON 構造になっていて、目的の地点の情報だけ取り出すような用途には不向きです。

API の利用自体は気象庁 HP 同様に政府の利用規約に則って使えるとのこと。

この API もスクレイピングでなくなった事で改修を余儀なくされたのですが、正直スクレイピングのときの方が楽だったのではないかと思うほど実装がめんどくさくなり、改修完了まで1週間もかかってしまいました。

この改修で livedoor 天気の API では得られなかった風向きや波の高さなどの情報もレスポンスに加わり、より実用性が増したのではないかと思います。実装は心底大変でしたが…。
改修によりどうしても非互換な部分が出ていますが(アイコンの変更など)、軽微なものなのでそこまで問題にはならないのではないかと考えています。

もしこの API を使わず独自の気象庁 API クライアントを実装される場合も、API 内部の情報抽出ロジック とそのコメントがかなり参考になると思います(他人に自信持って見せられるほどきれいなコードでもないけど)。

東京の天気取得できればいいだけならともかく、帯広と奄美だけ特別扱いが必要だったり、かならずしも1観測所に1アメダスではなかったりと多数落とし穴があるので注意(バグ報告して頂いてだいぶ改善された今の実装でさえ、本当にすべての地域で正しく取得できてるか保証できない)。

私はこの API をさほど使っておらず無駄手間感が否めないけど、気象庁の API を直にまともに使おうとしたら下手するとスクレイピングのときより手間になるだろうし(経験者)、皆さんのためになったと思っておくことにします。

コメント

  1. お礼です。
    個人開発をしています。
    WindowsPhone用の予定表アプリケーションに天気を表示していました。
    天気を取得しようとして調べた結果、livedoor天気を使っていました。
    おっしゃるとおり有料のAPIがほとんどで、個人では手も足もでなかったです。
    しばらく前にWindowsPhoneが使えなくなって、XamarinでAndroidに移植を始めました。
    ようやく天気の部分を移植したところ、livedoor天気APIがなくなっていることを知りました…。
    さらに調べたところ、このページにたどりつき、無事天気を取得できました。
    互換APIをご提供いただき、感謝します。
    ありがとうございます。

    • いえいえ。最近アクセス数が多くなってるのであれですが、できる限り続けたいと思っています。

  2. こちらの資料に利用させて頂きました。

    https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d

    LINE Botのハンズオン資料にライブドアの天気APIを利用していて、サービス終了を知った後にここの項目消さないとなぁと思っていたところの朗報でした。 ありがとうございます。

    • こちらこそ使っていたたき光栄です。ありがとうございます!