Azure 聊天機器人 (web app bot) 佈署與互動
內含大量圖
前情提要:
最近試用了第三方廠商Telerik出的WPF控件
裡面有一個對話的UI,他給的範例裡面有如何跟Azure上的WEB bot 作互動
但是我試了整整一天,都無法成功。
首先,我大部分的開發內容都是本地的應用程式與資料庫
對網際網路這一塊不是那麼的熟,以至於有些簡單的問題,我卡住了很久
後來在不斷的嘗試後,終於成功。
因此寫這篇文章,希望能幫助到跟我一樣的人。
正文開始
- 先在Azure上辦一個帳號取得試用資格
- 新建資源
幫應用程式取個名字,定價層可以選F0免費的,機器人範本先用預設的Echo範本就好,然後按建立。
要注意的是,如果這邊使用的App service是用新建的預設是S1 Standard。
我是後來發現帳戶的餘額變少才知道的 - 等他佈署完,進入應用程式的頁面,點選在Web Chat中測試,輸入一些文字。
因為剛剛選的是Echo範本,所以你打什麼他就會回什麼。
- 到頻道加入Direct Line
- 這邊的秘密金鑰等等會在程式中用到。
按下完成按鈕。
到這邊Azure的部分算是完成了。 - 在Visual studio 新建一個主控台應用程式。
這邊要注意架構的部分,因為我現在選的是4.5.2
等等在寫程式的時候,認證的部分要特別注意。
- 加入Nuget套件,在專案上按滑鼠右鍵,選擇管理Nuget套件,安裝Microsoft.Bot.Connector.DirectLine和WebSocketSharp-netstandard
- 程式碼部分
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://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