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