如何將 Microsoft Bot Framework 連接至微信公共號

說到 Microsoft Bot Framework 其實微軟發佈了已經有一段時間了,有不少朋友可能還不太瞭解,微軟Bot的功能今天我給你們簡單的介紹一下,Bot Framework的開發基礎以及如何使用Bot Framework和咱們的一個現有的三方客服(例如一個微信的公共號)集成起來。html

首先說到Bot你們的第一反應就是機器人,可是微軟的Bot不是指的傳統意義上的一個基於硬件的機器人,而是一個相似於在線客服的服務框架。這個框架很直接的價值在於git

1.Channel的概念:例如咱們同時須要智能機器人用在一個HTML頁面上以及Skype或者Email客服,若是你使用微軟 Bot Framework 框架開發這個智能客服,那麼開發者可用享用Bot Framework Channel帶來的便捷,開發者只須要一次開發客服問題的邏輯而後在 Bot Framework 的 portal 上進行簡單的Channel配置就能夠將這個智能客服 enable 到各類平臺或者將一段iframe的HTML的代碼嵌入網頁中就能夠實現多客戶端的部署。固然也能夠部署到微信公共號中,下圖就是目前微軟 Bot Framework所支持的全部的channel,固然除了這些已有的channel咱們還可也鏈接到咱們已有的應用中,這種作法我後面也會介紹。github

 2. Bot Framework 是一個上手很是簡單的框架,基於ASP.NET MVC 的基礎上,簡單的說就是開發一個簡單的Web服務。開發步驟也很簡單web

2.1 首先要先下載一個Bot Framework的開發模板(for visualstudio)和 模擬器 下載連接 https://docs.botframework.com/en-us/downloads/json

配置 https://docs.botframework.com/en-us/csharp/builder/sdkreference/gettingstarted.htmlapi

安裝模板很簡單就是將一個zip包copy到vs的模板目錄下就能夠在VS裏面建立Bot項目了服務器

隨後在 MessagesController 中能夠找到 Post方法這裏判斷一下 activity.Type 若是是 Message 類型就能夠經過Text屬性獲取到用戶輸入的信息,隨後通過您的程序對用戶輸入的內容的理解與分析(這裏也可使用微軟的LUIS服務進行語義理解)而後經過ConnectorClient的Conversations.ReplyToActivityAsync 方法進行回覆便可微信

        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                // calculate something for us to return
                int length = (activity.Text ?? string.Empty).Length;

                // return our reply to the user
                Activity reply = activity.CreateReply($"You sent {activity.Text} which was {length} characters");
                await connector.Conversations.ReplyToActivityAsync(reply);
            }
            else
            {
                HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);
            return response;
        }

隨後您能夠在您的IIS上或者,Windows Azure 上的 Web App架構

2.2 隨後咱們須要在微軟Bot Framework的portal 上註冊咱們的Bot 連接https://dev.botframework.com/bots/new (用戶註冊過程我就略過了)app

首先看到的是您能夠給這個智能機器人上傳一個圖標,這個圖標用於和用戶對話或者Skype中的頭像,名稱和描述都寫上很是描述性的內容便可後面還能夠修改,Bot handle 是服務的名稱設置後之後就不可修改了。後面的內容您本身照實填就行了。

endpoint 就是你的bot未來要部署的服務地址,也就是MS Bot Framework 要轉發消息的地址,如今最新的3.0版本中須要 Microsoft App ID, 須要您登錄MSA 生成一個APP ID就能夠了。完成其餘信息填寫後點擊註冊按鈕。

最後您須要重新配置Bot Framework 的這個website的web.config文件中的 MicrosoftAppId MicrosoftAppPassword,這兩個Key的value您均可以在Bot Portal 中找到

  <appSettings>
    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->
    <add key="BotId" value="YourBotId" />
    <add key="MicrosoftAppId" value="" />
    <add key="MicrosoftAppPassword" value="" />
  </appSettings>

隨後您能夠在Bot的設置頁面配置要打開的channel這裏我打算作一個HTML的聊天窗口和一個微信的公共號,因此我打開了一個Web chat是用來作HTML作聊天窗口的,Direct Line 用來對接微信公共號。 

