如何将Airtable中的视频附件发送至MS Teams机器人?
解决MS Teams机器人发送Airtable视频附件的问题
核心问题诊断
你遇到的问题主要来自三个细节错误,以及Teams与Bot模拟器的校验差异:
- 视频卡片缺少合法宽高比:Teams对视频卡片强制要求指定
aspect参数(仅支持16:9或4:3),模拟器无严格校验但Teams会触发"Invalid aspect value"错误。 - Airtable附件处理错误:
record.get("Attachments")返回的是数组,直接取files.url会得到undefined,需取数组元素的属性。 - 异步循环逻辑问题:
forEach(async ...)无法等待异步操作完成,会导致消息发送无序或失败,需改用for...of循环。 - 普通附件的Teams支持限制:Teams对直接发送视频附件支持有限,仅显示为可下载文件,无法直接播放,优先推荐视频卡片方案。
方案一:修正视频卡片实现(推荐)
这是Teams中播放视频的最优方式,以下是修正后的完整代码:
1. 修正视频卡片构造函数
添加合法的aspect参数,同时复用Airtable返回的文件名:
async function createVideoCard(title, url) { return CardFactory.videoCard( title, [{ "url": url }], [{ "type": "openUrl", "title": "了解更多", "value": "https://channel9.msdn.com/Events/Imagine-Cup/World-Finals-2018/2018-Imagine-Cup-World-Championship-Intro" }], { "subtitle": "by Microsoft", "text": "Microsoft Imagine Cup 十六年来赋能全球学生开发者在世界舞台上创造创新,这些成果将改变我们的生活、工作与娱乐方式。", "aspect": "16:9" // 必须指定合法宽高比,解决"Invalid aspect value"错误 } ); }
2. 修正Airtable数据获取与发送逻辑
改用for...of处理异步循环,正确读取附件数组:
const records = await base(course_tn).select({ view: "Grid view" }).all(); // 用for...of确保异步操作按顺序执行 for (const record of records) { const attachments = record.get("Attachments"); // 检查附件数组是否存在且有内容 if (attachments && attachments.length > 0) { const videoFile = attachments[0]; const videoCard = await createVideoCard(videoFile.filename, videoFile.url); await turnContext.sendActivity({ attachments: [videoCard] }); } }
方案二:修正普通附件发送(仅用于下载场景)
如果仅需要让用户下载视频而非直接播放,可修正以下问题:
1. 修正附件构造函数的语法错误
修复contentType的引号缺失问题,复用Airtable返回的媒体类型:
async function getInternetAttachment(file) { return { name: file.filename, contentType: file.type, // 直接使用Airtable返回的video/mp4,避免手动写错 contentUrl: file.url }; }
2. 修正发送逻辑
同样改用for...of循环,正确读取附件:
const records = await base(course_tn).select({ view: "Grid view" }).all(); for (const record of records) { const attachments = record.get("Attachments"); if (attachments && attachments.length > 0) { const videoFile = attachments[0]; const attachment = await getInternetAttachment(videoFile); await turnContext.sendActivity({ attachments: [attachment] }); } }
额外说明
- 修改
manifest.json中的supportsFile: true仅用于机器人接收用户发送的文件,与发送文件无关,无需修改。 - 确保Airtable返回的视频URL为HTTPS协议,Teams不支持HTTP资源。
内容的提问来源于stack exchange,提问作者Dummy Cron
相关产品推荐
相关产品推荐

