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

说到 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服务,希望可以帮助到大家,如果需要我的项目代码请点击“阅读原文”

,到博客文章进入下载。

大家有兴趣更深入的交流,可以在新浪微博上联系 @王博_Nick


原文链接:http://www.cnblogs.com/sonic1abc/p/5941442.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值