經過點擊 Web Chat的 Edit(編輯)按鈕來編輯和獲取嵌入HTML中的代碼和Secret ID,注意 須要在HTML代碼中把YOUR_SECRET_HERE替換成真正的 Secret ID 這樣在打開您部署的網站就能夠看到您的Bot窗口,經過iframe的CSS就能夠控制窗口的大小和位置。

<iframe src='https://webchat.botframework.com/embed/BoBotTest?s=YOUR_SECRET_HERE'></iframe>

接着我給你們介紹一下日和微信集成的方法,介紹以前推薦你們先了解一下微信公共號的基礎知識,我這裏是直接使用的 http://www.weixinsdk.net/ 微信SDK的基礎上開發的。在接收到微信轉發的消息的時候直接經過 Direct Line 轉發到MS Bot上,固然若是您已經有本身的微信公共號/企業號的微信後臺服務器您也能夠基於現有服務進行消息轉發或者您的微信公共號後臺自己就是一個ASP.NET MVC架構的服務您也能夠直接集成這個Bot Framework

今天在這裏我就介紹一下基於現有微信後臺服務經過 Direct Line 轉發到MS Bot上的場景。

若是您已經瞭解過微信公共號後臺機制後確定會想到,其實邏輯很簡單就是在微信後臺收到消息之後轉發消息和接收MS Bot消息的一個過程。

微信處理消息的機制很是簡單以下,我這裏使用了一個MSBot的一個PostMessage方法來調用遠程Bot的消息 代碼以下:

  switch (message.Type)
                    {
                        case WeixinMessageType.Text://文字消息
                            {
                                var msgId = message.Body.MsgId.Value.ToString();
                                string userMessage = message.Body.Content.Value;
                                string BotMessage = await MSBot.PostMessage(userMessage);
                                result = ReplayPassiveMessageAPI.RepayText(openId, myUserName, BotMessage);
                            }
                            break;

那麼只要在您的項目中實現下面的這個MSBot的Class便可,這裏我把PostMessage的方法貼出來,具體項目請下載我在Github上的源碼體驗。

        public async static Task<string> PostMessage(string message)
        {
            HttpClient client;
            HttpResponseMessage response;

            bool IsReplyReceived = false;

            string ReceivedString = null;

            client = new HttpClient();
            client.BaseAddress = new Uri("https://directline.botframework.com/api/conversations/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", "aDyJxnUSx30.cwA.WOg.4DzXtwItzBC6jyUCxHXG8fLKcgdx2zZYf2BkkfW5Lpc");
            response = await client.GetAsync("/api/tokens/");
            if (response.IsSuccessStatusCode)
            {
                var conversation = new Conversation();
                response = await client.PostAsJsonAsync("/api/conversations/", conversation);
                //response = await client.PostAsync("/api/conversations/", null);
                if (response.IsSuccessStatusCode)
                {
                    Conversation ConversationInfo = response.Content.ReadAsAsync(typeof(Conversation)).Result as Conversation;
                    string conversationUrl = ConversationInfo.conversationId + "/messages/";
                    Message msg = new Message() { text = message };
                    response = await client.PostAsJsonAsync(conversationUrl, msg);
                    if (response.IsSuccessStatusCode)
                    {
                        response = await client.GetAsync(conversationUrl);
                        if (response.IsSuccessStatusCode)
                        {
                            MessageSet BotMessage = response.Content.ReadAsAsync(typeof(MessageSet)).Result as MessageSet;
                            ReceivedString = BotMessage.messages[1].text;
                            IsReplyReceived = true;
                        }
                    }
                }

            }
            return ReceivedString;
        }

這裏要注意的是須要設置AuthenticationHeaderValue這個屬性,這個屬性值是對應Direct Line Secret的Key值的。

隨後咱們就能夠實如今微信公共號上經過Direct Line 連接到 Microsoft Bot Framwork的場景了。

 

這樣就實現了使用一個MS Bot Framework 同時服務於微信公共號和HTML的Web服務,但願能夠幫助到你們,若是須要個人項目代碼請在Github上下載便可 連接:https://github.com/Nick287/WeiXinSDKforBotFrameworkDirectline

但願上的總結能夠幫助到你們, 同時歡迎你們在這裏和我溝通交流或者在新浪微博上 @王博_Nick

相關文章
相關標籤/搜索