如何獲取一個會議的 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.pswp.cn/news/277829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277829.shtml
英文地址,請注明出處:http://en.pswp.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"…