新型コロナウイルス感染症相談ボットの作成

##概要
普段は耳鼻咽喉科の開業医をしています。

新型コロナウイルス感染患者数が増えていますね。発熱や風邪症状が出ると心配になるかと思います。各自治体に「帰国者・接触者相談センターセンター」があり相談の目安が政府から公表されているのは皆さんもご存じかと思います。それとは別に新型コロナウイルス感染症が流行している国や地域に行った方などが発熱や風邪症状が出た場合は医療機関を受診する前にまず「帰国者・接触者相談センター」に連絡することになっています。

このあたりが少しややこしいので『ボットの質問に答えていくと「帰国者・接触者相談センター」に連絡すべきかどうかがわかるLINE Bot」を作成しました。

適切な電話相談のタイミングが分かり、感染の拡大や重症化の防止、相談センターの方の負担軽減につながればいいなと思っています。

##完成動画
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">新型コロナウイルス感染症相談ボット <a href="https://t.co/YIQ6SosOMe">pic.twitter.com/YIQ6SosOMe</a></p>&mdash; 病気のセルフチェック (@Selfcheckhealt1) <a href="https://twitter.com/Selfcheckhealt1/status/1244079643868540928?ref_src=twsrc%5Etfw">March 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

##作成方法
政府や自治体からの新型コロナウイルスに関する発表、所轄の保健所や学会からの連絡を基にプログラムを作成しました。開発者（医師）自身の考えはプログラムには組み込んでいません。
新型コロナウイルスの感染が認められている国・地域の情報は外務省のホームページに、
国内のクラスターマップは厚生労働省のホームページ（地方自治体の報道発表等に基づき新型コロナウイルス厚生労働省対策本部が集計した速報値に基づくもので、随時更新される）にリンクさせました。
電話相談の基準を満たしているならば連絡先が表示され、そうでない場合は自宅安静やかかりつけ医への相談が推奨されます。
※このボットは「発熱や風邪症状がある方」を対象としています。

