# 防疫口罩大作戰

#### 前情提要

因 武漢肺炎疫情、口罩實名制 等重大事件，當衛福部將口罩庫存數量以 open data 的方式開放後，掀起了一場口罩黑客松的熱潮，[口‍罩供‍需資‍訊平‍台](https://mask.pdis.nat.gov.tw/) 中可以看到，許多貢獻者在數個小時後製作出各式各樣的應用，在這些貢獻者的努力下，透過科技與 open data 彌平了資訊落差。

[健保特約機構口罩剩餘數量明細清單](https://data.nhi.gov.tw/Datasets/DatasetDetail.aspx?id=656)

#### 透過 GOSU BAR 擁抱 open data 製作出你的口罩庫存查詢聊天機器人

短時間的設定，你也可以做出自己的聊天機器人，話不多說，先來看看成果吧！

<iframe allowfullscreen="allowfullscreen" height="314" src="//www.youtube.com/embed/P6zuxpp1NtI" width="560"></iframe>

#### 製作教學

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/aDJ6iWovhpqMUSWJ-image-1581327806752.png)

製作完成的流程如上圖，首先我們先建立兩個起始點，分別是收到文字、加入好友。

設定一個決策點，區分引導類型的文字：

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/7v9Bg8DFh9JJTUHe-image-1581327980193.png)

當觸發引導文字或成為好友時，提供使用者引導對話：

 ![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/aMY1SyEt5v5fwO5C-image-1581328047501.png) ![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/w6FjJoNZEXloEHxL-image-1581328236054.png)

當使用者輸入其他資訊時，要到 opendata 中 [健保特約機構口罩剩餘數量明細清單](https://data.nhi.gov.tw/Datasets/DatasetResource.aspx?rId=A21030000I-D50001-001) 抓取最新資料並篩選後提供卡片

首先使用 執行API 節點抓取 CSV 資料， URL: [https://data.nhi.gov.tw/resource/mask/maskdata.csv](https://data.nhi.gov.tw/resource/mask/maskdata.csv)，型態: CSV

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/pXvNfrO2eHPZdJOF-image-1581328424017.png)

為了使用者體驗，當 open data 在維修、更新等情況資料無法讀取時，我們要給我使用者文字訊息回饋：

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/oNjDIKc1CBHzPgdQ-image-1581328626234.png)

當讀取成功時，我們要透過 執行程式碼節點 完成資料整理以及篩選：

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/teT2zFVNF1X8TfOP-image-1581328896350.png)

// 複製專區

---

let content = (record.content || "").trim();

<div id="bkmrk-tmp.data-%3D-tmp.data."><div>tmp.data = tmp.data.slice(1).map(row =&gt; {</div><div> return {</div><div> code: row[0],</div><div> name: row[1],</div><div> address: row[2],</div><div> phone: row[3],</div><div> adultMaskCount: row[4],</div><div> childMaskCount: row[5],</div><div> updatedAt: row[6]</div><div> }</div><div>}).filter(d =&gt; {</div><div> return d.name.includes(content)|| d.address.includes(content)</div><div>}).sort((a, b) =&gt; {</div><div> return parseInt(b.adultMaskCount)- parseInt(a.adultMaskCount);</div><div>}).slice(0, 10);</div>  
<div>tmp.i = -1;</div></div>---

當資料整理篩選完畢後，我們接下來就要透過流程迴圈方式：

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/YgiuVElwdL61dNUl-image-1581329137432.png)

先透過 執行程式碼 來做迴圈的前處理：

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/GVNbMWuTKUbbV6Z7-image-1581329712792.png)

// 複製專區

---

tmp.i ++;

tmp.card = tmp.data\[tmp.i\];

---

接著透過決策點控制迴圈：

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/m5NS22VmZzx5az6r-image-1581331880705.png)![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/1v2yutKd4OMhUGeT-image-1581332026019.png)

當找不到相關的資訊：

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/vXA91fj1sAc6neK1-image-1581332128236.png)

產生卡片方式

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/n4EOrMHUNVUJWyO0-image-1581332339184.png)

![](https://book.gosu.bar/uploads/images/gallery/2020-02/scaled-1680-/p72Hugugidm1fsdE-image-1581332375676.png)

// 複製專區

---

// 標題  
${tmp.card.name}

// 內容  
口罩數量狀況：  
成人 ${tmp.card.adultMaskCount} 個\\t 兒童 ${tmp.card.childMaskCount} 個  
地址: ${tmp.card.address}  
資料更新: ${tmp.card.updatedAt}

// 按鈕 1 - 連結 - 致電詢問  
tel://${tmp.card.phone}  
  
// 按鈕 2 - 連結 - Google Map  
[https://www.google.com.tw/maps/place/${tmp.card.address}](https://www.google.com.tw/maps/place/%24%7Btmp.card.address%7D)

// 按鈕 3 - 說話 - 更新資訊  
${tmp.card.name}

---

完成流程之後就可以擁有一個自己的口罩庫存查詢聊天機器人了！

<div id="bkmrk--17"><div></div></div>