Teams Bot开发系列:初识Bot

上次我们讲了Teams Bot开发的概述,讲了Azure Bot Service,Bot Framework SDK和我们自己的bot服务的概念,这篇文章就带大家看看Azure Bot Service和我们的bot是如何发生关系的。

我们自己开发的bot服务实际上就是一个api service,需要提供一个支持 POST 请求的endpoint。然后把这个endpoint的url注册到Azure Bot Service,这样当有人和你的bot进行聊天的时候,这个endpoint就会被Azure Bot Service所调用。

我们来看一个简单例子:用户在模拟器里对bot发送一个”hi”消息,然后bot回复一个”You said: hi”消息。整个流程如下:

 

  1. 当用户准备开始和bot进行聊天的时候,azure bot service就会向我们的bot endpoint上 POST 一个关于 conversationUpdate 的HTTP请求,告诉我们的bot,有一个用户准备要和bot聊天了。下面是Bot Emulator,相当于Azure Bot Service传递给我们bot endpoint的http request body
{"channelId": "emulator","conversation": {"id": "5d2a6fa0-a8c4-11ea-9482-fbaa8563d339|livechat"},"from": {"id": "f2dc881f-5c55-4f44-a50a-0ecdb4717950","name": "User","role": "user"},"id": "5d354510-a8c4-11ea-9482-fbaa8563d339","localTimestamp": "2020-06-07T23:39:51+10:00","locale": "en-US","membersAdded": [{"id": "5d2a4890-a8c4-11ea-9762-2d13acd3a3d5","name": "Bot"},{"id": "f2dc881f-5c55-4f44-a50a-0ecdb4717950","name": "User"}],"membersRemoved": [],"recipient": {"id": "5d2a4890-a8c4-11ea-9762-2d13acd3a3d5","name": "Bot","role": "bot"},"serviceUrl": "https://762eb0b511e7.ngrok.io","timestamp": "2020-06-07T13:39:51.905Z","type": "conversationUpdate"
}

可以看到channelId说明是用模拟器聊天平台发出来的信息,from用户,typeconversationUpdate,具体内容是有两个新增加的成员(membersAdded),分别是UserBot。大家需要注意一个conversation id,这个id是针对这次对话的,这次对话里可以你一句,我一句,每一句的id不同,但是他们的conversation id是一样的。

  1. 当用户发送一个 “hi” 文字内容给bot,这时候我们的bot endpoint会收到另一个POST 请求,内容如下:
{"channelData": {"clientActivityID": "1591537203426cjob1jjckwm","clientTimestamp": "2020-06-07T13:40:03.426Z"},"channelId": "emulator","conversation": {"id": "5d2a6fa0-a8c4-11ea-9482-fbaa8563d339|livechat"},"entities": [{"requiresBotState": true,"supportsListening": true,"supportsTts": true,"type": "ClientCapabilities"}],"from": {"id": "f2dc881f-5c55-4f44-a50a-0ecdb4717950","name": "User","role": "user"},"id": "6414c2c0-a8c4-11ea-9482-fbaa8563d339","localTimestamp": "2020-06-07T23:40:03+10:00","locale": "en-US","recipient": {"id": "5d2a4890-a8c4-11ea-9762-2d13acd3a3d5","name": "Bot","role": "bot"},"serviceUrl": "https://762eb0b511e7.ngrok.io","text": "hi","textFormat": "plain","timestamp": "2020-06-07T13:40:03.436Z","type": "message"
}

可以看到这此的typemessage,说明是一条消息,消息文字格式是纯文本plain,文字内容texthi

对照我们上面的conversation id,是不是发现这条的conversation id是一样的,说明这条消息和上一条是在同一个对话里进行的。

