You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Airtable中的视频附件发送至MS Teams机器人?

解决MS Teams机器人发送Airtable视频附件的问题

核心问题诊断

你遇到的问题主要来自三个细节错误,以及Teams与Bot模拟器的校验差异:

  1. 视频卡片缺少合法宽高比:Teams对视频卡片强制要求指定aspect参数(仅支持16:9或4:3),模拟器无严格校验但Teams会触发"Invalid aspect value"错误。
  2. Airtable附件处理错误:record.get("Attachments")返回的是数组,直接取files.url会得到undefined,需取数组元素的属性。
  3. 异步循环逻辑问题:forEach(async ...)无法等待异步操作完成,会导致消息发送无序或失败,需改用for...of循环。
  4. 普通附件的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:48:17