我们上一篇文章讲了如果使用 net6 和 c# 来快速开发一个最简单的 teams meeting app。为了让大家比较容易理解,上个sample非常简单,简单到没有什么功能,那我们现在就来慢慢扩展这个app的功能:看看如何获取 meeting 的上下文。

打开上个sample中的 MainPage.cshtml 文件,使用如下代码:

@page "/MainPage"<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Demo</title><link rel="stylesheet" href="/static/styles.css"><script src="https://statics.teams.cdn.office.net/sdk/v1.10.0/js/MicrosoftTeams.min.js"integrity="sha384-6oUzHUqESdbT3hNPDDZUa/OunUj5SoxuMXNek1Dwe6AmChzqc6EJhjVrJ93DY/Bv"crossorigin="anonymous"></script>
</head>
<body><h1>MainPage</h1><div id="meeting-context"></h1><script>microsoftTeams.initialize();microsoftTeams.getContext(function(context) {document.getElementById('meeting-context').innerText = JSON.stringify(context);});</script>
</body>
</html>

这段代码比较简单,首先加入了对 teams js sdk 的引用,版本为 1.10.0,然后调用了下面这个方法:

microsoftTeams.initialize();

这个是对sdk的初始化,由于我们这个页面是会嵌入到 teams 会议中的,所以 MainPage 页面需要和 Teams客户端本身建立一种联系。这个是一个必要步骤,如果不做这个,其他大多数函数都会失败。

然后我们就调用了 microsoftTeams.getContext(function(context) { ... });,这就是用来获取会议上下文的 api。在sdk里,这个方法的定义如下。https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8bd26b379caa1f82a24aa1bb768d92fe9f30950b/types/microsoftteams/index.d.ts

function getContext(callback: (context: Context) => void): void;interface Context {groupId?: string | undefined;teamId?: string | undefined;teamName?: string | undefined;channelId?: string | undefined;channelName?: string | undefined;channelType?: ChannelType | undefined;entityId: string;subEntityId?: string | undefined;locale: string;osLocaleInfo?: LocaleInfo | undefined;upn?: string | undefined;tid?: string | undefined;theme?: string | undefined;isFullScreen?: boolean | undefined;teamType?: TeamType | undefined;teamSiteUrl?: string | undefined;teamSiteDomain?: string | undefined;teamSitePath?: string | undefined;hostTeamTenantId?: string | undefined;hostTeamGroupId?: string | undefined;channelRelativeUrl?: string | undefined;sessionId?: string | undefined;userTeamRole?: UserTeamRole | undefined;chatId?: string | undefined;loginHint?: string | undefined;userPrincipalName?: string | undefined;userObjectId?: string | undefined;isTeamArchived?: boolean | undefined;hostClientType?: HostClientType | undefined;frameContext?: FrameContexts | undefined;sharepoint?: any;tenantSKU?: string | undefined;userLicenseType?: string | undefined;parentMessageId?: string | undefined;ringId?: string | undefined;appSessionId?: string | undefined;isCallingAllowed?: boolean | undefined;isPSTNCallingAllowed?: boolean | undefined;meetingId?: string | undefined;defaultOneNoteSectionId?: string | undefined;isMultiWindow?: boolean | undefined;appIconPosition?: number | undefined;sourceOrigin?: string | undefined;userClickTime?: number | undefined;teamTemplateId?: string | undefined;userFileOpenPreference?: FileOpenPreference | undefined;
}

可以看到 Context 是一个有非常多属性的结构,我们不展开,我们先来看一下安装后我们得到的 context是什么,在我们上面的代码里,我们把拿到的 context 序列化成 json,然后打印在页面上。

我们安装 app 到一个会议中,然后就可以看到页面上显示了 context 的json数据。

我们来看一下这个json里含了什么有用的信息:

{"locale": "en-us","theme": "default","entityId": null,"subEntityId": "","isFullScreen": false,"sessionId": "91291367-f8f0-9a5e-d420-490d4eb8bc8d","chatId": "19:meeting_ODA1MjIzYzAtODNhYy00MjE0LWFmZmQtN2MxMTQ0ODdlMWQ2@thread.v2","meetingId": "MCMxOTptZWV0aW5nX09EQTFNakl6WXpBdE9ETmhZeTAwTWpFMExXRm1abVF0TjJNeE1UUTBPRGRsTVdRMkB0aHJlYWQudjIjMA==","parentMessageId": "","hostClientType": "desktop","tenantSKU": "enterprise","jsonTabUrl": "microsoft-teams-json-tab.azurewebsites.net","userLicenseType": "Unknown","appSessionId": "1be21c3a-e846-4bf8-90e3-dc3b01938d39","appLaunchId": "d30e788c-d424-40f5-9373-236345d64249","isMultiWindow": false,"appIconPosition": 23,"userClickTime": 1640572621827,"sourceOrigin": null,"userFileOpenPreference": "inline","osLocaleInfo": {"platform": "windows","regionalFormat": "en-us","longDate": "dddd, MMMM d, yyyy","shortDate": "M/d/yyyy","longTime": "h:mm:ss tt","shortTime": "h:mm tt"},"frameContext": "content","teamSiteDomain": "aabbcc365.sharepoint.com","teamSitePath": "","teamSiteUrl": "","ringId": "general","tid": "53213f63-c1e6-4416-bdab-da54fcb7b4b7","loginHint": "admin@aabbcc365.onmicrosoft.com","upn": "admin@aabbcc365.onmicrosoft.com","userPrincipalName": "admin@aabbcc365.onmicrosoft.com","userObjectId": "488e5982-c57c-4373-a4dd-67eab506d98d"
}

