Azure 聊天機器人佈署與互動 手把手教學 大量圖

Azure 聊天機器人 (web app bot) 佈署與互動

內含大量圖

前情提要:

最近試用了第三方廠商Telerik出的WPF控件

裡面有一個對話的UI,他給的範例裡面有如何跟Azure上的WEB bot 作互動

但是我試了整整一天,都無法成功。

首先,我大部分的開發內容都是本地的應用程式與資料庫

對網際網路這一塊不是那麼的熟,以至於有些簡單的問題,我卡住了很久

後來在不斷的嘗試後,終於成功。

因此寫這篇文章,希望能幫助到跟我一樣的人。

 

正文開始

  1. 先在Azure上辦一個帳號取得試用資格
  2. 新建資源
    幫應用程式取個名字,定價層可以選F0免費的,機器人範本先用預設的Echo範本就好,然後按建立。
    要注意的是,如果這邊使用的App service是用新建的預設是S1 Standard。
    我是後來發現帳戶的餘額變少才知道的
  3. 等他佈署完,進入應用程式的頁面,點選在Web Chat中測試,輸入一些文字。
    因為剛剛選的是Echo範本,所以你打什麼他就會回什麼。
  4. 到頻道加入Direct Line
  5. 這邊的秘密金鑰等等會在程式中用到。
    按下完成按鈕。
    到這邊Azure的部分算是完成了。
  6. 在Visual studio 新建一個主控台應用程式。
    這邊要注意架構的部分,因為我現在選的是4.5.2
    等等在寫程式的時候,認證的部分要特別注意。
  7. 加入Nuget套件,在專案上按滑鼠右鍵,選擇管理Nuget套件,安裝Microsoft.Bot.Connector.DirectLine和WebSocketSharp-netstandard
  8. 程式碼部分
    using Microsoft.Bot.Connector.DirectLine;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks;
    using WebSocketSharp;
    
    namespace WowochatClient
    {
    
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Start Conversation");
                StartConversation().Wait();
                Console.WriteLine("End Conversation");
            }
            static string botId = "wowobot";
            static string directLineSecret = "9Y9OMRBerCs.E6d8ByADFUTKNUbU3oAA9qolowWVowooOrlpiWglH7c";
            public static async Task StartConversation()
            {
                ServicePointManager.SecurityProtocol =
           SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls |
           SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
                var tokenResponse = await new DirectLineClient(directLineSecret).Tokens.GenerateTokenForNewConversationAsync();
                var directLineClient = new DirectLineClient(tokenResponse.Token);
                var conversation = await directLineClient.Conversations.StartConversationAsync();
    
                var webSocketClient = new WebSocket(conversation.StreamUrl);
                webSocketClient.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;
                webSocketClient.OnMessage += WebSocketClient_OnMessage;
                webSocketClient.Connect();
                while (true)
                {
                    string input = Console.ReadLine().Trim();
                    if (input.ToLower() == "exit")
                    {
                        break;
                    }
                    else
                    {
                        if (input.Length > 0)
                        {
                            Activity userMessage = new Activity
                            {
                                From = new ChannelAccount("Test"),
                                Text = input,
                                Type = ActivityTypes.Message
                            };
    
                            await directLineClient.Conversations.PostActivityAsync(conversation.ConversationId, userMessage);
                        }
                    }
                }
            }
            private static void WebSocketClient_OnMessage(object sender, MessageEventArgs e)
            {
                if (string.IsNullOrEmpty(e.Data))
                {
                    return;
                }
                var activitySet = JsonConvert.DeserializeObject<ActivitySet>(e.Data);
                var activities = from x in activitySet.Activities
                                 where x.From.Id == botId
                                 select x;
    
                foreach (Activity activity in activities)
                {
                    Console.WriteLine(activity.Text);
                }
            }
    
        }
    }
    

    botid是我們的azure應用程式名稱 wowobot
    directLineSecret是步驟五中的金鑰
    最關鍵的地方是由於建立專案時選擇的架構4.5.2
    預設的Security Protocol 為 SSL3
    而Azure使用的是TLS1.2
    所以要加入程式碼設定

    ServicePointManager.SecurityProtocol =
                    SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls |
                    SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
    webSocketClient.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;

     

完成圖:

後記:

本篇範例只有回應最基礎的文字訊息,其他的還有卡片訊息、圖片、附件等等

本篇的關鍵就是要注意到.net framework是多少

然後設定Security Protocol,不然會導致沒辦法跟Azure上的應用程式作連結

本篇是用 direct line + websocket 

也可以單純用 direct line 作接收與發送

相關連結:

 

https://docs.microsoft.com/zh-tw/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-concepts?view=azure-bot-service-4.0 azure 說明文件

https://github.com/Microsoft/BotBuilder-Samples/tree/v3-sdk-samples/CSharp/core-DirectLine 官方範例

https://dotblogs.com.tw/h20/2019/01/14/162818 .netTLS設定

https://github.com/microsoft/botframework botframework

有任何改進的意見及問題歡迎傳送到電子郵件

電子郵件:momo16542@gmail.com