# 聊天機器人實務應用
## 運用Line官方帳號實作聊天機器人
僑光科技大學 資訊科技系
高吉隆 助理教授級專業技術人員
電子信箱:kevinkao888@gmail.com
----
# 課程大綱
* 什麼是聊天機器人?
* 為何選擇 LINE?
* LINE 官方帳號 2.0
* LINE Message API
* LINE 整合企業資料庫
---
## 什麼是聊天機器人?
* 語音雙向對話機器人(家用型小米AI音箱)
* 雲端查詢:今天天氣如何?
* 問題詢問:現在幾點?
* 功能設定:7點叫我起床!
* 雲端功能:我想聽周杰倫的七里香!
* 設備控制:幫我關掉音樂!
* 物聯網應用:幫我打開掃地機器人!
* 影片介紹:[https://www.youtube.com/watch?v=GcrYBb1fh2s](https://www.youtube.com/watch?v=GcrYBb1fh2s)
----
### 聊天機器人原理介紹
* 語音轉文字
* 文字語意分析
* NLP自然語言處理
* 從資料庫中尋找關鍵字
* 回覆文字內容
* 文字轉語音
----
### 為何使用 LINE 設計聊天機器人
* 在台灣使用滲透率高
* 活躍用戶2100萬(人口總數2300萬)
* 可以緊密結合與人的互動
* 用戶可以直接由LINE看見訊息
* 費用、技術入門門檻低
* 可以免費直接申請使用
* 可以設定回應網址(各種程式語言)
----
### LINE官方帳號2.0
* 升級公告(2019.04.18陸續升級):[連結](https://event-web.line.me/ectw/publication/LINE+%E7%94%9F%E6%B4%BB%E5%9C%88%E5%85%A8%E9%9D%A2%E5%8D%87%E7%B4%9A+%E5%85%A8%E6%96%B0%E5%AE%98%E6%96%B9%E5%B8%B3%E8%99%9F2+0%E8%A8%88%E7%95%AB-3731de66d5b124d7624f064137ba31164baccd2f1cda1fe6bcd5a72e24c02eb8?utm_source=OA&utm_medium=LINE%40migration)
* 帳號來源
* 由原有LINE@生活圈帳號升級
* LINE@生活圈介紹:[連結](https://at.line.me/tw/)
* 由原有的官方帳號1.0升級
* Line Account Connect:[連結](https://www.linebiz.com/tw/service/line-account-connect/)
* 全新建立:
* 申請官方帳號:[連結](https://www.linebiz.com/tw/service/line-account-connect/?utm_source=at-blog.line.me&utm_medium=referral&utm_campaign=blog-old-essay)
* 成功案例分享:[連結](https://www.linebiz.com/tw/case-study/)
---
## 應用案例說明:智慧報到機器人
* 活動痛點
* 如何不讓與會者報到時,花費過長時間排隊?
* 如何獲取與會者的詳細資訊?
* 如何有效率地發放與會資料?
* 設計目標
* 用 Line 聊天機器人提升活動效率
* 產品設計
* 智慧報到機器人
----
### 智慧報到機器人 Chatbot 腳本設計
* 與會者掃描QRcode後,將與會者帶入對話視窗
* 觸發機器人跳出招呼語,並要求輸入與會編號
* 回應桌次和客戶資訊,並自動填入報到時間
* 報到完成,觸發機器人進入填寫問卷網頁
* 與會者填寫完問卷後,進入兌換贈品流程
* 憑卡片兌換贈品,由現場人員點擊核銷(僅限兌換一次)
* [參考資料](https://medium.com/8-interactive/%E9%AB%94%E7%8F%BE%E6%9C%8D%E5%8B%99%E8%A8%AD%E8%A8%88-%E6%99%BA%E6%85%A7%E5%A0%B1%E5%88%B0%E6%A9%9F%E5%99%A8%E4%BA%BA-%E9%87%8D%E7%A3%85%E7%99%BB%E5%A0%B4-400840faab12)
----
### 學生專題:幼兒接送智慧廣播系統
* 情境說明
* 家長到校接送時才通知兒童造成等待太久
* 可預先使用 LINE 做身份認證並通知校方
* 減少家長等待時間,避免造成交通混亂
![](https://i.imgur.com/0tHNyr2.png)
----
### 幼兒接送:LINE 聊天機器人功能說明
* 身份認證:輸入身份證後5碼+兒童生日月日
* 立即廣播:認證後可於LINE中點選立即廣播
* 預約廣播:可於到校前指定預約廣播時間
![](https://i.imgur.com/ySNruFg.png =300x500)
----
### 活動官方帳號:美麗菲凡創意市集
* 活動流程圖:讓參觀者隨時了解活動
* 攤位介紹:各攤位使用圖文訊息及說明
* 加入好友:[連結](https://lin.ee/5hs65r)
|畫面|QRCode|
|-|:-|
|![](https://i.imgur.com/rSewVqp.png)|![](https://i.imgur.com/18s65Gr.png =300x400)|
----
### LINE官方帳號管理後台
* 後台網址:[連結](https://manager.line.biz/)
* 登入方式:
* 使用LINE帳號登入:個人管理後台
* 使用商用帳號登入:多人管理後台
* 帳號一覽:可同時申請多個官方帳號
* 後台功能:主頁、提醒、分析、聊天、設定
* 基本檔案:[連結](https://page.line.biz/)
----
### LINE官方帳號後台-主頁
* 群發訊息:發送至聊天區,會計數發送次數
* 貼文串:發送至貼文區,會計數發送次數
* 加入好友的歡迎訊息:第一次加入時的回應訊息
* 自動回應訊息:設定關鍵字可自動回應
* 圖文訊息:一連串的圖文訊息可以存成範本
* 圖文選單:固定在聊天區的下方選單,可設連結
* 加入好友:提供邀請進入官方帳號的各種方式
---
### 使用LINE Message API
* 官方帳號後台
* 設定=>回應設定
* 基本設定=>回應模式:聊天機器人
* 進階設定=>Webhook:啟用
* 設定=>Messaging API
* 啓用Messaging API
* 建立服務提供者:輸入名稱
* Webhook網址:https://line.ocu.tw/學號/bot1.php
* 連結LINE Developers網址:https://developers.line.biz/en/
----
### LINE Developer網站
* 建立/選擇Provider Name
* 取得Channel Secret
* 取得Channel Access Token
* Enable Use webhooks
* 下載網頁壓縮檔:https://line.ocu.tw/download/demo1.zip
* 上傳網頁:
* 主機:line.ocu.tw
* 帳號:line@ocu.tw
* 密碼:line@ocu
* 修改 demo1.php
* 上傳至 /s106XXXXX/demo1.php
----
### API 回應資料庫訊息
* 資料庫後台:https://line.ocu.tw/sql/
* 帳號:ocutw_line
* 密碼:line@ocu
* 下載網頁壓縮檔:https://line.ocu.tw/download/demo2.zip
* 修改 bot2.php
* Channel Secret
* Channel Access Token
----
### LINE BOT Designer
* 下載:https://developers.line.biz/en/bot-designer/download/
* 範例專案檔:[下載](https://line.ocu.tw/download/sample.lbd)
* PHP回應檔:[下載](https://line.ocu.tw/download/demo2.zip)
----
### LINE BOT Text Message Function
* 請自行修改文字內容
```php=
function text_emotion($code) {
$bin = hex2bin(str_repeat('0', 8 - strlen($code)) . $code);
return mb_convert_encoding($bin, 'UTF-8', 'UTF-32BE');
}
function message_text($string) {
return array('type' => 'text',
'text' => $string);
}
message_text("歡迎光臨!".text_emotion("100078"));
```
* 表情貼代碼:[下載](https://devdocs.line.me/files/emoticon.pdf)
----
### LINE BOT Image Message Function
* 請自行修改文字內容
```php=
function message_image($url) {
return array('type' => 'image',
'originalContentUrl' => $url,
'previewImageUrl' => $url);
}
message_image("https://line.ocu.tw/upload/image.png");
```
----
### LINE BOT Video Message Function
* 請自行修改文字內容
```php=
function message_video($url,$image) {
return array('type' => 'video',
'originalContentUrl' => $url,
'previewImageUrl' => $image);
}
message_video("https://line.ocu.tw/upload/video2.mp4",
"https://line.ocu.tw/upload/video2.png");
```
----
### LINE BOT Audio Message Function
* 請自行修改文字內容
```php=
function message_audio($url, $duration) {
return array('type' => 'audio',
'originalContentUrl' => $url,
'duration' => $duration);
}
message_audio("https://line.ocu.tw/upload/audio.mp3", 27000);
```
----
### LINE BOT Sticker Message Function
* 請自行修改文字內容
```php=
function message_sticker($package, $sticker) {
return array('type' => 'sticker',
'packageId' => $package,
'stickerId' => $sticker);
}
message_sticker("11537", "52002740");
```
* 貼圖代碼:[下載]( https://developers.line.biz/media/messaging-api/sticker_list.pdf)
----
### LINE BOT Location Message Function
* 請自行修改文字內容
```php=
function message_location($title, $address, $latitude, $longitude) {
return array('type' => 'location',
'title' => $title,
'address' => $address,
'latitude' => $latitude,
'longitude' => $longitude);
}
message_location("僑光科技大學",
"407台中市西屯區僑光路100號",
24.1900829,
120.6415948);
```
----
### LINE BOT Template Buttons Message Function
* 請自行修改文字內容
```php=
function message_buttons($url, $title, $text, $actions) {
return array('type' => 'template'
, 'altText' => 'template'
, 'template' => template_buttons($url, $title, $text, $actions));
}
function template_buttons($url, $title, $text, $actions) {
$action_array = array();
foreach ($actions as $value) {
$action = array('type' => 'message');
$keys = array("label", "text");
for ($i = 0; $i < count($keys); $i++) {
if ($i < count($value)) $action = $action + array($keys[$i] => $value[$i]);
}
array_push($action_array, $action);
}
return array('type' => 'buttons', 'thumbnailImageUrl' => $url, 'title' => $title, 'text' => $text, 'actions' => $action_array);
}
```
----
### LINE BOT Template Buttons Message Function Call
* 請自行修改文字內容
```php=
message_buttons("https://line.ocu.tw/upload/button.png"
, "請選擇以下功能"
, "選擇其一"
, array(array('功能一','sticker')
,array('功能二','location')
,array('功能三','video')
)
);
```
---
### 加入資料庫連結程式
* 加入以下連結資料庫程式碼
* get_echo_message函數中的第1行
```php=
$DB = new mysqli("localhost", "ocutw_line", "line@ocu", "ocutw_line");
if ($DB->connect_errno) exit();
$DB->set_charset("utf8");
```
* 加入以下讀取資料庫的程式碼
* get_echo_message函數中的switch case
```php=
case '1':
case '2':
case '3':
$sql = "SELECT UserName FROM User WHERE UserNo = ".$event['message']['text'];
$obj = $DB->query($sql)->fetch_object();
$UserName = $obj->UserName;
$echo_message = message_text($UserName);
break;
```
----
### 匯入 Excel 檔至 MySQL
* 建立資料表 10601XXX_store(學號_store)
* 請確認需要的欄位名稱
* 建立 Excel 檔含欄位名稱
* 輸入正式的資料值
* 另存成 CSV 檔含欄位名稱
* 請注意編碼為 UTF-8 或 BIG5
* 透過 phpMyAdmin 匯入 CSV 檔
* 請選擇一致的編碼
* 請略過第一列的欄位名稱
* 請選擇所有欄位或部分欄位
* 檢查中文資料是否正確?
----
#### 建立資料表(收集需要的欄位)
* 請依需求建立
* 以麥當勞搜尋餐廳為例:[連結](https://www.mcdonalds.com.tw/tw/ch/restaurant_locator.html)
* 輸入台中市、得來速的條件後的結果如下
![](https://i.imgur.com/EXnybmY.png)
----
#### 建立資料表 kevin_store
* 新增資料表 10601XXX_store(學號_store)
* 輸入結構以下的㯗位名稱及型態
* 請使用編碼 utf8mb4_unicode_ci
![](https://i.imgur.com/2JOOWNg.png =600x400)
----
#### 建立 Excel 檔
* 建立 Excel 檔:store.xls,[下載](https://line.ocu.tw/download/store.xls)
* 輸入以下欄位及資料如下:
![](https://i.imgur.com/shCDFc8.png)
* 另存成 CSV 檔:store.csv
![](https://i.imgur.com/1wWhbYt.png)
----
#### 使用 phpMyAdmin 匯入 CSV 檔
* 選擇資料表:10601XXX_store(學號_store)
* 選擇匯入功能,並選擇 store.csv
* 選擇編碼:將 UTF-8 改為 BIG5
* Excel 另存 CSV 預設編碼為 BIG5
* 由第一行開始跳過此數量的查詢:1
![](https://i.imgur.com/mz6PmKk.png =600x300)
----
#### 匯入部分欄位的 CSV 檔
* 若匯入全部欄位,可以省略以下步驟
* 若匯入部分欄位,需輸入㯗位名稱的清單:
* 如 No,Name,City,Addr
![](https://i.imgur.com/cjnStkX.png)
* 請用瀏覽功能檢查是否匯入成功?
* 尤其是中文是否正常顯示?
![](https://i.imgur.com/9H5Ucz7.png)
----
### 使用 SQL 指令將資料讀入
* 以讀出含兒童遊戲區的店家為例:
```sql=
SELECT No, Name, City, Addr, Tel FROM kevin_store WHERE IsChild = 1
```
* 執行後結果如下:
![](https://i.imgur.com/PI7iCoO.png)
----
### 使用 PHP 將資料讀入(文字顯示)
* 先將資料讀入變數 $row 中
```php=
$row = $DB->query($sql)
```
* 再用變數 $obj 讀出資料內容
```php=
$obj = $row->fetch_object(); echo $obj->Name;
```
```php=
case '0':
$sql = "SELECT No, Name, City, Addr, Tel FROM kevin_store WHERE IsChild = ".$event['message']['text'];
$row = $DB->query($sql);
$msg = "";
while($obj = $row->fetch_object()) {
$msg .= $obj->Name."\n";
$msg .= $obj->City.$obj->Addr."\n";
$msg .= $obj->Tel."\n\n";
}
$echo_message = message_text($msg);
break;
```
----
### Line中的顯示結果
![](https://line.ocu.tw/upload/DB2Text.jpg)
----
### 使用 PHP 將資料讀入(多頁訊息顯示)
* 先將變數 $pages 存放空陣列
```php=
$pages = array();
```
* 再用 array_push 將資料放入變數 $pages
```php=
array_push($pages, array($image, $title, $name,
array(array($action1,$text1),array($action2,$text2))));
```
```php=
case '1':
$sql = "SELECT No, Name, City, Addr, Tel FROM kevin_store WHERE IsChild = ".$event['message']['text'];
$row = $DB->query($sql);
$pages = array();
while($obj = $row->fetch_object()) {
array_push($pages, array("https://line.ocu.tw/upload/store".$obj->No.".png", $obj->Name, $obj->City.$obj->Addr,
array(array($obj->Tel,$obj->Tel))));
}
$echo_message = message_carousel($pages);
break;
```
----
### Line中的顯示結果
![](https://line.ocu.tw/upload/DB2Button.jpg =500x600)
----
### 由 OpenData 擷取資料示範
* 內政資料開放平台:[連結](https://data.moi.gov.tw/MoiOD/default/Index.aspx)
* 由關鍵字搜尋:如大廈管理
* 可以直接下載 CSV 檔:可刪除不必要的欄位
* 可以先建資料表結構:可只新增需要的欄位
* 再匯入 CSV 檔:請略過第一列的欄位名稱
---
## 使用 UserId 做身份驗證
* 新增資料表 10601001_user
* 新增欄位 No, UserId, Name, CheckId, Total
* 輸入測試資料
![](https://i.imgur.com/pPsDyHU.png)
![](https://i.imgur.com/FcSV4rp.png)
----
### 加入程式碼一
* 運用 $event["source"]["userId"] 辨識身份
* 若未驗證,回應請輸入驗證碼
* 若已驗證,回應此功能的內容
```php=
case 'user':
$sql = "SELECT Name, Total FROM kevin_user WHERE UserId = '".$event["source"]["userId"]."'";
$obj = $DB->query($sql)->fetch_object();
if ($obj->Name == '')
$echo_message = message_text("您未驗證身份,請輸入檢查碼(身份證後6碼+生日4碼)!");
else
$echo_message = message_text($obj->Name.",您好!總共金額".$obj->Total."元");
break;
```
----
### 加入程式碼二
```php=
default:
if (strlen($event["message"]["text"]) == 10) {
$sql = "SELECT No, Name, Total FROM kevin_user WHERE CheckId = '".$event["message"]["text"]."'";
$obj = $DB->query($sql)->fetch_object();
if ($obj->Name == '') {
$echo_message = message_text("檢查碼錯誤,請重新輸入!");
} else {
$echo_message = message_text("檢查碼正確!".$obj->Name.",您好!總共金額".$obj->Total."元");
$sql = "UPDATE kevin_user SET UserId = '".$event["source"]["userId"]."' WHERE No = $obj->No";
$DB->query($sql);
}
}
break;
```
----
## 利用 - 做關鍵字切割
```php=
$text1 = explode('-', $event['message']['text'])[0];
$text2 = "0";
if (count(explode('-', $event['message']['text'])) > 1) $text2 = explode('-', $event['message']['text'])[1];
switch ($text1) {
```
```php=
case 'store':
$sql = "SELECT IsChild, Is24hr, IsCafe, IsWifi, IsDrive FROM kevin_store WHERE No = ".$text2;
$obj = $DB->query($sql)->fetch_object();
$echo_message = message_text($obj->IsChild.$obj->Is24hr.$obj->IsCafe.$obj->IsWifi.$obj->IsDrive);
break;
```
```php=
array(array($obj->Tel,$obj->Tel),array("詳細資料","store-".$obj->No))));
```
{"metaMigratedAt":"2023-06-15T02:23:33.342Z","metaMigratedFrom":"Content","title":"聊天機器人實務應用","breaks":true,"contributors":"[{\"id\":\"9eed60a5-6546-4dfd-8445-07f81bcfde52\",\"add\":12441,\"del\":123}]"}