朝からのどがイガイガする。PM2.5か、黄砂か、ただの乾燥か。「今、空気は悪いの?」に答えるデータは、環境省が公開している。大気汚染物質広域監視システム、通称そらまめくん(AEROS)。全国の測定局の速報値を24時間公開していて、しかも公式サイトに開発者向けのAPI説明ページまである。APIキーもログインもいらない。ただし、このサイトには優しい罠があった。
起: 全国1,594局の「今」が1本のCSVに
最新の全国データは、時刻つきのCSV1本だ。2026-09-26未明の実測では、01時のファイルが255,102バイト、1,594測定局分。しかも測定局の名前、住所、局種別、市区町村名まで入っている。PM2.5のその時刻の全国平均は8.9、最大は28.0(国設尼崎自動車交通環境測定所)だった。測定局ごとの今日の値や直近7日分もCSVで取れる。月ごとの履歴は、公式が案内するJSON APIが都道府県単位で返してくれる。東京都の9月分を取ったら4.4MB、50,830行だった。太っ腹である。
承: 速報値という立場
ひとつだけ立場を押さえておく。このデータは速報値で、確定値ではない。確かな統計が欲しい人は政府のオープンデータカタログへ、というのが公式の案内だ。だから答え方も決まる。「9月26日01時の速報値では」という時刻つきで話す。局にも種類があって、住宅地などを測る一般局(1,244局)と、道路沿いの自動車排出ガスを測る自排局(349局)がある。同じ町の「28」でも、どちらの局かで意味が違う。
転: このサイトは、404を返さない
ここで罠だ。存在しないURLを叩いても、このサイトは404を返さない。どんな適当なパスでも「200 OK」で、2.6KBのHTMLが返ってくる。ブラウザのための器(いわゆるSPAのシェル)だ。時刻の組み立てを間違えても、ファイル名を推測で書いても、サーバは笑顔で200を返す。
何も知らないエージェントはここで転ぶ。「データ取得成功!」と言って、HTMLをCSVとして読み始める。200はデータの証明ではないのだ。対策は単純で、受け取った中身の先頭行が「測定局コード」で始まるかを必ず見る。スキルにはそう書いた。それから、PM2.5を測っているのは1,594局中1,031局だけだった(同時刻実測)。近所の局が黙っていたら、それは故障ではなく、その局がその項目を測っていないということだ。
結: 中身を見てから、取れたと言う
-
200はデータの証明ではない。 404を返さないサイトでは、中身のヘッダ行を見る。これが今回いちばんの教訓だ。
-
速報値は時刻つきで伝える。 「01時の速報値では」の一言が、確定値との混同を防ぐ。
-
局の種類で意味が変わる。 一般局と自排局、測っていない項目。数字は出所とセットで読む。
kurashi-skillは公開開発中。リポジトリはここ → https://github.com/tahodev/kurashi-skill
ちなみにその時刻の東京のPM2.5は7だった。僕ののどのイガイガの犯人は、データでは特定できなかった。たぶん乾燥である。