說到 Microsoft Bot Framework 其實微軟發布了已經有一段時間了,有很多朋友可能還不太了解,微軟Bot的功能今天我給大家簡單的介紹一下,Bot Framework的開發基礎以及如何使用Bot Framework和我們的一個現有的三方客服(例如一個微信的公共號)集成起來。
首先說到Bot大家的第一反應就是機器人,但是微軟的Bot不是指的傳統意義上的一個基於硬件的機器人,而是一個類似於在線客服的服務框架。這個框架很直接的價值在於
1.Channel的概念:例如我們同時需要智能機器人用在一個HTML頁面上以及Skype或者Email客服,如果你使用微軟 Bot Framework 框架開發這個智能客服,那麼開發者可用享用Bot Framework Channel帶來的便捷,開發者只需要一次開發客服問題的邏輯然後在 Bot Framework 的 portal 上進行簡單的Channel配置就可以將這個智能客服 enable 到各種平台或者將一段iframe的HTML的代碼嵌入網頁中就可以實現多客戶端的部署。當然也可以部署到微信公共號中,下圖就是目前微軟 Bot Framework所支持的所有的channel,當然除了這些已有的channel我們還可也連接到我們已有的應用中,這種做法我後面也會介紹。

2. Bot Framework 是一個上手非常簡單的框架,基於ASP.NET MVC 的基礎上,簡單的說就是開發一個簡單的Web服務。開發步驟也很簡單
2.1 首先要先下載一個Bot Framework的開發模板(for visualstudio)和 模擬器 下載鏈接 https://docs.botframework.com/en-us/downloads/
配置 https://docs.botframework.com/en-us/csharp/builder/sdkreference/gettingstarted.html

安裝模板很簡單就是將一個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 (用戶注冊過程我就略過了)

首先看到的是您可以給這個智能機器人上傳一個圖標,這個圖標用於和用戶對話或者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