跳到主要内容

白板服务端集成

普通 EduSDK 课堂的白板凭证由后台进课流程下发。本页用于业务后端直接管理白板服务:共享房间 Token、录制、截图和文件转码。

配置独立白板客户端​

以下为 Node.js,其他语言使用对应的 whiteboardClient 入口:

import { Eduskit } from '@eduskit/server-sdk';

const sdk = new Eduskit({
whiteboardClient: {
baseUrl: process.env.WB_SERVER_URL,
appId: process.env.WB_APP_ID,
appKey: process.env.WB_APP_KEY,
appSecret: process.env.WB_APP_SECRET,
},
});

上述环境变量均必填。WB_SERVER_URL 为白板 server-api 地址,本地开发为 http://localhost:3012。使用白板应用自己的凭据。

常规方法​

MethodHTTP
auth.issueRoomTokenLOCAL HS256 (eduskit-room)
recordings.startPOST /v1/rooms/recording/start
recordings.stopPOST /v1/rooms/recording/stop
recordings.listGET /v1/rooms/recordings
recordings.getGET /v1/recordings
recordings.registerMediaAssetPOST /v1/recordings/media-assets
recordings.deleteMediaAssetDELETE /v1/recordings/media-assets
recordings.enqueueVideoExportPOST /v1/recordings/video-exports
recordings.getVideoExportGET /v1/recordings/video-exports
captures.createPOST /v1/rooms/captures
captures.listGET /v1/rooms/captures
files.convertPOST /v1/files/convert
files.getConvertJobGET /v1/files/convert

录制和转码​

下面的 roomId 必须是业务有权管理的实际白板房间。开始和停止录制应分别绑定到业务动作,示例展示它们的调用顺序:

const recording = await sdk.whiteboardClient.recordings.start(roomId, {
externalRef: 'lesson-001',
});
// 在业务决定停止录制时执行后续调用。
await sdk.whiteboardClient.recordings.stop(roomId, {
recordingId: recording.recordingId,
});
const exportJob = await sdk.whiteboardClient.recordings.enqueueVideoExport(recording.recordingId, {
profile: 'hd',
});
const exportStatus = await sdk.whiteboardClient.recordings.getVideoExport(exportJob.jobId);
const convertJob = await sdk.whiteboardClient.files.convert({
sourceUrl: 'https://example.com/lesson.pptx',
fileName: 'lesson.pptx',
});
const conversion = await sdk.whiteboardClient.files.getConvertJob(convertJob.jobId);

视频生成需另行提交导出任务。导出和转码均为异步任务,通过状态查询或相应回调获取结果。转码至少提供 sourceUrl 或 objectKey,URL 需指向服务可访问的文件。

房间与私有作品 API​

Node.js 0.1.5 及五种语言的源码构建提供以下接口,接入时需配置对应白板服务、业务授权和对象存储。attachCourseware 绑定房间课件,其余方法管理私有房间与作品。教学小黑板暂未开放。

MethodHTTP
rooms.provisionPrivateRoomPOST /v1/rooms/private
rooms.changePrivateRoomGrantPOST /v1/rooms/private/grants
rooms.getPrivateRoomAccessPOST /v1/rooms/private/access/query
rooms.issuePrivateRoomTokenPOST /v1/rooms/private/token
rooms.sealPrivateRoomPOST /v1/rooms/private/seal
rooms.createFrozenSnapshotPOST /v1/rooms/private/snapshots
rooms.initializePrivateWorkspacePOST /v1/rooms/private/initializations
rooms.getPrivateWorkspaceInitializationPOST /v1/rooms/private/initializations/query
rooms.getFrozenSnapshotPOST /v1/rooms/private/snapshots/query
rooms.getFrozenSnapshotDownloadPOST /v1/rooms/private/snapshots/download
rooms.attachCoursewarePOST /v1/rooms/coursewares
rooms.schedulePrivateRoomWritesPOST /v1/rooms/private/write-window

私有房间工作流:初始化工作版本 → 查询到 ready → 设置授权和写入时间窗 → 由服务器签发私有 Token → 封写 → 创建固定作品 → 查询到 ready 后取得下载链接。

sourceSnapshotId 必须显式传入:空文档用 null(Python None,Go nil),复制作品时传已有作品 ID。授权变化使用 requestId 和 expectedGeneration,重试同一请求必须保持参数一致。generation、expectedGeneration、frozenSeq、sizeBytes 保持十进制字符串。

opensAt / closesAt 是 UTC ISO 毫秒字符串,区间不可延长或重开。只有授权而没有写入时间窗时仍不可写。私有 Token 的 generation 由服务端读取,业务方不能自行指定。固定作品下载 URL 有效期为 60 秒,不应保存为长期资源地址。