如何将 Microsoft Bot Framework 链接至微信公共号

微软中国MSDN / 2017年11月09日 10:16

互联网+

说到 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 到 Visual Studio 的模板目录下就可以在VS 里面创建 Bot 项目了

随后在 Messages Controller 中可以找到 Post 方法这里判断一下 activity.Type 如果是 Message 类型就可以通过 Text 属性获取到用户输入的信息,随后经过您的程序对用户输入的内容的理解与分析(这里也可以使用微软的LUIS服务进行语义理解)然后通过 Connector Client 的Conversations.ReplyToActivityAsync 方法进行回复即可

publicasyncTask<HttpResponseMessage>Post([FromBody]Activity activity) { if(activity.Type ==ActivityTypes.Message) { ConnectorClient connector = newConnectorClient(newUri(activity.ServiceUrl)); // calculate something for us to returnintlength = (activity.Text ?? string.Empty).Length; // return our reply to the userActivity reply = activity.CreateReply($"You sent {activity.Text} which was {length} characters"); awaitconnector.Conversations.ReplyToActivityAsync(reply); } else{ HandleSystemMessage(activity); } varresponse =Request.CreateResponse(HttpStatusCode.OK); returnresponse; }

随后您可以在您的 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 文件中的 Microsoft AppId 和 Microsoft App Password,这两个 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 消息的一个过程。

微信处理消息的机制非常简单如下,我这里使用了一个 MS Bot 的一个 Post Message 方法来调用远程 Bot 的消息 代码如下:

<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>

那么只要在您的项目中实现下面的这个 MS Bot 的 Class 即可,这里我把 Post Message 的方法贴出来,具体项目请下载我在 Github 上的源码体验。

publicasyncstaticTask< string> PostMessage( stringmessage) { HttpClient client; HttpResponseMessage response; boolIsReplyReceived = false; stringReceivedString = null; client = newHttpClient(); client.BaseAddress = newUri( "https://directline.botframework.com/api/conversations/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(newMediaTypeWithQualityHeaderValue( "application/json")); client.DefaultRequestHeaders.Authorization = newAuthenticationHeaderValue( "BotConnector", "aDyJxnUSx30.cwA.WOg.4DzXtwItzBC6jyUCxHXG8fLKcgdx2zZYf2BkkfW5Lpc"); response = awaitclient.GetAsync( "/api/tokens/"); if(response.IsSuccessStatusCode) { varconversation = newConversation(); response = awaitclient.PostAsJsonAsync( "/api/conversations/", conversation); //response = await client.PostAsync("/api/conversations/", null);if(response.IsSuccessStatusCode) { Conversation ConversationInfo = response.Content.ReadAsAsync( typeof(Conversation)).Result asConversation; stringconversationUrl = ConversationInfo.conversationId + "/messages/"; Message msg = newMessage() { text = message }; response = awaitclient.PostAsJsonAsync(conversationUrl, msg); if(response.IsSuccessStatusCode) { response = awaitclient.GetAsync(conversationUrl); if(response.IsSuccessStatusCode) { MessageSet BotMessage = response.Content.ReadAsAsync( typeof(MessageSet)).Result asMessageSet; ReceivedString = BotMessage.messages[ 1].text; IsReplyReceived = true; } } } } returnReceivedString; }

这里要注意的是需要设置 AuthenticationHeaderValue 这个属性,这个属性值是对应 Direct Line Secret 的 Key 值的。

随后我们就可以实现在微信公共号上通过 Direct Line 链接到 Microsoft Bot Framwork 的场景了。

这样就实现了使用一个 MS Bot Framework 同时服务于微信公共号和 HTML 的Web 服务,希望可以帮助到大家,如果需要我的项目代码请点击“阅读原文”可以在 Github 上下载。

希望上的总结可以帮助到大家, 同时欢迎大家在这里和我沟通交流或者在新浪微博上 @王博_Nick返回搜狐,查看更多

责任编辑:

1.环球科技网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.环球科技网的原创文章,请转载时务必注明文章作者和"来源:环球科技网",不尊重原创的行为环球科技网或将追究责任;3.作者投稿可能会经环球科技网编辑修改或补充。