这里有一个serviceUrl,这个是我们Azure bot service模拟器的url,如果你的bot要回复用户一条消息,那这个消息就是发送到这个url上。

  1. 我们的bot收到上面这条用户发来的消息后,回复用户一条”You said: hi”的文字消息,bot就组建一个http request,POST 到上面这个service Url上,请求的body也是json格式,内容如下:
{"attachments": [],"channelId": "emulator","conversation": {"id": "5d2a6fa0-a8c4-11ea-9482-fbaa8563d339|livechat"},"entities": [],"from": {"id": "5d2a4890-a8c4-11ea-9762-2d13acd3a3d5","name": "Bot","role": "bot"},"id": "6504a100-a8c4-11ea-9482-fbaa8563d339","inputHint": "acceptingInput","localTimestamp": "2020-06-07T23:40:05+10:00","locale": "en-US","recipient": {"id": "f2dc881f-5c55-4f44-a50a-0ecdb4717950","role": "user"},"replyToId": "6414c2c0-a8c4-11ea-9482-fbaa8563d339","serviceUrl": "https://762eb0b511e7.ngrok.io","speak": "You said: hi","text": "You said: hi","timestamp": "2020-06-07T13:40:05.008Z","type": "message"
}

可以看到conversation id没有变化,需要注意的是replyToId,它表示bot回复的”You said: hi”,是针对用户前面发的那条”hi”消息的回复。所以这个replyToId的值就是前面那个消息的id

大家看了这个流程了对应的json,是不是对bot的运作有一个具体的感觉了? :D

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[环境搭建]SDN网络感知服务与最短路径应用

1.安装python模块networkxpip install networkx2.给Network_Awareness.py加修改权限chmod 777 Network_Awareness.py3.下载安装ryugit clone git://github.com/osrg/ryu.gitcd ryu sudo python ./setup.py install#若已安装ryu,删了再装, pip uninstall ryu4.修改“…

ubuntu16.04下安装opencv出现libgtk2.0-dev配置失败问题解决方法

第一次在ubuntu下安装opencv,遇到很多问题,特别是libgtk2.0-dev总是配置失败的问题,在网上也看到一些解决方法,自己也遇到一些比较奇葩的问题,故整理于此。 网上大部分的解决方案就是更改下载源,我看到一些…

03|模型I/O:输入提示、调用模型、解析输出

03|模型I/O:输入提示、调用模型、解析输出 从这节课开始,我们将对 LangChain 中的六大核心组件一一进行详细的剖析。 模型,位于 LangChain 框架的最底层,它是基于语言模型构建的应用的核心元素,因为所谓 …

selenuim自动化爬取汽车在线谷米爱车网车辆GPS数据爬虫

#为了实时获取车辆信息,以及为了后面进行行使轨迹绘图,写了一个基于selelnium的爬虫爬取了车辆gps数据。 #在这里发现selenium可以很好的实现网页解析和处理js处理 #导包 import timefrom selenium import webdriverfrom selenium.webdriver.support.wai…

Teams Bot开发系列:Activity处理流程

上篇文章介绍了什么是Activity,Turn,TurnContext和BotAdapter,这篇文章我们看看这些东西是如何窜起来的,他们是如何处理用户发给bot的消息的。 我们以一个最简单的bot,echo bot为例子,所谓的echo bot就是用…

linux下搭建go环境--问题记录

记录自己在linux上搭建go环境的经历。(因为各种版本,linux系统问题挣扎了几天) 安装vmware-tools,把我要运行代码拷进来。这个网上方法很多,我的电脑抽风不能安装,后面重装的虚拟机确定Ubuntu版本、位数。很重要&#…

Teams Bot开发系列:Bot验证

我们今天来说一下authentication,authentication一直是一个复杂的问题。bot里的authentication也不简单。我们先来看一个概念:Bot Framework Token Service,根据官方定义,这个token service主要是: Facilitating the u…

堆排序

