2022年2月5日土曜日

最新のアメダスのデータを取得するWeb APIをGASで試作する。

先日、気象庁のJSONからアメダスのデータを取得するGAS(Google Apps Script)を作りましたが、もうひと手間加えてWeb APIを作ってみました。

挙動としては、

https://script.google.com/macros/s/ABCDE12345/exec?point=36846

こんな感じで、GASでウェブアプリとして公開したURLの後ろに「?point=」と観測所番号(小名浜の場合は「36846」)を付けてリクエストすると、

該当観測所の最新のアメダスのデータがJSON形式で返ってきます。
 {"pressure":[1007.2,0],"normalPressure":[1007.8,0],"temp":[1.2,0],"humidity":[62,0],"visibility":[20000,0],"sun10m":[0,0],"sun1h":[0,0],"precipitation10m":[0,0],"precipitation1h":[0,0],"precipitation3h":[0,0],"precipitation24h":[0,0],"windDirection":[15,0],"wind":[1.4,0]}


まぁ、GASでこれを作っても、公開するには実行回数や時間等に制限があって向かないし、自分で使うならわざわざHTTPを挟む必要がないので使い所が微妙なのですが、自前でサーバーを用意して作ればいろいろ活用できそうな気が。Raspberry Piクラスタでサーバー立てたいなぁ、と前々から思っていたのでどこかのタイミングで……。でも、実際に運用するとなると……(よく分かってない)。


-----
・追記(2022-2-10)

Python + Flask + Heroku でWeb APIを作成しました → 「最新のアメダスのデータを JSON 形式で取得する Web API を作りました。
-----


閑話休題。

以下、備忘録を兼ねた作り方です。


▼ コードの作成

Google Apps Scriptから新しいプロジェクトを作成します。

タイムゾーンは、「Asia/Tokyo」に変更してください。(「プロジェクトの設定」→「「appsscript.json」マニフェスト ファイルをエディタで表示する」をチェックから「appsscript.json」内を編集。)

URLから観測所番号を取得するため、doGet関数を使います。

function doGet(e) {
  let url = "https://www.jma.go.jp/bosai/amedas/data/map/";
  url = url + getDataTime() + "00.json";
  const point = e.parameter.point;

  //JSONの取得
  let response = "";
  try {
    response = UrlFetchApp.fetch(url);
  } catch(e) {
    return response;
  }
  let data = JSON.parse(response.getContentText());
  let amds_json = data[point];

  //JSONの出力
  let out = ContentService.createTextOutput();
  out.setMimeType(ContentService.MimeType.JSON);
  out.setContent(JSON.stringify(amds_json));

  return out;
}

function getDataTime() {
  //取得データの日時を定義
  let date_and_time = new Date();
  let hour = Utilities.formatDate(date_and_time, "JST", "HH"); 
  let min = Utilities.formatDate(date_and_time, "JST", "mm") - 12; //12分猶予
  min = (Math.floor(min / 10) * 10);
  if(min == -10 || min == -20) {
    if(hour == 0) {
      let day = date_and_time.getDate();
      date_and_time.setDate(day - 1);
      hour = "23";
    } else {
      hour = hour -1;
    }
    min = "50";
  } else if (min == 0) {
    min = "00";
  }
  let date = Utilities.formatDate(date_and_time, "JST", "yyyyMMdd");
  let dataTime = date + ("00" + hour).slice(-2) + min;

  return dataTime;
}
※ コードを一部修正(2022-2-12)
※ コードを一部修正(2022-2-21)

JSON形式で提供されているアメダスのデータから当該観測所のデータをまるっと抽出、再度JSON形式で出力します。

getDataTime関数は、取得するデータの日時を定義しています。


▼ ウェブアプリとして公開

ウェブアプリケーションとして公開します。

「デプロイ」→「新しいデプロイ」から、

「説明」→「Amedas Web API」(適当に)
「次のユーザーとして実行」→「自分」
「アクセスできるユーザー」→「全員」

として、デプロイを実行。

初回の「アクセスを承認」がまだの場合は、承認をします。


これで、発行されたウェブアプリのURLの末尾に「?point=観測所番号」を付けてアクセスすると、JSON形式のデータが返ってきます。

(観測所番号は、前の投稿を参考に取得してください。)


***

無事に動きましたでしょうか。

感想としては、思ったよりも簡単でした。農業に役立つWeb APIとかいろいろ作れたらいいですね。


椎茸 原木 植菌

大きな投資をせずとも、身近なICT活用によって農業ってすごくやりやすくなると思っています。本当に、やり方次第ですね。小さなところからコツコツやっていきましょう。


詳解! Google Apps Script完全入門 [第3版]
詳解! Google Apps Script完全入門 [第3版]

by SimpleImageLink

Raspberry Piでスーパーコンピュータをつくろう!
Raspberry Piでスーパーコンピュータをつくろう!

by SimpleImageLink


・関連投稿





Twitter(@nkkmd)日々更新中です。