LINE Chatbot 開發手札

LINE, Chatbot, LINE Message API, webhook, Azure Bot Service, LUIS

        //# 送出Flex Message
        //                String jsonMsg = @"[{
        //""type"": ""flex"",
        //""altText"": ""This is a Flex Message"",
        //""contents"": {
        //    ""type"": ""bubble"",
        //    ""hero"": {
        //        ""type"": ""image"",
        //        ""url"": ""https://scdn.line-apps.com/n/channel_devcenter/img/fx/01_1_cafe.png"",
        //        ""size"": ""full"",
        //        ""aspectRatio"": ""2:1""
        //    },
        //    ""body"": {
        //        ""type"": ""box"",
        //        ""layout"": ""horizontal"",
        //        ""contents"": [
        //            {
        //            ""type"": ""text"",
        //            ""text"": ""Hello, World!"",
        //            ""wrap"": true
        //            }
        //        ]
        //    }
        //}
        //}]";

引言

用來進行LINE Chatbot 開發指引,預計實作相關技術有: LINE Message API + Azure Bot Service + Azure LUIS + Azure SQL

名詞解釋

因為大多Chatbot相關名詞,整理一下以減少混亂。

  • Chatbot, 為[應用面名詞],聊天室機器人。

  • webhook, 為[應用面名詞],讓一個網站能訂閱另一個網站的方法。

  • LINE Message API, 為[LINE技術名詞]。實作LINE Chatbot的(聊天問答)主模組,可以用介面設定簡單的回應,進階的問答要另外實作webwook。

  • Azuer Bot Servie, 為[Azuer技術名詞],為webhook的實作之一。 可用來實作很多社交應用的Chatbot,包含LINE,Facebook,Skype,Slack等等其它。

  • Azure LUIS, 為[Azuer技術名詞],Language Understanding Intelligent Service,語意理解認知服務, 用簡易的關鍵字(Entities)、使用者意圖(Intents)設定,經由機器學習訓練出精確度更高的語意判斷。 相同的產品有 Google Dialogflow, Microsoft LUIS, IBM Watson Assistant

第一個LINE bot (留參)

了解LINE bot(webhook)的組織為開發程序。

下面兩篇文章說明如何建立 Echo Bot,請依文章實作。(應該還會參考其它文章輔助不足,請自行拜訪google大神)

成果展示

若設定成功,在Azure Bot 服務可以看到設定好的 Chatbot。

若設定成功,一套Azure的 Web App Bot 會產生三項資源。

第一個LINE bot - 重置

如下視頻:用LineBotSDK開發 webhook

【Live講堂】Line Bot聊天機器人極速開發
用 Azure 快速部署與開發 LINE bot

影片有點舊還是有參考價值。很懶啊,先留下關鍵字: LINE Message API, Webhook, LIFF, Azure LUIS, Azure App Service, ngrok

webhook 範本程式碼留存

第二個LINE bot

加入Azuer SQL。 記錄LINE可以抓到的全部行為。

加入Azuer SQL。

已加入Azure SQL,基本上用去與 SQL Server 差異不大。

記錄LINE可以抓到的全部行為

LINE webhook 可以抓到的訊息只有使用者發出的聊天訊息。 其他非聊天的路徑,比如 PUSH_MESSAGE、REPLY_MESSAGE 是抓不到的,要自己想辦法紀。

第三個LINE bot

改用 LineBotSDK開發 webhook。原先使用的Azure Bot Service 只做出『通用型』的聊天機器人做不出專業型的機器人故不再使用。

LineBotSDK 是專為 LINE 設計的,可惜是野人版已落後一年半未更新。還是可以用用看。LINE 官方出的 Message API (webhook) SDK 沒有 C# 版本,很囧。

試 著由Chatbot回應訊息。應該可以搭配LINE Message API的圖文訊息設定等等。

已成功試送出圖文訊息。以下程式碼留參用:

flex_message_simple_sample.cs
// JSON Message 請參考:https://github.com/isdaviddong/HOL-LineBotSDK/blob/master/basic/Lab%2004:%20%E5%A6%82%E4%BD%95%E7%99%BC%E9%80%81Flex%20Message.md

//# 送出Flex Message
String jsonMsg = @"[{
""type"": ""flex"",
""altText"": ""This is a Flex Message"",
""contents"": {
    ""type"": ""bubble"",
    ""hero"": {
        ""type"": ""image"",
        ""url"": ""https://foo.web.server/image001.png"",
        ""size"": ""full"",
        ""aspectRatio"": ""2:1""
    },
    ""body"": {
        ""type"": ""box"",
        ""layout"": ""horizontal"",
        ""contents"": [
            {
            ""type"": ""text"",
            ""text"": ""Hello, World!"",
            ""wrap"": true
            }
        ]
    }
}
}]";
PushTextMessage.cs
[HttpPost("[Action]")]
public IActionResult PushTextMessage(PushTextMessageArgs args)
{
  try
  {
     // 送出文字訊息
     isRock.LineBot.Utility.PushMessage(ADMIN_USERID, args.textMessage, CHANNEL_ACCESS_TOKEN);
     //response OK
		 return Ok();
  }
  catch (Exception ex)
  {
    //回覆訊息
    isRock.LineBot.Utility.PushMessage(ADMIN_USERID, "發生錯誤:\n" + ex.Message, CHANNEL_ACCESS_TOKEN);
    //response OK
		return Ok();
  }
}
PushFlexMessage.cs
[HttpPost("[Action]")]
public ErrMsg PushTextMessage(PushTextMessageArgs args)
{
    try
    {
        /// 送出圖文訊息
        /// JSON Message 請參考:https://github.com/isdaviddong/HOL-LineBotSDK/blob/master/basic/Lab%2004:%20%E5%A6%82%E4%BD%95%E7%99%BC%E9%80%81Flex%20Message.md
        var flexMsg = new object[] {
            new {
                type = "flex",
                altText = "This is a 圖文訊息。",
                contents = new {
                    type = "bubble",
                    hero = new {
                        type = "image",
                        url = "https://foo.web.server/image001.png",
                        size = "full",
                        aspectRatio = "2:1"
                    },
                    body = new {
                        type = "box",
                        layout = "horizontal",
                        contents = new [] {
                            new {
                                type = "text",
                                text = "哈囉, World!",
                                wrap = true
                            }
                        }
                    }
                }
            }
        };

        string jsonMsg = JsonConvert.SerializeObject(flexMsg);
        isRock.LineBot.Utility.PushMessagesWithJSON(ADMIN_USERID, jsonMsg, CHANNEL_ACCESS_TOKEN);

        return ErrMsg.Success;
    }
    catch (Exception ex)
    {
        //回覆訊息
        isRock.LineBot.Utility.PushMessage(ADMIN_USERID, "發生錯誤:\n" + ex.Message, CHANNEL_ACCESS_TOKEN);
        //response OK
        return new ErrMsg(ex.Message, ErrTypeEnum.Exception, ex);
    }
}

第四個LINE bot

再加入LUIS強化語意判斷。

尚未打算做進階的聊天機器人,先放著。

進一步參考

(先這樣)

Last updated