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

BotBuilder SDK 4.0开发的Teams频道机器人无法获取文件downloadUrl

解决Teams频道场景下BotBuilder 4.x机器人无法获取上传文件downloadUrl的问题

问题原因

Teams私聊与频道场景的文件处理逻辑存在差异:

  • 私聊时,用户上传的文件直接作为附件嵌入消息activity,因此context.activity.attachments能正常获取文件信息;
  • 频道场景下,用户上传的文件默认存储在对应频道的SharePoint文档库中,不会直接以attachment形式传入activity,导致context.activity.attachments.length为0。

解决方案

1. 配置Teams应用Manifest权限

确保机器人应用manifest包含访问SharePoint文件的必要权限:

  • 在manifest.json中添加或修改webApplicationInfo节点:
    "webApplicationInfo": {
      "id": "<你的机器人Azure AD应用ID>",
      "resource": "https://graph.microsoft.com",
      "applicationPermissions": ["Files.ReadWrite.Group"]
    }
    
  • 同时在authorization节点添加Graph权限范围:
    "authorization": {
      "permissions": {
        "resourceSpecific": [
          {
            "name": "ChannelMessage.Send.Group",
            "type": "Application"
          },
          {
            "name": "Files.ReadWrite.Group",
            "type": "Application"
          }
        ]
      }
    }
    

2. 从Activity实体中提取文件信息

频道中用户@机器人上传文件时,context.activity.entities会包含file类型的实体,从中可获取文件的唯一标识:

// 查找文件实体
const fileEntity = context.activity.entities?.find(entity => entity.type === 'file');
if (fileEntity) {
  const fileName = fileEntity.name;
  const fileItemId = fileEntity.id; // SharePoint文件的Item ID
  const teamId = context.activity.channelData.team.id; // 团队ID(对应SharePoint组ID)
  
  // 调用Graph API获取下载链接
  await getFileDownloadUrl(teamId, fileItemId, context);
}

3. 调用Microsoft Graph API获取下载链接

通过Bot的OAuth令牌调用Graph API,获取文件的@microsoft.graph.downloadUrl:

async function getFileDownloadUrl(teamId, fileItemId, context) {
  // 获取Graph访问令牌(需提前在Bot Portal配置OAuth连接)
  const adapter = context.adapter;
  const tokenResponse = await adapter.getUserToken(context, 'GraphConnection'); // 替换为你的OAuth连接名称
  
  if (tokenResponse?.token) {
    const graphClient = require('@microsoft/microsoft-graph-client').Client.init({
      authProvider: (done) => done(null, tokenResponse.token)
    });
    
    // 调用Graph API获取文件详情
    const fileDetails = await graphClient.api(`/teams/${teamId}/drive/items/${fileItemId}`).get();
    const downloadUrl = fileDetails['@microsoft.graph.downloadUrl'];
    
    // 后续将downloadUrl发送至后端处理
    console.log('文件下载链接:', downloadUrl);
  }
}

4. 配置Bot OAuth连接

在Bot Framework Portal中为机器人配置Microsoft Graph的OAuth连接:

  • 选择你的机器人,进入“设置”>“OAuth连接设置”
  • 创建新连接,选择“Azure Active Directory v2”作为服务提供商
  • 填写应用ID、密钥,设置Scopes为Files.ReadWrite.Group等所需权限

注意事项

  • 确保机器人已被授予团队频道的文件访问权限,否则Graph API调用会返回权限错误;
  • 团队ID可直接从context.activity.channelData.team.id获取,无需手动分割conversation ID;
  • 若使用应用权限而非用户权限,需在Azure AD中为机器人应用分配Files.ReadWrite.All或Files.ReadWrite.Group的应用权限,并完成管理员同意。

内容的提问来源于stack exchange,提问作者user9262680

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:46:11