こちらのBotのコードをいじって作ったので変数名が一部そのままになってます。
[耳年齢を判定するLINE Bot×Iotの作成](https://qiita.com/doikatsuyuki/items/1101ff4ba54cb4b471c0)

```index.js
'use strict';
require('dotenv').config();
const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

const config = {
    channelSecret: "自分のchannelSecret",
    channelAccessToken: "自分のchannelAccessToken"
};

const app = express();
app.use(express.static('public'));

app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)

app.post('/webhook', line.middleware(config), (req, res) => {
  console.log(req.body.events);

  //ここのif分はdeveloper consoleの"接続確認"用なので削除して問題ないです。
  if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){
    res.send('Hello LINE BOT!(POST)');
    console.log('疎通確認用');
    return;
  }

  Promise
      .all(req.body.events.map(event=>handleEvent(event,req)))
      .then((result) => res.json(result));     
});


const client = new line.Client(config);

function handleEvent(event, req) {
  // console.log(req);
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  // LINE botのプログラム
  let ans = "";
  let question = event.message.text;
  
  let hz;

  let yes = "";
  let  no = "";
  if (question == "開始") {
    hz = 1;
    ans = "発熱または風邪症状がありますか？";
    yes = "発熱：はい";
    no = "発熱：いいえ";
  } else if (question == "発熱：はい") {
    hz = 2;
    ans = "新型コロナウイルス感染症であることが確定した人と濃厚接触歴がありますか？";
    yes = "感染者濃厚接触：はい";
    no = "感染者濃厚接触：いいえ";
  } else if (question == "感染者濃厚接触：いいえ") {
    hz = 3;
    ans = "発症前14日以内に新型コロナウイルス感染症の流行が確認されている国や地域に行きましたか？";
    yes = "流行地域：はい";
    no = "流行地域：いいえ";
  } else if (question == "流行地域：いいえ") {
    hz = 4;
    ans = "発症前14日以内に新型コロナウイルス感染症の流行が確認されている国や地域に行った人と濃厚接触歴がありますか？";
    yes = "流行地域、濃厚接触：はい";
    no = "流行地域、濃厚接触：いいえ";
  } else if (question == "流行地域、濃厚接触：いいえ") {
    hz = 5;
    ans = "発症前14日以内にライブハウス、スポーツクラブ、介護施設、老人ホーム、お祭り、クルーズ船など感染者が多発した施設あるいはイベントに行きましたか？";
    yes = "施設、イベント：はい";
    no = "施設、イベント：いいえ";
  } else if (question == "施設、イベント：いいえ") {
    hz = 4;
    ans = "発症前14日以内に感染者が多発した施設あるいはイベントに行った人と濃厚接触歴がありますか？";
    yes = "施設、濃厚接触：はい";
    no = "施設、濃厚接触：いいえ";
  } else if (question == "施設、濃厚接触：いいえ") {     
    ans = "以下の(1)または(2)の症状が2日以上続いていますか？(1)風邪の症状や37．5度以上の発熱（解熱剤を飲み続けなければならない場合も同様）、(2)強いだるさや息苦しさ";
    yes = "2日以上：はい";
    no = "2日以上：いいえ";
  } else if (question == "2日以上：はい") {      
    ans = "以下のいずれかに当てはまりますか？高齢である、糖尿病・心不全・呼吸器疾患（COPD等）の基礎疾患がある、透析を受けている、免疫抑制剤や抗がん剤等を用いている、妊娠中である";
    yes = "基礎疾患：はい";
    no = "基礎疾患：いいえ";
  } else if (question == "基礎疾患：いいえ") {     
    ans = "以下の(1)または(2)の症状が４日以上続いていますか？(1)風邪の症状や37．5度以上の発熱（解熱剤を飲み続けなければならない場合も同様）、(2)強いだるさや息苦しさ";
    yes = "4日以上：はい";
    no = "4日以上：いいえ";
  } else if (question == "発熱：いいえ" || question == "2日以上：いいえ" || question == "4日以上：いいえ") {    
    hz = 0;
    ans = "自宅で安静にするか、かかりつけ医にご相談ください。";
  } else if (question == "感染者濃厚接触：はい" || question == "流行地域：はい" || question == "流行地域濃厚接触：はい" || question == "流行地域、濃厚接触：はい" || question == "施設、イベント：はい" || question == "施設、濃厚接触：はい") {  
    hz = 6;
    ans="医療機関は受診せず、「船橋市新型コロナウイルス感染症相談センター（電話：047-409-3127）【聴覚障害などにより電話での相談が難しい方は、FAX：047－409－2952】」に連絡してください。";
  } else if (question == "基礎疾患：はい" || question == "4日以上：はい") {   
    hz = 7;
    ans = "「船橋市新型コロナウイルス感染症相談センター（電話：047-409-3127）【聴覚障害などにより電話での相談が難しい方は、FAX：047－409－2952】」に相談してください。";
  } else if (question == "電話") { 
    hz = 7;    
    ans = "「船橋市新型コロナウイルス感染症相談センター（電話：047-409-3127）【聴覚障害などにより電話での相談が難しい方は、FAX：047－409－2952】」に相談してください。";
  } 
  
  let title;
  let url;
  if (hz == 1) {
    url = "「はい」か「いいえ」どちらかをお選びください";
  } else if (hz == 2) {
    url = "※濃厚接触とは、以下のような状況です : 感染者と同居、車内や航空機内等で、２メートル以内での長い時間の会話 / マスクや手袋などの個人防護具なしでの感染者の看護・介護 / 感染者の唾や鼻水、体液等に直接触れた";
  } else if (hz == 3) {
    title = "流行国・地域はこちら"
    url = "https://www.anzen.mofa.go.jp/covid19/country_count.html";
  } else if (hz == 4) {
    url = "※濃厚接触とは、以下のような状況です : 同居、車内や航空機内等で、２メートル以内での長い時間の会話 / マスクや手袋などの個人防護具なしで看護・介護 / 唾や鼻水、体液等に直接触れた";
  } else if (hz == 5) {
    title = "クラスターマップはこちら"
    url = "https://www.mhlw.go.jp/content/10900000/000609647.pdf";
  } else if (hz == 6 || hz == 7) {
    title = "全国の相談センターはこちら"
    url = "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/covid19-kikokusyasessyokusya.html";
  }
  
  if (hz == 0) {
    return client.replyMessage(event.replyToken, {
      type: 'text',
      text: ans
    });
  }
  if (hz==1||hz == 2||hz==4)
  {
    return client.replyMessage(event.replyToken, [      
      {
      "type": "template",
      "altText": "this is a confirm template",
      "template": {
          "type": "confirm",
          "text": ans,
        "actions": [             
              {
                "type": "message",
                "label": "はい",
                "text": yes
              },
              {
                "type": "message",
                "label": "いいえ",
                "text": no
              }
          ]
      }
      },
       {
        type: "flex",
        altText: "追加情報",
        contents: {
          type: "bubble",
          body: {
            type: "box",
            layout: "vertical",
            spacing: "md",
            contents: [              
              {
                type: "text",
                text:url,
                wrap: true,
                color: "#aaaaaa",
                size: "lg"
              }
            ]
          }
        }
      }    
    ]);
  }
  if (hz==3||hz==5)
  {
    return client.replyMessage(event.replyToken, [
      {
        "type": "template",
        "altText": "this is a confirm template",
        "template": {
            "type": "confirm",
            "text": ans,
          "actions": [             
                {
                  "type": "message",
                  "label": "はい",
                  "text": yes
                },
                {
                  "type": "message",
                  "label": "いいえ",
                  "text": no
                }
            ]
        }
        },
      {
        type: "flex",
        altText: "Flex Message",
        contents: {
          type: "bubble",
          footer: {
            type: "box",
            layout: "vertical",
            spacing: "sm",
            contents: [
            
              {
                type: "button",
                action: {
                  type: "uri",
                  label: title,
                  uri: url
                },
                height: "sm",
                style: "link"
              }
            ]
          }
        }
      }
    ]);
  }
  if (hz==6||hz == 7)
  { console.log("+++++++++++++電話+++++++++++")
    return client.replyMessage(event.replyToken, [           
      {
        type: 'text',
        text: ans
      },
      {
        type: "flex",
        altText: "Flex Message",
        contents: {
          type: "bubble",
          footer: {
            type: "box",
            layout: "vertical",
            spacing: "sm",
            contents: [
            
              {
                type: "button",
                action: {
                  type: "uri",
                  label: title,
                  uri: url
                },
                height: "sm",
                style: "link"
              }
            ]
          }
        }
      }
    ]);
  }
  
  else {
    return client.replyMessage(event.replyToken, [     
      {
      "type": "template",
      "altText": "this is a confirm template",
      "template": {
          "type": "confirm",
          "text": ans,
        "actions": [             
              {
                "type": "message",
                "label": "はい",
                "text": yes
              },
              {
                "type": "message",
                "label": "いいえ",
                "text": no
              }
          ]
      }
      },    
    ]);
  }
 
}

(process.env.NOW_REGION) ? module.exports = app : app.listen(PORT);
console.log(`Server running at ${PORT}`);
```

##考察
現在、連絡先の電話やFaxの番号は医院がある自治体（船橋市）の「帰国者・接触者相談センターセンター」のものになっています。船橋市在住でない方はこちらには電話しないようお願いいたします。他の地域のユーザーのため全国の相談センターが出ている厚生労働省のホームページをリンクしていますが、ユーザーの位置情報や自宅住所を入力するとユーザー居住地の「帰国者・接触者相談センター」の電話番号などが分かるようにできれば他の自治体の方も使いやすいものができるのではないかと思っています。やり方ご存じの方は教えていただけると嬉しいです。

##ボットのURLとQRコード
**URL**    https://lin.ee/teqrODx

**QRコード**
![covid19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/b137734d-f45d-b887-b41c-2e6e9691e622.png)