概述
本文將指引您通過 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: 此對象表示課堂中預設的測驗。您需要先創建一個測驗並獲取測驗 ID。當然,您亦可先創建一個會議,再透過其他介面將測驗預設至此會議。
創建會議介面請求參數示例
{
"meetingExternalId": "500000",
"meetingTitle": "Tech meeting",
"startTime": 1673062042,
"endTime": 1673753242,
"timerCountdown": 5,
"callbackUrl": "<https://www.hilink.co/>",
"redirectUrl": "<https://www.hilink.co/>",
"config": {
},
"docIds": [
]
}
創建會議介面請求響應示例
{
"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": "",
// 設備
"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}