目录 一、定义二、算法分析三、代码地址一、定义 1.1 堆 ​ 此处的堆,指数据结构中的堆。而不是内存中的那种内存堆,内存堆是基于数据结构的一种实现。堆的数据结构是一棵完全二叉树,它有如下特点:(具体参考下文链接&a…

Teams Bot开发系列:Middleware

middleware是目前一些framework比较流行的概念,通常一个开发框架需要提供一些可扩展可定制化的功能。所以middleware这种pattern就很实用。 熟悉asp.net core的开发可能第一个想到的就是asp.net core的middleware,如下图: 当一个http reques…

ElasticSearch教程——自定义分词器(转学习使用)

一、分词器 Elasticsearch中,内置了很多分词器(analyzers),例如standard(标准分词器)、english(英文分词)和chinese(中文分词),默认是standard. s…

使用Azure Serverless来开发Teams App

Azure Function可以说比较早期的一个serverless服务,随着这些年云服务的大行其道,Serverless在概念越来越火,什么叫serverless? Serverless computing (or serverless for short), is an execution model where the cloud provide…

使用AzureFunction开发最简单的Teams Outgoing Webhook

上篇文章讲了teams app的serverless架构,这篇主要讲如何真正使用Azure Function来开发一个最最简单的Teams Outgoing Webhook。 我们先登入azure的portal,创建一个azure function。我这里创建了一个名字叫outgoing-webhook的azure function。完成后如下…

Ubuntu宿主机与VMware中其他系统虚拟机的互通

Ubuntu做宿主机,VMware中创建Windows10,并且通过三种模式实现两系统互通,其实并非是件难事。在有线网卡未接网线的环境下,关闭两系统防火墙,基本遵从下文便可实现。 转载:https://note.youdao.com/ynotesha…

使用Azure轻松实现Teams App的全球合规性

我在之前的一篇博客里面讲了合规性对于我们Teams app是非常重要的,因为office365平台就是面向全世界用户的,我们开发的teams app一旦发布后,立刻就会有各国各地区的用户来进行安装使用,所以符合用户所在地区的要求是非常重要的。 …

ADC知识(2)——直流参数(输入电压参考,参考电流输入,积分非线性误差,差分非线性误差)...

目录 四、 输入参考电压范围 五、 参考电流 六、 非线性问题 差分非线性误差 积分非线性 四、 输入参考电压范围 大多数数据手册中,将它定义为一个特定的参考电压值,通常这个电压作为 此转换器最常用的参考电压。在参考输入电压…

LuckyDraw app使用CosmosDB的成本分析

我在以前的博客里说过我的LuckyDraw app在数据存储方面使用的是 Azure Table Storage,当时选择这个的原因是成本考虑,因为它实在是便宜,对于我这种个人开发维护的免费的teams app来说,成本是一个很重要的考量点。 当然&#xff0…

React 重温之 组件生命周期

生命周期 任何事物都不会凭空产生,也不会无故消亡。一个事物从产生到消亡经理的各个阶段,我们称之为 生命周期。 具体到我们的前端组件上来,一个组件的生命周期可以大体分为创建、更新、销毁这个三个阶段。 本文主要介绍React 的组件生命周期…

10 个优质的 Laravel 扩展推荐

这里有 10 个用来搭建 Laravel 应用的包 为何会创建这个包的列表?因为我是一个「比较懒」的开发者,在脸书上是多个 Laravel 小组的成员。平日遇到最多的问题就是开发是需要用那些包。我很懒所以我不想每次都从头开始搞这些东东。 为何此文没有包括管理包…

Java:反射+泛型:获取类型参数的实例

2019独角兽企业重金招聘Python工程师标准>>> 场景描述&#xff1a; 我需要开发四个页面&#xff0c;每个页面都是只涉及增删改查的基本逻辑。 最简单的写法&#xff1a; 创建四个接口A,B,C,D&#xff0c;每个接口中都声明了增删改查四个方法,完全一致 public Map<…

servlet(1)

servlet类分级&#xff1a; 1.ServletConfig接口类&#xff1a;理解为读取servlet配置的类&#xff0c;里面有四个抽象方法如下&#xff1a; ①getServletName:获取servlet在web.xml中的名字 ②getServletContext&#xff1a;获取Servlet上下文&#xff0c;相当于web项目管理所…