# 聊天機器人實務應用 ## 運用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}]"}
    3325 views