Manifest 和权限
Teams 应用清单、其声明的资源特定同意权限,以及用于解锁媒体和历史记录的 Microsoft Graph 权限。
当前 Teams RSC 权限(manifest)¶
这些是我们 Teams 应用清单中现有的 resourceSpecific 权限。它们仅适用于安装该应用的团队/聊天内部。
对于频道(团队作用域):
ChannelMessage.Read.Group(Application)- 接收所有频道消息,无需 @mentionChannelMessage.Send.Group(Application)Member.Read.Group(Application)Owner.Read.Group(Application)ChannelSettings.Read.Group(Application)TeamMember.Read.Group(Application)TeamSettings.Read.Group(Application)
对于群聊:
ChatMessage.Read.Chat(Application)- 接收所有群聊消息,无需 @mention
通过 Teams CLI 添加 RSC 权限:
Teams manifest 示例(已脱敏)¶
包含必需字段的最小有效示例。请替换 ID 和 URL。
{
$schema: "https://developer.microsoft.com/en-us/json-schemas/teams/v1.23/MicrosoftTeams.schema.json",
manifestVersion: "1.23",
version: "1.0.0",
id: "00000000-0000-0000-0000-000000000000",
name: { short: "OpenClaw" },
developer: {
name: "Your Org",
websiteUrl: "https://example.com",
privacyUrl: "https://example.com/privacy",
termsOfUseUrl: "https://example.com/terms",
},
description: { short: "OpenClaw in Teams", full: "OpenClaw in Teams" },
icons: { outline: "outline.png", color: "color.png" },
accentColor: "#5B6DEF",
bots: [
{
botId: "11111111-1111-1111-1111-111111111111",
scopes: ["personal", "team", "groupChat"],
isNotificationOnly: false,
supportsCalling: false,
supportsVideo: false,
supportsFiles: true,
},
],
webApplicationInfo: {
id: "11111111-1111-1111-1111-111111111111",
},
authorization: {
permissions: {
resourceSpecific: [
{ name: "ChannelMessage.Read.Group", type: "Application" },
{ name: "ChannelMessage.Send.Group", type: "Application" },
{ name: "Member.Read.Group", type: "Application" },
{ name: "Owner.Read.Group", type: "Application" },
{ name: "ChannelSettings.Read.Group", type: "Application" },
{ name: "TeamMember.Read.Group", type: "Application" },
{ name: "TeamSettings.Read.Group", type: "Application" },
{ name: "ChatMessage.Read.Chat", type: "Application" },
],
},
},
}
Manifest 注意事项(必备字段)¶
bots[].botId必须与 Azure Bot App ID 匹配。webApplicationInfo.id必须与 Azure Bot App ID 匹配。bots[].scopes必须包含你计划使用的界面(personal、team、groupChat)。bots[].supportsFiles: true是 personal 作用域中文件处理所必需的。authorization.permissions.resourceSpecific必须包含频道读取/发送,以处理频道流量。
更新现有应用¶
# Download, edit, and re-upload the manifest
teams app manifest download <teamsAppId> manifest.json
# Edit manifest.json locally...
teams app manifest upload manifest.json <teamsAppId>
# Version is auto-bumped if content changed
更新后,请在每个团队中重新安装该应用,并完全退出并重新启动 Teams(不仅仅是关闭窗口),以清除缓存的应用元数据。
手动更新 manifest(不使用 CLI)
- 使用新设置更新
manifest.json。 - 递增
version字段(例如,1.0.0→1.1.0)。 - 重新压缩 manifest 和图标(
manifest.json、outline.png、color.png)。 - 上传新的 zip:
- Teams Admin Center: Teams 应用 → 管理应用 → 找到你的应用 → 上传新版本。
- Sideload: Teams → 应用 → 管理你的应用 → 上传自定义应用。
功能:仅 RSC 与 Graph¶
仅使用 Teams RSC(应用已安装,无 Graph API 权限)¶
可用:
- 读取频道消息的文本内容。
- 发送频道消息的文本内容。
- 接收个人(DM)文件附件。
不可用:
- 频道/群组图像或文件内容(payload 仅包含一个 HTML 存根)。
- 下载存储在 SharePoint/OneDrive 中的附件。
- 读取实时 webhook 事件之外的消息历史记录。
使用 Teams RSC + Microsoft Graph 应用程序权限¶
新增:
- 下载托管内容(粘贴到消息中的图像)。
- 下载存储在 SharePoint/OneDrive 中的文件附件。
- 通过 Graph 读取频道/聊天消息历史记录。
RSC 与 Graph API¶
| 功能 | RSC 权限 | Graph API |
|---|---|---|
| 实时消息 | 是(通过 webhook) | 否(仅轮询) |
| 历史消息 | 否 | 是(可查询历史记录) |
| 设置复杂度 | 仅需应用清单 | 需要管理员同意 + token 流程 |
| 离线可用 | 否(必须正在运行) | 是(可随时查询) |
结论: RSC 用于实时监听;Graph API 用于历史访问。若要补全离线期间错过的消息,你需要带有 ChannelMessage.Read.All 的 Graph API(需要管理员同意)。
Graph 支持的媒体 + 历史记录¶
仅启用你使用的 Teams 作用域和数据所需的 Microsoft Graph 应用程序权限:
- Entra ID(Azure AD)应用注册 → 添加 Graph 应用程序权限:
ChannelMessage.Read.All用于频道附件和频道历史记录。Chat.Read.All用于群聊附件和群聊历史记录。Files.Read.All当必须从 SharePoint/OneDrive 存储下载附件字节时使用;仅历史记录的设置不需要它。- 为租户授予管理员同意。
- 提升 Teams 应用的manifest 版本,重新上传,并在 Teams 中重新安装应用。
- 完全退出并重新启动 Teams,以清除缓存的应用元数据。
频道/群组文件恢复(graphMediaFallback)¶
Teams 可以从发送给机器人的 HTML 活动中移除文件标记。在这种情况下,Bot Framework 活动与普通 HTML 消息无法区分;完整的附件引用仅存在于该消息的 Graph 副本中。
在授予上述权限后,启用回退机制:
此设置仅适用于频道和群组聊天。每当 HTML 活动未产生可直接下载的媒体时,它会额外执行一次 Graph 消息查找,包括普通消息或仅包含提及的消息。默认值为 false,因此现有安装不会自动产生额外的 Graph 流量或权限错误。
用户提及: 对于已在对话中的用户,@mentions 开箱即用。若要动态搜索并提及不在当前对话中的用户,请添加 User.Read.All(Application)权限并授予管理员同意。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw