LoginSignup
1
0

More than 1 year has passed since last update.

【一般】東京都オープンデータソースAPIを活用してみる(データ取得編)

Posted at

基礎準備編では、Sharperlightファウンドリを用いてデータベースとデータモデルの設計を行うところまでを記事にしました。
今回は、Sharperlightスケジューラを使用して、APIエンドポイントからデータを取得する処理を作り込んでいきます。

その前に、前回作成したデータベースとデータモデルに少し修正をかけます。今回の記事を書く準備中にちょっとこうした方がいいかなってところを見つけたので。
Sharperlightファウンドリ使用して変更を行いたいと思います。まだデータベースは空っぽだし、データモデルを使用したSharperlightオブジェクトも作っていないので再作成ということでいきます。

前回作成したSharperlightファウンドリの定義ファイルを開きます。
image.png
ファウンドリが開いたらフィールドタブへ移動します。そしてテーブルドロップダウンリストから対象テーブル(一つしかないね:sweat_smile:)を選択します。
image.png
各フィールドのSQL列名を変更していきます。返されるJSONデータのフィールド名を使用します。
image.png
また、あるレコードには患者_接触歴の有無フラグの代わりに、退院済フラグというフィールドがあったり、その逆で退院済フラグの代わりに患者_接触歴の有無フラグフィールドがあったりすることも発見。その両方が存在するケースも。更には"患者_居住地"というフィールドの存在も確認。とほほ:joy:、一定ではないんですね。とりあえず全て追加しておきましょう。
フラグフィールドはYes/NoのBooleanフィールドにしようと思ったけど、存在しない場合のことを考えて文字列フィールドにします。
image.png
変更が済んだら、保存検証そして実行を行います。
実行ボタンを押すと、このようなメッセージが表示されるので、Yesで続行。
image.png
データモデルも上書きします。
image.png
正常に終了したら、データベースとデータモデルを確認してみましょう。
データベースも作り直されています。
image.png
データモデルもいい感じですね。
image.png

ではSharperlightスケジューラを使用して、APIエンドポイントからデータを取得してみましょう。
JavaScriptでタスクを作っていこうと思います。
データの取得タスクでは、APIエンドポイントからのデータを受け取り、JSONファイルとしてファイルシステムに保存します。

では、Sharperlightスケジューラを起動します。
image.png

データの取得

コードグループ説明等を記入します。作業用フォルダをパラメータとして設定。一度保存します。
image.png
再度タスクを開きアクションタブに移動します。新規アイコンを利用してJavaScriptアクションを追加します。
image.png
JavaScriptアクションが追加されると下部に編集領域が現れるので、以下のコードを貼り付けます。

lib_task.LogMessage("START");

var baseURL = "https://api.data.metro.tokyo.lg.jp/v1/";
var endPoint = "Covid19Patient";
var queryOptions = ""; 
var limit = 1000;
var fromDateFilter = "2022-09-01";
var tillDateFilter = "2022-09-30";
var headers = {
    'accept': 'application/json'
};
var page = 1;
var workfolder = lib_task.ParamGet("WorkFolder");
var cursor = "";

//===============================================================================================================
// エンドポイントにリクエストを出して、データを取得する。
// 1000件のレコードを1 JSONファイルとして保存する 
//===============================================================================================================
while (page<1001){ 
    if (lib_task.state.abort ) { break; }
    
    
    // リクエストURLの作成
    if (page > 1){    
        queryOptions = "?cursor=" + lib_data.UrlEncode(cursor) + "&limit=" + limit.toString() + "&from=" + fromDateFilter + "&till=" + tillDateFilter;
	}else{
        queryOptions = "?limit=" + limit.toString() + "&from=" + fromDateFilter + "&till=" + tillDateFilter;
    }
    var connections_url = baseURL + endPoint + queryOptions;
    lib_task.LogMessage(connections_url);

    // リクエストを行う
    var response = lib_sys.urlContent.Get(connections_url, '', headers);
        
    // レスポンスをJSONファイルとして保存する
    var filePath = workfolder + "stagingResult_" + page.toString() + ".json";
    lib_sys.io.file.WriteAllText(filePath, response);                    
        
    try{
        // 次のデータページの存在をチェックする
        var rec = JSON.parse(response);
        lib_task.LogMessage("cursor=" + rec[1].moreResults);
        if (rec[1].moreResults != "NO_MORE_RESULTS"){
            cursor = rec[1].endCursor;
            page++;
            console.log(page);
        }else{
            lib_task.LogMessage("FINISH");
            break;
        }
    }catch (err){
        lib_task.LogMessage(err);
        break;
    }
}                 

コード内に現れるlib_sys.io.file.WriteAllText等は、Sharperlightエンジンが提供する関数です。
lib_task.ParamGet: タスクに渡されるパラメータの値を取得する。
lib_sys.urlContent.Get: Getリクエストを行う。
lib_sys.io.file.WriteAllText: データをファイルとして保存する。
lib_task.LogMessage: タスクの実行ログに記録する。
image.png
適用ボタンで再度保存しましょう。いままでの作業が水の泡なんていやですからね。
以上でGetリクエストを発してデータを取得して、JSONファイルとして指定のフォルダに保存するという一連の処理は完成です。
接続テストボタンで実行試験を行うこともできます。またOKボタンで保存したうえで、タスク一覧の右クリックメニューから実行を選択することもできます。
image.png
image.png
タスクが正常に動作するとJSONファイルは、パラメータで渡された作業フォルダであるこのフォルダに保存されます。

C:\Users\{あなたのアカウント名}\AppData\Local\Temp\SL_Temp\SL_Inst_MAIN\SL_Scheduler\

image.png

先ずは動くタスクを作成ということで、データの取得範囲をJavaScript埋め込みで2022-09-01から2022-09-30としました。

var fromDateFilter = "2022-09-01";
var tillDateFilter = "2022-09-30";

このタスクを自動化するに辺り、この日付もパラメータにしたいです。

タスクの自動化

どの日付範囲のデータを取得するかを決めて、日付を先のJavaScriptアクションにパラメータとして渡します。
タスクは毎日実行させるつもりなので、データを書き込んでいるテーブルから最新の日付(MAX(J001.[公表_年月日]))を取得して、その日付をFrom値とします。To値はFrom値に1を足した日付としましょうか。
From MAX(J001.[公表_年月日]) To From値 + 1日
これをSharperlightクエリで算出するようにします。なので先のタスクを開いてクエリの組み合わせアクションを追加します。
image.png
クエリはこんな感じですね。
image.png
日付範囲始め、つまりFrom値は、テーブルの公表年月日をこのように形式設定して文字列として返します。
image.png
日付範囲終わり、つまりTo値は、テーブルの公表年月日に1日を足した日付をこのように形式設定して文字列として返します。
image.png
これらの値を先のJavaScriptに渡します。
image.png
JavaScriptアクションの後にクエリの組み合わせ終了アクションを追加して完成。

これで毎回タスクが決まった時間に実行されるたびにクエリで算出された日付を利用して、APIエンドポイントからデータを取得しJSONファイルとして保存することができます。

そうそうタスクが実行開始されてすぐ、ワークフォルダのJSONファイルをクリアした方がいいですね。ファイル削除アクションも追加しましょうか。このような感じです。
image.png

以上でデータ取得の自動化の作成が終了です。後はこのタスクが実行された直後に、今度は保存されているJSONファイルの内容、つまりデータをデータベースに書き込むタスクが必要ですね。
それについては次回の記事で。

では、失礼します。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0