概述
本文将指引您通过 VCaaS Open API 快速地加入到 VCaaS 的会议中。简单来说,若您只是想快速地发起一个会议,不需要在会议中进行文档演示。那么,您只需要完成以下两个步骤:
- 创建一个会议
- 加入一个会议
若您需要在会议中进行文档演示,则需要您在加入一个会议前,完成关联会议与文档的步骤。操作流程变为以下三个步骤:
- 创建一个会议
- 关联会议与文档
- 加入一个会议
下文的详细步骤内容,将详细的说明在每一个步骤中需要执行的操作。同时,会介绍在会议结束后,如何查询会议的数据及如何管理机构的文档。
详细步骤
创建一个会议
创建一个会议,需要使用到创建会议接口 /v2/meeting-center/meetings。创建会议成功后,将得到会议ID meetingId 和会议地址 meetingUrl,在加入一个会议的步骤中,我们将会使用会议ID meetingId 和会议地址 meetingUrl 拼接成最终的会议链接。 接下来我们将对创建会议接口的请求参数及响应做简要说明。更多创建会议接口的细节请查看 VCaaS API 参考中的内容。
关键参数说明
startTime & endTime: 时间用unixtime格式,精确到秒,开始时间不得小于当前时间,结束时间不得小于开始时间。
timerStartTime & timerEndTime: 这些参数用于控制在教室中向教师展示计时器的开始和结束时间。时间以Unix时间格式表示,精确到秒。timerStartTime不能早于startTime,而timerEndTime不能早于timerEndTime或晚于endTime。
timerCountdown: 这个参数是倒计时的开始时间。该参数用于控制在timerEndTime之前多长时间开始显示倒计时。
callbackUrl: 若您创建会议时提供此参数链接,我们将在会议进行1分钟、5分钟、10分钟、结束时主动推送考勤数据到您的链接中。
redirectUrl: 若您提供此参数链接,在会议结束后,将自动跳转至此链接指向的页面。若您不提供此链接,将跳转至我们设定的默认页面。
realTimeCallbackUrl: 若您为此对象中的参数提供链接,我们将自动将实时会话数据(如用户加入/离开以及会话开始/结束)推送到回调URL。
config: 此对象的各个参数代表您在会议中是否要支持如聊天、录像、白板、poll、quiz等功能,设置为True,表示支持此功能,设置为false,表示不支持此功能。当不支持此功能时,在会议中表现为隐藏入口按钮或按钮被禁用。
docIds: 此对象表示课堂中上传的文档(课件),需要您先上传文件并获得文档id。当然您也可以先创建会议,后面再通过其他接口上传文档至此会议。
quizIds: 此对象表示课堂中预设的 Quiz,需要您先创建 Quiz 并获得 Quiz id。当然您也可以先创建会议,后面再通过其他接口预设 Quiz 至此会议。
创建会议接口请求参数示例
{
"meetingExternalId": "500000",
"meetingTitle": "Tech meeting",
"startTime": 1673062042,
"endTime": 1673753242,
"timerCountdown": 5,
"callbackUrl": "<https://www.hilink.co/>",
"redirectUrl": "<https://www.hilink.co/>",
"config": {
},
"docIds": [
],
"quizIds": [
]
}
创建会议接口请求响应示例
{
"meetingExternalId": "500000",
"meetingTitle": "Tech meeting",
"meetingId": "109391932341489664",
"meetingUrl": "<https://dev.vcaas.hilinkdemo.com/meeting>",
"startTime": 1673062042,
"endTime": 1673755042,
"timerStartTime": 1673062042,
"timerEndTime": 1673755042,
"meetingStatus": "CREATED"
}
关联会议与文档
如果您想要在会议中进行文档演示操作,就需要您在加入一个会议前,先将文件上传并完成会议与文件的关联。具体操作包含以下三个步骤:
获得文件的上传地址
获取文件的上传地址,需要使用创建文档上传URL接口 /v1/document-center/upload-urls。请求创建文档上传URL接口成功后,将得到文件ID docId 和文件上传地址 url。更多创建文档上传URL接口的细节请查看 VCaaS API 参考中的内容。以下为接口响应示例:
{
"docId": "96397990553587712",
"url": "https://dev.file.vcaas.hilinkdemo.com/91232529172008960%2Ftest.doc?Expires=1672991509&Signature=OE-hM31AmLFnquWi8BVvtiim0aP~4c~e2EewkA6h5GT0sYw0ejYQUD9fYmz5ScI00tkL8mCaTnbnkHoWGaLZqSt24h-SYotmkbeFAaLVJTS8MdTZkPvkgThYd39AsJiE2KReLA35cdwjyx5mzyQCnuiCHue-uV6~mJ3MAJcFIA75j39s~u0qCDEjBM2Ez-MqtUKYu-xSSWvb3Hwu8Ztg8srV40zoM3hPtC2KjQ7lgCYUK1xTPJa97xS6U4i5FZsiGu~HvSotdZ-ETeTLu6ebbY~Gu6qFef1ajBUqc8jACkI~UBhoE4Az8drc5NzmsyYUTAt4I958DFrmc671TbNM-Q__&Key-Pair-Id=K21VT8DFTV93QE"
}
将文档上传至服务器
通过步骤获得文件的上传地址获得文件的上传地址后,我们可以使用网络请求客户端或者通过编码的方式将文档上传至服务器。接下来我们将分别介绍以下两种方式:
使用网络请求客户端测试文档上传
- 可以使用 Postman 等网络请求客户端测试文档上传
- 在请求地址栏中,填写步骤二获取到的URL
- 请求方法必须指定为 PUT
- 待上传文件通过设置请求体(Body)选择参数类型为 binary
- CURL 上传文档示例
curl --location --request PUT 'https://dev.file.vcaas.hilinkdemo.com/91232529172008960%2Ftest.doc?Expires=1672991509&Signature=OE-hM31AmLFnquWi8BVvtiim0aP~4c~e2EewkA6h5GT0sYw0ejYQUD9fYmz5ScI00tkL8mCaTnbnkHoWGaLZqSt24h-SYotmkbeFAaLVJTS8MdTZkPvkgThYd39AsJiE2KReLA35cdwjyx5mzyQCnuiCHue-uV6~mJ3MAJcFIA75j39s~u0qCDEjBM2Ez-MqtUKYu-xSSWvb3Hwu8Ztg8srV40zoM3hPtC2KjQ7lgCYUK1xTPJa97xS6U4i5FZsiGu~HvSotdZ-ETeTLu6ebbY~Gu6qFef1ajBUqc8jACkI~UBhoE4Az8drc5NzmsyYUTAt4I958DFrmc671TbNM-Q__&Key-Pair-Id=K21VT8DFTV93QE' \
--header 'Content-Type: application/octet-stream' \
--data-binary '@/path/to/test.doc'
上传文档的代码调用示例
package org.example.s3;
import java.io.*;
import java.net.*;
/**
* 上传文档的代码调用示例
*/
public class UploadDemo {
public static void main(String[] args) throws Exception {
// uploadUrl 为获取上传文件 URL 接口(/v1/document-management/upload-url)获取到的地址
String uploadUrl = "https://dev.file.vcaas.hilinkdemo.com/90972391106285568/test.doc?Expires=1668583421&Signature=inz-umy8E76cgZM60hLmVpKtD~vjOHeZx-xASrHPqxNTL~zbOy9mY13~5m6-nk81DvMUJutrXq2jSY8eQ478239Kq5CKSwH2pjIfOdRr~Cxts~aaKkTPgs5oHuZCiFFUYnPrl1vqVwOeBPn-OIga4Js6RtAx1tNhWPQ2jEcbXtLRsMgOhWH3x6WlJfT7JA9bwM0odrRm~ybqwtdlFnDy~8CMGfP-9Ef7YH2EpMzypk25s0YoUzHil5QDW8g~npCjjgJ2s5vXCgCXikEFsMjxmgfITPI-7Dfen1CJaui4uCyLR-9VUxAaz5pGr5DcjGv74XTLUmz~cJB-s4dhX6z6Yw__&Key-Pair-Id=K21VT8DFTV93QE";
URL url = new URL(uploadUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/octet-stream");
// 请求方法必须设置为 PUT
connection.setRequestMethod("PUT");
OutputStream out = connection.getOutputStream();
// 待上传文件路径
FileInputStream in = new FileInputStream("/path/to/test.doc");
int bytes = 0;
byte[] bufferOut = new byte[2048];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
in.close();
out.flush();
out.close();
connection.getResponseCode();
// code 为 200 说明文件上传成功。code 为 403 说明上传请求被拒绝,是文件上传链接失效导致,需要重新获取上传地址。
System.out.println("HTTP response code is " + connection.getResponseCode());
}
}
关联会议与文档
文档上传成功后,我们可以使用添加会议文档接口 /v1/meeting-center/meetings/{id}/documents 完成会议与文档的关联。上传完的文档可以重复使用,在创建新的会议时,只需将文档ID docId 添加至创建会议接口的请求参数 docIds 即可。 更多添加会议文档接口的细节请查看 VCaaS API 参考中的内容。
加入一个会议
要加入到一个会议中,我们将会使用到创建会议接口返回的会议ID meetingId 和会议地址 meetingUrl。会议ID meetingId 将作为生成 JoinToken 的参数,而会议地址 meetingUrl 将用于拼接会议链接 JoinUrl。
生成 JoinToken
我们将从参数说明、签名、加密三个部分说明如何生成 JoinToken。最后,我们将展示生成 JoinToken 的代码示例。
参数说明
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
| meetingUid | String(20) | true | 会议ID |
| externalRole | String | true | 参数人员角色,可选值[HOST、ATTENDEE、SUPERVISOR],(HOST:主持人、ATTENDEE:参会人员、SUPERVISOR:监课人) |
| externalId | String(64) | true | 外部Id,唯一标识 |
| externalName | String(64) | false | 参会人员名字 |
| externalEmail | String(64) | false | 参会人员邮箱 |
| externalAvatarUrl | String(500) | false | 参会人员头像 |
| allowRecording | String | false | 是否同意录制,可选值[0、1],(0:不同意;1:同意) |
签名
signature = hmac_sha256([meetingUid, externalRole, externalId, externalName,externalEmail, externalAvatarUrl, allowRecording].filter(field -> field.isEmpty()).sort().join(''), secretKey)
- 过滤掉无效参数(null or ’‘),使得所有参数的值表现为字符串形式,按照字典序排序。
- 将排序好的字符串拼接在一起。
- 使用
sha256(secretKey)作为hmac_sha256的secretKey,采用hmac_sha256算法对 2 中的结果字符串做计算,所得结果即为signature。
加密
- 过滤掉无效参数(null or ’‘),将所有参数 和 签名计算的
signature(不包含accessKey、secretKey)封装为一个json对象,如下:
{
"externalRole": "HOST",
"externalEmail": "hello@hilink.co",
"externalAvatarUrl": "http://dummyimage.com/100x100",
"signature": "69e7de2b4d21ff922e8d82596a5c420e75214b79277f894dd92e1c549dcc5d44",
"externalName": "Lucy",
"externalId": "1",
"meetingUid": "109391932341489664",
"allowRecording": "1"
}
- 将json对象转换为字符串,
secretKey作为AES算法的secret,accessKey作为AES算法的iv(向量),AES填充模式:AES/CBC/PKCS5Padding,字符集为UTF-8。 - 使用AES256对参数的json字符串进行加密,然后转Base64(必须使用对URL安全的Encoder,RFC 4648: The Base16, Base32, and Base64 Data Encodings (rfc-editor.org))字符串,所得结果即为
joinToken。
生成 JoinToken 代码示例
package org.example;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.crypto.Cipher;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 生成 JoinToken 代码示例
*/
public class JoinTokenExample {
private static final String DOT = ".";
private static final String CHARSET = "UTF-8";
private static final String SHA_256 = "SHA-256";
private static final String HMAC_256 = "HmacSHA256";
private static final String AES = "AES";
/**
* 加密解密算法/加密模式/填充方式
*/
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
private static final Base64.Encoder BASE64_ENCODER = Base64.getUrlEncoder();
private static final Base64.Decoder BASE64_DECODER = Base64.getUrlDecoder();
public static void main(String[] args) throws Exception {
String accessKey = "4mBmzWmNt9Dy5een";
String secretKey = "ef8d8fec05064779b3e0243cdae744e8";
// 参数列表
Map<String, String> parameter = new HashMap<>();
parameter.put("meetingUid", "109391932341489664");
parameter.put("externalRole", "HOST");
parameter.put("externalId", "1");
parameter.put("externalName", "Lucy");
parameter.put("externalEmail", "hello@hilink.co");
parameter.put("externalAvatarUrl", "http://dummyimage.com/100x100");
parameter.put("allowRecording", "1");
// 过滤
parameter.entrySet().removeIf(entry -> entry.getValue() == null || "".equals(entry.getValue()));
// 排序
List<String> sortedParameter = parameter.values().stream()
.sorted()
.collect(Collectors.toList());
// 合并
String mergeString = sortedParameter.stream().reduce((p1, p2) -> p1 + p2).orElse(null);
assert mergeString != null;
// 生成签名
String signature = hmac256(mergeString, sha256(secretKey));
// 追加签名参数
parameter.put("signature", signature);
// 转换为json
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(parameter);
String token = accessKey + DOT + aes(json, secretKey, accessKey);
System.out.println(token);
}
public static String aes(String plainText, String secret, String ivStr) {
try {
SecretKey secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), AES);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(ivStr.getBytes(StandardCharsets.UTF_8)));
byte[] byteEncode = plainText.getBytes(StandardCharsets.UTF_8);
return BASE64_ENCODER.encodeToString(cipher.doFinal(byteEncode));
} catch (Exception e) {
throw new RuntimeException("AES encrypt fail,plainText=" + plainText + ",secret=" + secret.length() + "。" + e.getMessage(), e);
}
}
private static String hmac256(String content, String secretKey) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(new HexBinaryAdapter().unmarshal(secretKey), HMAC_256);
Mac mac = Mac.getInstance(secretKeySpec.getAlgorithm());
mac.init(secretKeySpec);
byte[] bytes = mac.doFinal(content.getBytes(CHARSET));
return new HexBinaryAdapter().marshal(bytes).toLowerCase();
}
private static String sha256(String input) throws Exception {
byte[] bytes = MessageDigest.getInstance(SHA_256).digest(input.getBytes(CHARSET));
return new HexBinaryAdapter().marshal(bytes).toLowerCase();
}
}
控制台将输出 JoinToken 如下:
JoinToken:4mBmzWmNt9Dy5een.qWMOFzhAjZtJwfnA-JGvOjceEkUyl3EqDa31pzNqd-ni__OvGUjGDRiQVHf4AmA6j_DdRNDFTJaiFnm6qsFcG5wj8URnE6LPMhfphsywAyRveWQCEdQiGo7HZej1dvoVa7treyb35U9pQzAg31D8qmg9Ec9K-jd0zcvFmqfdKdWE8u9zA7Nson7oPugeqowIH4o2sT02wFU8k0Uiwv03njj_yI4SVDDfRraQV6cWwoaxVfUt0qlpkXF-O_nIOkqigyPXlilD93JdR-9yPb6OvGvUfrR1uYIVVxFFV4Tojd-NIzKdSuNyQn6dPO4B7QP_ZeQyHSzZUqsE6PZlvGrvB-raYv_sum4ZQU-x1OOjtge-u2_dFmec3PonOX0BDl
拼接会议链接 JoinUrl
将会议地址 meetingUrl 与生成的 JoinToken 拼接在一起,就是最终的会议链接。
会议地址(meetingUrl):https://dev.vcaas.hilinkdemo.com/meeting
JoinToken:4mBmzWmNt9Dy5een.qWMOFzhAjZtJwfnA-JGvOjceEkUyl3EqDa31pzNqd-ni__OvGUjGDRiQVHf4AmA6j_DdRNDFTJaiFnm6qsFcG5wj8URnE6LPMhfphsywAyRveWQCEdQiGo7HZej1dvoVa7treyb35U9pQzAg31D8qmg9Ec9K-jd0zcvFmqfdKdWE8u9zA7Nson7oPugeqowIH4o2sT02wFU8k0Uiwv03njj_yI4SVDDfRraQV6cWwoaxVfUt0qlpkXF-O_nIOkqigyPXlilD93JdR-9yPb6OvGvUfrR1uYIVVxFFV4Tojd-NIzKdSuNyQn6dPO4B7QP_ZeQyHSzZUqsE6PZlvGrvB-raYv_sum4ZQU-x1OOjtge-u2_dFmec3PonOX0BDl
会议链接(JoinUrl):https://dev.vcaas.hilinkdemo.com/meeting?joinToken=4mBmzWmNt9Dy5een.qWMOFzhAjZtJwfnA-JGvOjceEkUyl3EqDa31pzNqd-ni__OvGUjGDRiQVHf4AmA6j_DdRNDFTJaiFnm6qsFcG5wj8URnE6LPMhfphsywAyRveWQCEdQiGo7HZej1dvoVa7treyb35U9pQzAg31D8qmg9Ec9K-jd0zcvFmqfdKdWE8u9zA7Nson7oPugeqowIH4o2sT02wFU8k0Uiwv03njj_yI4SVDDfRraQV6cWwoaxVfUt0qlpkXF-O_nIOkqigyPXlilD93JdR-9yPb6OvGvUfrR1uYIVVxFFV4Tojd-NIzKdSuNyQn6dPO4B7QP_ZeQyHSzZUqsE6PZlvGrvB-raYv_sum4ZQU-x1OOjtge-u2_dFmec3PonOX0BDl
获取会议的数据
会议结束后,会产生相应的会议时长、与会者考勤、会议录像(会议过程中开启录像)以及会议过程中的 POLL、QUIZ 记录等数据。 VCaaS 平台提供主动推送和查询会议数据接口两种方式获取会议数据。VCaaS 平台提供的会议时长和与会者考勤数据是基于客户端连接事件产生,可能出现事件延时。 所以,在会议结束五分钟后,将首次主动推送的会议数据。更多查询会议时长数据接口 /v1/meeting-center/meetings/{id}/data 的细节请查看 VCaaS API 参考中的内容。
会议数据数据结构说明
{
// 会议时长数据
"meetingData": {
// 会议ID
"meetingUid": "",
// 外部会议ID
"meetingExternalId": "",
// 原计划会议开始时间
"scheduledStartTime": "",
// 原计划会议结束时间
"scheduledEndTime": "",
// 会议实际开始时间
"startTime": "",
// 会议实际结束时间
"endTime": "",
// 会议持续时长,单位:秒
"duration": ""
},
// 会议与会者考勤数据
"attendeeDatas": [
{
// 会议ID
"meetingUid": "",
// 外部会议ID
"meetingExternalId": "",
// 与会者ID
"attendeeUid": "",
// 外部与会者ID
"externalId": "",
// 与会者首次进入会议时间
"timeIn": "",
// 与会者最后一次离开会议时间
"timeOut": "",
// 参会总时长,单位:秒
"totalTime": "",
// 设备
"device": "",
// 与会者考勤明细数据
"details": [
{
// 考勤类型,AttendeeJoined:进入会议;AttendeeLeft:离开会议;AttendeeDropped:与会者掉线;
"type": "",
// 时间戳,单位:毫秒
"timestamp": 0
}
]
}
],
// 会议录像数据
"meetingVideoData": {
// 会议ID
"meetingUid": "",
// 外部会议ID
"meetingExternalId": "",
// 会议录像下载地址
"videoUrls": [
""
]
},
// 会议互动数据
"meetingInteractiveData": {
// 会议ID
"meetingUid": "",
// 外部会议ID
"meetingExternalId": "",
// 答题数据
"quizData": {
// 使用答题器总次数
"totalCount": 0,
// 答题器明细数据
"detailDatas": [
{
// 题目ID
"id": "",
// 题目内容和选项
"content": {
// 选项
"options": [
{
"value": "",
"label": ""
}
],
// 题目内容
"content": ""
},
// 答题正确率
"averageAccuracy": "",
// 正确答案
"correctAnswer": ""
}
]
},
// 投票数据
"pollData": {
// 使用投票总次数
"totalCount": 0,
// 投票明细数据
"detailDatas": [
{
// 投票ID
"id": "",
// 投票内容与选项
"content": {
// 选项
"options": [
{
"value": "",
"label": ""
}
],
// 内容
"content": ""
}
}
]
}
},
// 会议与会者互动数据
"attendeeInteractiveDatas": [
{
// 会议ID
"meetingUid": "",
// 外部会议ID
"meetingExternalId": "",
// 与会者ID
"attendeeUid": "",
// 外部与会者ID
"externalId": "",
// 与会者答题数据
"attendeeQuizData": {
// 参与答题次数
"count": 0,
// 答题结果
"answers": [
{
// 题目ID
"id": "",
// 与会者用户名
"username": "",
// 题型
"questionType": "",
// 与会者选项
"selection": ""
}
]
},
// 与会者投票数据
"attendeePollData": {
// 参与投票次数
"count": 0,
// 投票结果
"answers": [
{
// 投票ID
"id": "",
// 与会者用户名
"username": "",
// 投票类型
"pollType": "",
// 投票选项
"pollOption": {
"value": "",
"label": ""
}
}
]
}
}
],
// 课后评价数据
"evaluationData": [
{
// 与会者ID
"attendeeUid": "222883139968741376",
// 外部与会者ID
"externalId": "3f4cf897028313443fcf93e48a5fda60",
// 与会者角色类型
"attendeeType": "HOST",
// 评分
"score": 4,
// 反馈
"feedback": [],
// 评价
"review": ""
}
]
}
会议数据示例
{
"meetingData": {
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"scheduledStartTime": "1671519598",
"scheduledEndTime": "1692196976",
"startTime": "1672132286",
"endTime": "1672201926",
"duration": "2024"
},
"attendeeDatas": [
{
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"attendeeUid": "105859080664518656",
"externalId": "Q8NnQKOaWhax8cD195wB7Q==",
"timeIn": "1672132517",
"timeOut": "1672133011",
"device": "",
"details": [
{
"type": "AttendeeJoined",
"timestamp": 1672132517822
},
{
"type": "AttendeeLeft",
"timestamp": 1672132700326
},
{
"type": "AttendeeJoined",
"timestamp": 1672132952680
},
{
"type": "AttendeeLeft",
"timestamp": 1672133011815
}
]
}
],
"meetingVideoData": {
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"videoUrls": [
"https://hilink-agora-record-dev.s3.amazonaws.com/31/11e35f12a24b170324e9b38307ee9011_VCaaS31104936_0.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230113T105238Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=AKIA5MC3STOBSQDRGF7M%2F20230113%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=f08aa8d30c2e12ef4a909824413a13e489d409f673013414cd4b444cb48b03b6"
]
},
"meetingInteractiveData": {
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"quizData": {
"totalCount": 1,
"detailDatas": [
{
"id": "f8d836e56fb030b893e0f3a05bc487a9",
"content": {
"options": [
{
"value": "A",
"label": "ff"
},
{
"value": "B",
"label": "ffff"
}
],
"content": "jjjf"
},
"averageAccuracy": "",
"correctAnswer": "A"
}
]
},
"pollData": {
"totalCount": 1,
"detailDatas": [
{
"id": "65155160d48337ee47bcd634bd67bc66",
"content": {
"options": [
{
"value": "A",
"label": "fff"
},
{
"value": "B",
"label": "ffffff"
}
],
"content": "nihaoy"
}
}
]
}
},
"attendeeInteractiveDatas": [
{
"meetingUid": "103288082375249920",
"meetingExternalId": "123",
"attendeeUid": "106838452825362432",
"externalId": "FWhhpuTn1rUif3UM70gq7Q==",
"attendeeQuizData": {
"count": 1,
"answers": [
{
"id": "ef84a2b4634bd53dee901b59076a5d5d",
"username": "106838452825362432",
"questionType": "MULTIPLE_CHOICE",
"selection": "A"
}
]
},
"attendeePollData": {
"count": 1,
"answers": [
{
"id": "6f3d5e11338c834b667940f85e0da317",
"username": "106838452825362432",
"pollType": "MULTIPLE_CHOICE",
"pollOption": {
"value": "A",
"label": "hoa"
}
}
]
}
}
],
"evaluationData": [
{
"attendeeUid": "222883139968741376",
"externalId": "3f4cf897028313443fcf93e48a5fda60",
"attendeeType": "HOST",
"score": 4,
"feedback": [],
"review": ""
}
]
}
管理机构文档
用户可以使用 VCaaS 文件接口,对本机构下的文档进行管理。更多细节请查看 VCaaS API 参考中的内容。
- 获取文档列表接口:/v1/document-center/documents
- 查询文档接口:/v1/document-center/documents/{id}
- 删除文档接口:/v1/document-center/documents/{id}