如何获取一个会议的 transcripts

Teams 开发团队在过去半年里提供了很多的关于会议的 api,这让我们又有了很多的可以实现的功能和场景。今天我要介绍的是如何获取会议的 transcripts。

首先我们要知道的一个概念是:一个会议 meeting 可能有很多的 transcript,是一对多的关系,而不是一对一的关系。看到这里,对于熟悉 teams api 和 graph api 的读者可能已经在脑海里有了一个这样的api的:GET meetings/{meetingId}/transcripts,恭喜你,你已经对微软的 api 设计有了非常好的 sense。

我们来看一下官方的 api 定义:

  • 获取transcript列表
GET /me/onlineMeetings/{meetingId}/transcripts
GET /users/{userId}/onlineMeetings/{meetingId}/transcripts
  • 获取某一个具体的 transcript 的内容
GET me/onlineMeetings/{meetingId}/transcripts/{transcriptId}/content
GET users/{userId}/onlineMeetings/{meetingId}/transcripts/{transcriptId}/content

看到这里大家是不是已经开始准备撸起袖子开干了?不要急,这里面最困难的是如何获取 meetingId,说实话,我觉得微软已经提供一些更好的方法让我们获取 meeting id,但现实是到写这篇文章开始,还没有特别好的方法,官方提供的有两种方法:

方法一:订阅消息

可以订阅用户级别或者是整个租户级别的消息,通过这个 api:POST https://graph.microsoft.com/v1.0/subscriptions/

这里我不在展开讲,因为这个topic 很大,我会专门写一篇文章来完整的介绍如何订阅各种消息。

当我们接受到了推送过来的 event,就可以通过 event 来获取会议的 joinURL,然后在通过这个 api GET https://graph.microsoft.com/v1.0/users/{userId}/onlineMeetings?$filter=JoinWebUrl%20eq%20'{joinURL}'

这种方法实际上比较麻烦,我自己做的时候也废了较多时间,所以我建议大家使用方法二。

方法二:通过Bot Framework

我们的bot可以很方便的获取,会议开始和会议结束的消息,所以我们可以方便的使用如下的代码获取 meeting id

protected override async Task OnTeamsMeetingEndAsync(MeetingEndEventDetails meeting, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{var meetingInfo = await TeamsInfo.GetMeetingInfoAsync(turnContext);var meetingId = meetingInfo.Details.MsGraphResourceId;...
}

是不是很简单?大家可以会问为什么叫 MsGraphResourceId,我也不清楚,可能因为内部实现的原因,Teams sdk和api在快速发展,可能后面会用更加统一的容易理解的名字。

获取 transcript 内容

有了 meeting id,我们就已经完成了50%,使用如下的代码就可以获取所有的 transcripts。

var getTranscriptsRequest = new HttpRequestMessage(HttpMethod.Get, $"https://graph.microsoft.com/beta/users/{userId}/onlineMeetings/{meetingId}/transcripts");
getTranscriptsRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", access_Token);
var response = await httpClient.SendAsync(getTranscriptsRequest);
var content = await response.Content.ReadAsStringAsync();
var transcripts = (JObject.Parse(content)["value"]).ToObject<List<Transcripts>>();
foreach (var transcript in transcripts)
{var getTranscriptReqest = new HttpRequestMessage(HttpMethod.Get, $"https://graph.microsoft.com/beta/users/{userId}/onlineMeetings/{meetingId}/transcripts/{transcripts.FirstOrDefault().Id}/content?$format=text/vtt");getTranscriptReqest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", access_Token);var transcriptResponse = await client.SendAsync(getTranscriptReqest);var transcriptContent = await transcriptResponse.Content.ReadAsStringAsync();...
}

可以看到上面的代码里面,我们先调用了 users/{userId}/onlineMeetings/{meetingId}/transcripts 来获取针对某个会议的所有 transcripts,然后我们就枚举每一个 transcript,通过 api users/{userId}/onlineMeetings/{meetingId}/transcripts/{transcriptId}/content?$format=text/vtt 获取具体的内容,可以看到我们加了一个 query string format=text/vtt,这么做的好处是我觉得这个格式处理起来比较简单。大致的格式如下。

HTTP/1.1 200 OK
Content-type: text/vttWEBVTT0:0:0.0 --> 0:0:6.580
This is a test from Tony.0:0:12.1 --> 0:0:18.720
Hello Teams.

如果大家对于其他格式比较感兴趣,可以查看这个api的官方文档。 Get callTranscript - Microsoft Graph beta | Microsoft Docs

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

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

相关文章

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出现下面错误 …

35个Java 代码性能优化总结

前言代码优化&#xff0c;一个很重要的课题。可能有些人觉得没用&#xff0c;一些细小的地方有什么好修改的&#xff0c;改与不改对于代码的运行效率有什么影响呢&#xff1f;这个问题我是这么考虑的&#xff0c;就像大海里面的鲸鱼一样&#xff0c;它吃一条小虾米有用吗&#…

MySQL讲义

1 MySQL基础知识 瑞典MySQL AB公司开发&#xff0c;由SUN收购&#xff0c;而后SUN被甲骨文并购&#xff0c;目前属于Oracle公司。 MySQL是一种关联数据库管理系统 由于其体积小、速度快、总体拥有成本低、MySQL软件采用了双授权政策&#xff0c;分为社区版和企业版。 …

Teams Bot App Manifest 文件解析

这篇文章我们继续以 Hello World Bot 这个 sample 来讲一下 manifest template。 实际上在 Teams app 开发的时候&#xff0c;有 manifest 的概念&#xff0c;manifest 是用来说明这个 teams app 的一些基本信息和配置信息&#xff0c;比如 app 的名字&#xff0c;app有哪些能…

[Dart] Flutter开发中的几个常用函数

几个Flutter开发中的常用函数 /** 返回当前时间戳 */static int currentTimeMillis() {return new DateTime.now().millisecondsSinceEpoch;}/** 复制到剪粘板 */static copyToClipboard(final String text) {if (text null) return;Clipboard.setData(new ClipboardData(text…

Cordova入门系列(三)Cordova插件调用 转发 https://www.cnblogs.com/lishuxue/p/6018416.html...

Cordova入门系列&#xff08;三&#xff09;Cordova插件调用 版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处 上一章我们介绍了cordova android项目是如何运行的&#xff0c;这一章我们介绍cordova的核心内容&#xff0c;插件的调用。演示一个例子&#xf…

clojure with postgres

主要关注访问pg。不关心其他db 1 clojure.java.jdbc https://github.com/clojure/java.jdbchttp://clojure-doc.org/articles/ecosystem/java_jdbc/reusing_connections.html这个最广&#xff0c;需要配合不同DB[org.clojure/java.jdbc "0.7.9"] [org.postgresql/pos…

lua入门

https://en.blog.nic.cz/2015/08/12/embedding-luajit-in-30-minutes-or-so/

shell脚本传可选参数 getopts 和 getopt的方法

写了一个shell脚本&#xff0c;需要向shell脚本中传参数供脚本使用&#xff0c;达到的效果是传的参数可以是可选参数 下面是一个常规化的shell脚本&#xff1a; echo "执行的文件名为: $0";echo "第一个参数名为: $1";echo "第二个参数名为: $2"…