新型コロナウイルス感染者数オープンデータで感染者数レポートを作る

概要

このサンプルは、Webhook外部データ参照を利用し、 新規コロナウイルス感染者数オープンデータから必要な情報を取得し、感染者数レポートを作成する方法を説明します。

用意するもの

  • 報告書:感染速報.xlsx
  • SPALOボット:Covid19 感染速報
  • WebAPI:全国感染者数オープンデータ
  • Webhookウェブアプリ:NodeJs
  • 公開サーバ:Google Cloud Functions
  • SPALO-APIs:Webhook外部データ参照

報告書の作成

以下の項目を持つ報告書を Excel で作成します。

都道府県、日付、その日の感染者、累計数、備考
報告書

会話の設計

報告書の各項目を入力する際のボットとの会話と回答タイプは以下のようにします。

都道府県

この質問を出すタイミングで、外部データ参照 Webhook を呼び出し、都道府県一覧を表示します。

  • 回答タイプ:外部データ参照
  • 質問文:都道府県を選択してください。

日付

  • 回答タイプ:日付
  • 質問文:日付は?

その日の感染者

この質問を出すタイミングで、外部データ参照Webhookを呼び出し、選択された都道府県、入力された日付の感染者数を表示します。

  • 回答タイプ: 外部データ参照
  • 質問文:感染者は以下の通りです。OKならタップしてください。

累計数

この質問を出すタイミングで、外部データ参照Webhookを呼び出し、東京都の2021年1月1日の累計数を表示します。

  • 回答タイプ:外部データ参照
  • 質問文:その日までの累計数は以下の通りです。OKならタップしてください。

備考

  • 回答タイプ: テキスト
  • 質問文:備考があれば記載してください。

Webhook受信アプリの作成

Webhook通知を受け取り、オープンデータを検索し、SPALOボット側に情報を返すアプリケーションを作成します。Node.js を使ってコーディングし、Google Cloud Functions にデプロイします。Webhook 通知されるオブジェクトのデータ構造の詳細は、こちら をご覧ください。

検索キーワードの取得

Webhook通知時の検索項目名を、以下のように取得します。検索項目名は、SPALO ボットを作成する際、各回答タイプに設定する「項目名」です。

const itemName = req.body.item_name;

都道府県検索

itemNameより検索項目を判別し、都道府県検索の場合は、予め作成した都道府県情報(pref.json)を返します。

  if (itemName === '都道府県') {
    res.send(pref.items).end();
  }

感染者検索

itemNameより検索項目を判別し、感染者の場合は、オープンデータ API を呼び出し、感染者数を取得して返します。

  else if (itemName === '感染者') {
    const pref = data[0].value;
    const now_value = data[1].value;
    const now = new Date(now_value + ' 9:00');
    const now_fmt = new Date(now).toFormat('YYYYMMDD');
    const ytd = new Date(now.setDate(now.getDate() - 1));
    const ytd_fmt = new Date(ytd).toFormat('YYYYMMDD');
    kansensya(pref, now_fmt).then((now_person) => {
      kansensya(pref, ytd_fmt).then((ytd_person) => {
        const person = String(now_person - ytd_person);
        res.send([person]).end();
      });
    });
  }

累計数検索

itemNameより検索項目を判別し、累計者の場合は、オープンデータ API を呼び出し、累計者数を取得して返します。

  // 累計数検索
  else if (itemName === '累計数') {
    const pref = data[0].value;
    const now_value = data[1].value;
    const now = new Date(now_value);
    const now_fmt = new Date(now).toFormat('YYYYMMDD');
    kansensya(pref, now_fmt).then((now_person) => {
      const person = String(now_person);
      res.send([person]).end();
    });
  }

WebhookURLの発行

開発サーバを起動し、ngrok を使い、ローカルテスト用のWebhookURL を発行します。Cloud Functions のローカルサーバでのテストを方法は、https://cloud.google.com/functions/docs/functions-framework?hl=ja を参考にしてください。

npm start
ngrok http 8080

ngrokより発行されたhttpsのURLをメモします。

npm start
ngrok

WebhookURLの登録

SPALO メーカーの外部サービス連携より、先ほど発行したngrokのURLを登録します。(Google Cloud Functions に Deploy したら、Google Cloud Functions で発行された URL に切り替えます。)
登録すると、WebhookCode が発行されるので、メモします。

WebhookURLの登録

SPALOボットの作成

会話の設計に基づき、SPALOボットを作成します。

都道府県、感染者は、累計数は、回答タイプ(外部データ参照)を選択して作成します。WebhookCode には、先ほどメモした WebhookCode を設定します。

シナリオ作成画面

ローカルテスト

SPALOアシスタントで、作成したボットの動作を確認します。

動作確認

デプロイ

Cloud Functions にデプロイして、WebhookURL を発行します。URL が発行されたら、SPALO メーカーに登録した、ngrok の URL を、Cloud Functions の URL の置き換えます。この際、不正アクセスを防ぐための SecretKey をコピーしておきます。

 gcloud functions deploy covidreport --runtime=nodejs10 --trigger-http --allow-unauthenticated

エンドポイント保護

WebhookURLの登録時に発行されたSecretKeyを使い、 不正なアクセスからエンドポイントを保護します。保護の仕方は こちら をご覧ください。

完成

エンドポイント保護対策を入れたら、再度、デプロイします。

SPALO メーカーで作ったボットを「承認申請」し、管理者に「承認」を依頼します。承認され、SPALO アシスタントでレポートが「送信」できるようになったら完成です。

ダウンロード

この記事で紹介したサンプルは以下からダウンロードできます。