天気予報 API (livedoor 天気互換)

OVERVIEW

気象庁が配信している全国各地の今日・明日・明後日の天気予報・天気詳細・予想気温・降水確率と都道府県の天気概況情報を JSON データで取得できる、Web API サービス。(2020.09, 2021.03, 2021.05)

YEAR 2020 - 2021

livedoor 天気 が2020年7月でサービス終了してしまい、同時にプログラミングのチュートリアルでありがちな「APIからデータを取得してきて表示する」という用途に割とよく使われていた livedoor 天気の API も使えなくなってしまったため、その代替として開発した API です。

私自身 livedoor 天気の API を Twitter Bot の定期天気予報ツイートに使っていたのですが、その livedoor 天気の API が終了してしまいました。そこで、URL を差し替えるだけで復活させられるような API があると便利だな〜と思い、できるだけ livedoor 天気の API の JSON レスポンスと互換性を持たせた API を開発しました。

当時の開発経緯などはこちらの記事にて説明しています。ご興味があればぜひ。

ニコニコ実況 過去ログ API 同様に Laravel 製です。とはいえ、簡素な API と言うこともあり、あまり Laravel の機能は利用していません。

もともと Laravel に入門したいと思っていたのですが、なかなか触る機会がありませんでした。そこにちょうど API を作りたいモチベが出てきたので、この機会に Laravel に少しでも慣れておこう、と考え Laravel を採用した記憶があります。
規模も小さく DB も使っていないので、Laravel に慣れるにはちょうど良い題材でした。

2021年2月に情報の取得元である気象庁の HP が HTML ページから SPA へ大幅にリニューアルされたため、事実上ほとんど書き直しました(正直 HTML からスクレイピングしていた頃の方が実装が簡単だった…)。

SPA 化された新しい気象庁 HP の API はお世辞にも使いやすいレスポンス構造とはいえず(外部利用を想定していないので当然ではある)、気象庁 HP に表示する処理に合わせた JSON 構造になっていて、目的の地点の情報だけ取り出すような用途には向いていませんでした。さらに定数定義などをフロントエンドの JavaScript から抽出したり、目的の情報をどこのフィールドから取得できるかを調べたりなど、リバースエンジニアリングにかなり時間が掛かった記憶があります。

開発してからはかなり放置していたのですが、Qiita でも 10 件以上この API を使った記事が書かれていたり GitHub でも多数天気予報 API (livedoor 天気互換) の URL がいろんなリポジトリで使われていたりと(チュートリアル系のリポジトリが多い印象)、私の想像以上に色々なところで使われているようで、かなり恐縮です…。

実際の N予備校 のプログラミング教材のスクリーンショットらしい(この API を使っても良いか株式会社ドワンゴの教育事業部の人からメールで連絡が来た時に添付されていたスクリーンショット)

さらに、N予備校 というN高等学校 (N高) や N中等部 などのドワンゴがやっている通信制学校の教材として使われているオンライン学習プラットフォームのうち、プログラミング関連の教材のチュートリアルでも使っていただいているみたいです…!

2021年2月の大規模改修の際に本家 livedoor 天気の API にはなかった降水確率や風の強さ・波の高さなどを新規で取得できるようにしたのですが、それも使っていただいているみたいでした。多くの方のお役に立てているようで本当に恐縮…(サーバー落とさないようにちゃんと保守しなければ…)。

実際天気予報自体は Yahoo! 天気をはじめ既にたくさんの高クオリティな天気アプリがあるので実務で使うこと自体は少ないとは思うのですが(個人が趣味でやってるレベルのものだし実際実務レベルでは使わないでほしい…)、「天気予報」という題材はプログラミングのチュートリアルとしてかなりよくある題材だからか、たとえば試しに React で Web アプリを簡単に作ってみるときの情報取得元としてなど、ホビー用途やプログラミング初心者の方の学習用としてかなり使っていただけているみたいでした。
サーバーログを見ていても、Python (Requests) や Ruby、WordPress 、さらには ESP32 (!!!) などありとあらゆる言語やフレームワークの User-Agent が載っていて面白いです。

WEBSITE