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
相关产品推荐
相关产品推荐