有这么一些信息我觉得比较有用:

  • locale 当前 Teams 客户端的语言
  • theme 当前 Teams 客户端的主题,比如是不是暗色主题,或者是高对比度主题
  • meetingId 当前会议的唯一id
  • hostClientType 当前 Teams 客户端的类型
    enum HostClientType {desktop = "desktop",web = "web",android = "android",ios = "ios",rigel = "rigel",surfaceHub = "surfaceHub"
    }
    
  • osLocaleInfo 当前 Teams 客户端的文化信息,比如日期格式之类的
  • tid 当前租户的id
  • userPrincipalName 用户名
  • userObjectId 当前用户的 Azure AD里的Object ID

我们有了这些信息后(特别是meeting id),后面很多 api 就比较容易调用了,我们将在后面的文章里再具体展开。

如何获取 Teams Meeting 的上下文信息相关推荐

  1. 如何获取Teams Meeting 详情

    最近有一些朋友问我,有没有可能获取到会议的详情,我搜索了目前所有的 teams 文档,发现有一个api可以获取,不过在我写这篇文章的时候,这个 api 还在 preview 阶段,可能在正式发布前,还 ...

  2. 线程池如何传递线程上下文信息

     戳蓝字「TopCoder」关注我们哦! 业务开发中,一般都会使用ThreadLocal保存一些上下文信息,但是在线程池中执行对应逻辑时,由于是不同线程所以无法获取之前线程的上下文信息. 线程池的线程 ...

  3. Microsoft Teams Meeting你是认真的吗?

    近期我都跟Teams视频会议干上了~使用Teams桌面客户端去开视频会议体验和效果不能称之为优秀,其实对于一个热衷微软技术的人来讲总感觉心里不舒服.从我之前的文章可以看得出来我其实是个非常较真的人,现 ...

  4. Python之向日志输出中添加上下文信息

    除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如:远程客户端的IP地址和用户名.这里我们 ...

  5. 用WMI获取远程机器操作系统的详细信息

    使用WMI获取远程机器操作系统的详细信息 大杂烩-.NET 代码主题部分的OperatingSystem类,是使用工具(Management (WMI) Extensions for Visual S ...

  6. python logging详解及自动添加上下文信息

    之前写过一篇文章日志的艺术(The art of logging),提到了输出日志的时候记录上下文信息的重要性,我认为上下文信息包括: when:log事件发生的时间 where:log事件发生在哪个 ...

  7. 如何使上下文信息更有用? 关于上下文感知的神经对话模型的实证研究

    论文标题:How to Make Context More Useful?An Empirical Study on Context-Aware Neural Conversational Model ...

  8. springboot获取登录用户的个人信息

    在Spring Boot中,获取登录用户的个人信息通常需要使用Spring Security框架来进行身份认证和授权.Spring Security提供了一个名为SecurityContextHold ...

  9. 获取access中表的相关信息

    就用到两条.net自带的获取数据库信息的语句 OleDbConnection con = new OleDbConnection(connection); // OleDB数据库连接实例 // 获取数 ...

最新文章

  1. 2019年的面试经验:Java程序员越来越悲催了!
  2. matlab偏导符号怎么打,matlab 如何输入导数
  3. tomcat cpu占用过高,系统负载高问题跟踪
  4. Android vector标签 PathData 画图超详解
  5. java 构造方法
  6. 系统诊断概述-如何通过windbg来dump特定process的memory.
  7. WCF发布到IIS7问题的解决方案
  8. java servlet文件下载_Java之Servlet文件下载20190228
  9. 如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!
  10. JS 限制input框的输入字数,并提示可输入字数
  11. ros加载编译opencv-3.4.9,编译安装opencv-3.4.9
  12. python画圆形螺旋线_中秋节到了,送你一个Python做的Crossin牌“月饼”
  13. 「轻阅读」基于 Flink SQL CDC的实时数据同步方案,附视频教程
  14. 仿小米商城html网页源码
  15. 简单的魔方复原方法, 魔方还原公式,图解
  16. 03.C 语言实现3.5寸虚拟软盘
  17. 【问题】 form action=${pageContext.request.contextPath}/login.action
  18. android没有adm_Android--Android Studio 打开ADM报错
  19. curl常用参数详解及示例
  20. 安全工具-curl学习

热门文章

  1. 常见的BIOS硬盘故障现象及急救措施
  2. 程序人生:什么是“对用户友好”
  3. 这几款前端必备构建工具合辑,我们帮你整理好了!
  4. linux kafka离线安装,centos 离线安装confluent_kafka 模块
  5. JAVA输出x和y和z_JAVA实例:输入三个整数x,y,z,请把这三个数由小到大输出-吾爱编程网...
  6. 诸暨机器人餐厅价格_现场 | 一家尝出“锅气”的餐厅 探店机器人餐厅
  7. 全新的 Vue3 状态管理工具:Pinia
  8. 从零开始学Node.js(八_删查)
  9. JavaScript递归应用与实践
  10. 10.31T2 点双联通分量+预处理前缀+二分答案