Teams Meeting 实时事件通知

Microsoft Teams最近推出了很多新的功能和api,我们今天就来一起看一下 teams 会议的实时事件通知,我觉得有了这个功能,我们的app,我们的bot又可以有很多可以实现的场景了。

我们来看看如何在 c# 里处理会议开始和结束这两个事件。

protected override async Task OnTeamsMeetingStartAsync(MeetingStartEventDetails startDetails, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{...
}protected override async Task OnTeamsMeetingEndAsync(MeetingEndEventDetails endDetails, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{...
}

在我们的bot 处理class的地方,我们需要重载 OnTeamsMeetingStartAsync 和 OnTeamsMeetingEndAsync 就可以了。

这两个函数的第一个参数里含有了事件的具体信息。具体如下:

public partial class MeetingStartEventDetails : MeetingEventDetails
{public DateTime StartTime { get; set; }
}public partial class MeetingEndEventDetails : MeetingEventDetails
{public DateTime EndTime { get; set; }
}public partial class MeetingEventDetails : MeetingDetailsBase
{public string MeetingType { get; set; }
}public partial class MeetingDetailsBase
{public string Id { get; set; }public Uri JoinUrl { get; set; }public string Title { get; set; }
}

上面是我从 teams sdk 源代码里简化出来的代码。大家如果有兴趣,可以查看这里:https://github.com/microsoft/botbuilder-dotnet/tree/main/libraries/Microsoft.Bot.Schema/Teams

从上面的结构里可以看到开始会议的事件里会包含 start time, meeting id, meeting type,join url, title,等信息。类似的结束会议的事件里包含了 end time。

看到这里,可能一些经常看我文章的同学会问,如果不用微软官方的 teams sdk,自己来处理,是否可行,答案是肯定的。通过 ngrok,我们就可以发现 teams 调用我们 bot 的请求的 payload。对于一个开始会议的事件,我简化后的payload 如下:

{ "name": "application/vnd.microsoft.meetingStart", "type": "event", "timestamp": "2021-04-29T16:10:41.1252256Z", // ..."channelData": {"meeting": {"id": "<会议的id>"}// ...},"value": {"MeetingType": "Scheduled","Title": "<你的会议标题>","Id": "<会议的id>","JoinUrl": "<会议的 url>","StartTime": "2021-04-29T16:17:17.4388966Z"},"locale": "en-US"
}

特别需要注意的是最前面的那个 name,表明了整个payload是一个 meetingStart 的格式。同样,会议结束的 payload 如下:

{ "name": "application/vnd.microsoft.meetingEnd", "type": "event", "timestamp": "2021-04-29T16:10:41.1252256Z", // ..."channelData": {"meeting": {"id": "<会议的id>"}// ...},"value": {"MeetingType": "Scheduled","Title": "<你的会议标题>","Id": "<会议的id>","JoinUrl": "<会议的 url>","EndTime": "2021-04-29T16:17:17.4388966Z"},"locale": "en-US"
}

差别主要在与第一行的 name,和最后那个结构里的 EndTime。看到这里大家是否已经知道如何接受这两个事件了?

最后,我们代码完成后,我们还需要更新一下app的manifest.json。确保我们的app有足够的权限来处理。使用我们最喜欢的编辑器打开 manifest 文件,加入如下的配置。

"webApplicationInfo": {"id": "你的 bot id","resource": "https://RscPermission",
},
"authorization": {"permissions": {"resourceSpecific": [{"name": "OnlineMeeting.ReadBasic.Chat","type": "Application"}]    }
}

如果你当前的bot使用较老版本的manifest格式,可以用如下的manifest

"webApplicationInfo": {"id": "你的 bot id","resource": "https://RscPermission","applicationPermissions": ["OnlineMeeting.ReadBasic.Chat"]
}

可以看到最最关键的是我们的app需要有 OnlineMeeting.ReadBasic.Chat 这个权限。

代码和配置都准备好后,就可以开始调试运行了。

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

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

相关文章

error记录 | 不能将参数 1 从“const char [5]”转换为“LPCTSTR

Windows使用两种字符集ANSI和UNICODE&#xff0c;前者就是通常使用的单字节方式&#xff0c;但这种方式处理象中文这样的双字节字符不方便&#xff0c;容易出现半个汉字的情况。而后者是双字节方式&#xff0c;方便处理双字节字符。Windows NT的所有与字符有关的函数都提供两…

JMM 学习笔记

并发编程的模型 并发编程需要解决的两个问题&#xff1a;线程之间如何同步&#xff0c;线程之间如何通信。 线程之间通信&#xff1a;共享内存&#xff0c;消息传递。 共享内存通过线程之间读-写程序的公共状态进行通信。消息传递要通过线程之间主动传递消息进行通信。 线程之间…

嵌套函数,匿名函数,高阶函数

目录 嵌套函数匿名函数高阶函数嵌套函数 就是在函数里再定义一个函数 # 1,函数内部可以在定义函数 # 2,函数要想执行&#xff0c;必须要先被调用 def name1():print(kk)def name2():print(vfx)name2() name1() 输出&#xff1a; kk vfx name2 现在他内部代码找输出&#xff0c;…

Teams Developer Portal介绍

在去年的 Build2021 大会上讲到的 Teams Developer Portal 已经上线一段时间了&#xff0c;我这几天玩了一下&#xff0c;发现比之前的 app studio 强大了很多&#xff0c;所以赶快写篇文章和大家分享。 Developer Portal 有两种访问的方式&#xff0c;一个是网页版&#xff0…

使用环境变量来配置 Teams App 的 manifest

上篇文章我们介绍了 Teams 的 Developer Portal&#xff0c;今天我想分享一个dev portal里一个比较实用的功能。这个功能在之前的 App Studio 里没有。这个功能叫 Environment variables。 当我们真实开发一个 teams app的时候&#xff0c;肯定有自己的开发环境&#xff0c;测…

[Unity优化]批处理03:静态批处理

[Unity优化]批处理03&#xff1a;静态批处理 原理&#xff1a; 运行时&#xff0c;把需要进行静态批处理的网格合并到一个新的网格中。虽然只进行一次合并操作&#xff0c;但是会占用更多的内存来存储合并后的网格&#xff0c;并且被静态批处理的物体无法移动旋转缩放 要使用静…

制造领域的人工智能技术

“AI将执行制造、质量控制、缩短设计时间、减少材料浪费、提高生产再利用率&#xff0c;执行预测性维护等等&#xff0c;尽管人工智能有望从根本上改变很多行业&#xff0c;但该技术非常适合制造业”Ng说。Andrew Ng是深度学习Google Brain项目的创始人兼斯坦福大学计算机科学兼…

如何获取一个会议的 transcripts

Teams 开发团队在过去半年里提供了很多的关于会议的 api&#xff0c;这让我们又有了很多的可以实现的功能和场景。今天我要介绍的是如何获取会议的 transcripts。 首先我们要知道的一个概念是&#xff1a;一个会议 meeting 可能有很多的 transcript&#xff0c;是一对多的关系…

JS获取IP地址

HTML代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script src"https://unpkg.com/vue/dist/vue.js"></script></head><body><div id"vm&quo…

1小时玩爆趣头条自媒体平台,增粉实战操作分享

做自媒体的人最关注的就是每天自己账号的后台数据&#xff0c;因为数据决定当天的收益。因此只要每天能达到几十万的数据&#xff0c;相信对于做自媒体的朋友来说&#xff0c;一个月下来&#xff0c;最少也有1万以上的收入。目前&#xff0c;自媒体平台能赚钱的平台有很多&…

营业额统计

传送门 这个题...裸题啊,裸的不能再裸了 按天数插入,每次插入之后,比较和前驱后继的差,取 min 统计入答案即可 注意之前已经插入过的值就不需要插入了.然后这题就 A 了 Code: #include <iostream> #include <cstdlib> #include <cstdio> #include <ctime&…

React setStats数组不更新,百思不得其解。

楼楼今日遇到个坑爹的问题。 就是 this.setStats({}) 对 this.stats 不更新问题 问题是这样的 constructor(props) {super(props);this.state {imageList: []}WechatService.getMaterialOrealList("image").then((result) > {this.setState({imageList: result})…

隧道6in4 和隧道6to4(GNS3)

隧道6in4实验配置 拓扑图 Device Interface IP Address&#xff08;IPv6&#xff09; R1 F 0/0 10.1.81.1 F 0/1 2001:db8:cafe:81::10 R2 F 0/0 10.81.1.2 F 0/1 172.81.1.2 R3 F 0/0 172.81.1.3 F 0/1 2001:DB8:ACE:81::20 R4 F 0/0 2001:db8:cafe:81::4…

hadoop常用命令总结

2019独角兽企业重金招聘Python工程师标准>>> 一、前述 分享一篇hadoop的常用命令的总结&#xff0c;将常用的Hadoop命令总结如下。 二、具体 1、启动hadoop所有进程 start-all.sh等价于start-dfs.sh start-yarn.sh 但是一般不推荐使用start-all.sh(因为开源框架中内…

C面向对象编程

C语言面向对象编程 1. 定义一个SuperObject结构体, 里面包含最少的元素, 但是确实每一个对象都含有的, 这样可以实现多态2. 每一个对象都是基于类的, 我们知道类都是单例对象, 所以我们创建结构体, TypeObject(类似于Java中的class), 接着每一个Object结构体中 都包含着一个对应…

几道web题简单总结

拖了好长时间&#xff0c;总结一下这一段时间做的几道值得记录一下的题目&#xff0c;有的没做出来&#xff0c;但是学习到了新的东西 1.homebrew event loop ddctf的一道题目&#xff0c;学到了python eval函数的用法&#xff0c;首先分析题目&#xff1a; # -*- encoding: ut…

js进阶 9-5 js如何确认form的提交和重置按钮

js进阶 9-5 js如何确认form的提交和重置按钮 一、总结 一句话总结&#xff1a; 1、这个并不好做&#xff1a;onsubmit 里面的代码必须返回false才能取消onsubmit方法的执行&#xff0c;所以&#xff0c;有return。注意&#xff1a;一般的调用肯定是没有return的。onsubmit"…

.NET中RabbitMQ的使用

.NET中RabbitMQ的使用 概述 MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法。RabbitMQ是一个在AMQP基础上完整的&#xff0c;可复用的企业消息系统。他遵循Mozilla Public License开源协议。AMQP(高级消息队列协议) 是一个异步…

SQL Server死锁诊断--同一行数据在不同索引操作下引起的死锁

死锁概述 对于数据库中出现的死锁&#xff0c;通俗地解释就是&#xff1a;不同Session&#xff08;会话&#xff09;持有一部分资源&#xff0c;并且同时相互排他性地申请对方持有的资源&#xff0c;然后双方都得不到自己想要的资源&#xff0c;从而造成的一种僵持的现象。当然…

python下载安装搭建

python官网下载python运行环境&#xff08;https://www.python.org/downloads/&#xff09;&#xff0c;建议下载稳定版本&#xff0c;不推荐使用最新版本 安装 然后我们打开CMD&#xff0c;在里面输入python&#xff0c;就可以直接进入进行编码了 如果输入python出现下面错误 …