飞书企业协作
简介
面向企业与开发者,系统化阐述在 OpenClaw 生态中集成飞书(Lark)企业协作渠道的完整方案。内容覆盖飞书开放平台认证与应用配置、消息推送机制、群聊管理、用户信息获取、文件与云文档协作、权限管理等能力,并给出多租户与多账号支持、API 限流与错误重试、安全令牌管理的最佳实践。同时,结合仓库中的实际实现,提供可操作的配置要点、调用流程与排障建议。
项目结构
飞书通道插件位于 extensions/feishu,采用模块化设计,按“通道适配层、客户端封装、工具集(文档/网盘/知识库/权限)”分层组织。核心入口为通道插件定义,负责对接 OpenClaw 的通道框架;配置模式通过 Zod Schema 校验,支持单账号与多账号模式;SDK 封装统一了 HTTP 超时、WebSocket 客户端与事件解密器。
graph TB
subgraph "飞书通道插件"
A["channel.ts<br/>通道插件定义"]
B["config-schema.ts<br/>配置校验与默认值"]
C["client.ts<br/>SDK 客户端封装"]
D["send.ts<br/>消息发送/编辑/卡片"]
E["chat.ts<br/>群聊信息/成员查询"]
F["docx.ts<br/>云文档读写/图片/表格"]
G["drive.ts<br/>云盘文件操作"]
H["wiki.ts<br/>知识库节点管理"]
I["perm.ts<br/>权限成员管理"]
end
A --> B
A --> C
A --> D
A --> E
A --> F
A --> G
A --> H
A --> I
核心组件
- 通道插件:定义飞书通道元数据、能力、目标解析、目录查询、状态探测、网关启动等。
- 配置校验:Zod Schema 定义通道级与账户级配置项,含连接模式、域名、策略、工具开关、超时等。
- 客户端封装:统一创建 Lark SDK 客户端、WS 客户端、事件解密器,注入超时与代理。
- 消息发送:支持文本卡片、富文本卡片、回复到主题、@ 提及、编辑消息、回退直发等。
- 工具集:
- 文档:读取/清空/插入块、Markdown 转换、图片/文件上传、表格/列表/嵌套结构处理。
- 云盘:列出/新建/移动/删除文件与文件夹。
- 知识库:空间/节点列举、获取、创建、移动、重命名。
- 权限:列出/添加/移除成员。
架构总览
下图展示从 OpenClaw 通道框架到飞书 SDK 的调用链路,以及消息发送与工具调用的关键路径。
graph TB
OC["OpenClaw 通道框架"]
CH["通道插件 channel.ts"]
CFG["配置校验 config-schema.ts"]
CL["客户端封装 client.ts"]
SD["消息发送 send.ts"]
CT["群聊工具 chat.ts"]
DOC["文档工具 docx.ts"]
DRV["云盘工具 drive.ts"]
WK["知识库 wiki.ts"]
PM["权限工具 perm.ts"]
OC --> CH
CH --> CFG
CH --> CL
CH --> SD
CH --> CT
CH --> DOC
CH --> DRV
CH --> WK
CH --> PM
详细组件分析
认证与应用配置
- 应用与凭证
- 支持 appId/appSecret 基础凭证,以及可选 encryptKey 与 verificationToken(用于 Webhook 模式)。
- 支持自定义域名或 feishu/lark 两种预设域。
- 连接模式
- websocket:默认模式,适合低延迟事件订阅。
- webhook:需配置 verificationToken,配合回调地址使用。
- 多账号与默认账号
- 支持 accounts 字典配置多个账号,defaultAccount 指定默认账号。
- 配置校验确保 defaultAccount 在 accounts 中存在。
- 策略与行为
- dmPolicy/groupPolicy 控制私聊/群组接入策略。
- requireMention 控制是否必须 @ 机器人。
- markdown/renderMode/streaming 等渲染与流式输出选项。
- 反应通知、打字指示、主题线程回复等交互细节。
消息推送机制
- 发送路径
- 解析目标(用户/群组),构建富文本卡片或纯文本消息。
- 优先使用回复接口(支持主题线程),若目标失效则回退直发。
- 支持 @ 提及与 Markdown 表格转换。
- 错误处理
- 对“撤回/未找到”类错误进行识别与自动回退。
- 编辑消息限制(24 小时内)。
- 卡片与流式
- 支持交互式卡片与 Markdown 渲染卡片。
- 流式卡片可通过独立开关启用。
sequenceDiagram
participant U as "用户/会话"
participant CH as "通道插件"
participant TG as "目标解析"
participant CL as "SDK 客户端"
participant API as "飞书消息API"
U->>CH : "发送消息请求"
CH->>TG : "解析收件人/群组"
TG-->>CH : "receiveId/receiveIdType"
CH->>CL : "构造消息内容(卡片/文本)"
CH->>API : "尝试回复(支持主题线程)"
API-->>CH : "成功/失败"
alt "回复失败(撤回/未找到)"
CH->>API : "回退直发"
API-->>CH : "结果"
end
CH-->>U : "发送结果"
群聊管理
- 查询群组信息与成员列表,支持分页与多种成员 ID 类型。
- 作为工具注册后,可在对话中直接调用,避免硬编码。
用户信息获取
- 通道插件提供目录查询接口,支持列出用户与群组,支持实时查询。
- 结合 allowFrom/allowlist 策略,控制可交互范围。
文件传输处理
- 云盘工具
- 列出/新建/移动/删除文件与文件夹。
- 自动兜底根目录 token 获取,兼容不同租户/应用差异。
- 云文档工具
- 读取文档内容与块统计,提示非纯文本结构类型。
- 插入块(含批量与后代 API)、Markdown 转换、图片/文件上传。
- 图片上传绕过 SDK 限制,先创建空块再替换图片 token。
- 文件上传采用占位符策略,随后替换为真实文件 token。
- 安全与体积
- 统一的输入来源互斥校验与大小限制,防止内存峰值与非法输入。
- 远程媒体下载受通道媒体子系统约束,避免过大资源。
flowchart TD
S["开始"] --> R["解析输入来源(url/file_path/image)"]
R --> V{"来源合法且未超限?"}
V --> |否| E["抛出错误"]
V --> |是| D["下载/读取二进制数据"]
D --> U["上传至云盘(drive.media.uploadAll)"]
U --> T["得到file_token"]
T --> P["替换文档块内容(图片/文件)"]
P --> OK["完成"]
云文档协作
- 文档读取:标题、内容、修订号、块计数与类型分布。
- 内容转换:Markdown 转文档块,支持分块与重试以规避内容上限。
- 插入策略:顺序单块插入保证顺序一致性;后代 API 支持复杂结构(表格/单元格)。
- 图片/文件:占位符与替换流程,确保跨数据中心路由正确。
权限管理
- 支持对文档/表格/文件/知识库/wiki 等对象列出/添加/移除成员。
- 成员类型与权限类型枚举覆盖邮箱、open_id、群组、维基空间等。
多租户与多账号支持
- 多账号:accounts 下每个账号可独立配置 domain/connectionMode/verificationToken 等。
- 默认账号:defaultAccount 指向 accounts 中的一个键名。
- 策略校验:当 connectionMode 为 webhook 时,必须提供 verificationToken(账户级或顶层)。
- 动态代理:WS 客户端支持 HTTPS 代理环境变量透传。
API 限流与错误重试
- HTTP 超时:统一注入默认与可配置超时,避免阻塞与死锁。
- 回退策略:回复接口失败时自动回退直发;对“撤回/未找到”场景快速恢复。
- 分块与重试:Markdown 转换失败时按大小切分并递归重试,降低单次失败概率。
- 批量插入:分批插入块,避免单次请求过大导致 400。
安全令牌管理
- 密钥与令牌:encryptKey(事件解密)、verificationToken(Webhook 校验)、appSecret(API 调用鉴权)。
- 配置输入:支持字符串与外部密钥源(env/file/exec)两种方式,避免明文泄露。
- 事件安全:Webhook 模式下必须配置 verificationToken,否则无法启用。
依赖关系分析
- 依赖 SDK:@larksuiteoapi/node-sdk,封装 HTTP、WS、事件解密与各业务 API。
- 类型与校验:zod/typebox,用于配置与参数严格校验。
- 代理支持:https-proxy-agent,便于内网/代理环境部署。
graph LR
P["package.json 依赖"]
SDK["@larksuiteoapi/node-sdk"]
ZOD["zod"]
TYPEBOX["@sinclair/typebox"]
AGENT["https-proxy-agent"]
P --> SDK
P --> ZOD
P --> TYPEBOX
P --> AGENT
性能考量
- 超时与并发:统一注入 HTTP 超时,避免慢响应导致队列阻塞;按需缓存客户端实例。
- 请求拆分:文档转换与块插入采用分块策略,提升大文档稳定性。
- 事件模式:WebSocket 低延迟,Webhook 需要可靠回调与幂等处理。
- 媒体处理:远程媒体下载受通道媒体子系统限制,避免一次性加载过大资源。
故障排查指南
- Webhook 无法接收事件
- 检查 connectionMode 是否为 webhook,verificationToken 是否配置。
- 确认回调地址与端口可达,防火墙放通。
- 消息回复失败
- 若返回“撤回/未找到”,插件会自动回退直发;请检查消息 ID 与权限。
- 主题线程回复需确保原消息仍可访问。
- 文档/图片上传异常
- 确认输入来源唯一且未超限;检查网络与代理设置。
- 跨数据中心场景需携带正确的路由 token。
- 权限不足
- 确认机器人已在对应对象上获得相应权限;知识库需在空间设置中授权。
源码阅读地址
- extensions/feishu/src/config-schema.ts
- extensions/feishu/src/send.ts
- extensions/feishu/src/docx.ts
- extensions/feishu/src/wiki.ts
- extensions/feishu/src/channel.ts
- extensions/feishu/src/config-schema.ts
- extensions/feishu/src/client.ts
- extensions/feishu/src/send.ts
- extensions/feishu/src/chat.ts
- extensions/feishu/src/docx.ts
- extensions/feishu/src/drive.ts
结论
本集成方案基于 OpenClaw 通道框架与飞书官方 SDK,提供了从认证配置、消息推送、群聊与用户管理,到云文档、云盘与权限的完整能力矩阵。通过严格的配置校验、稳健的错误回退与分块策略、以及多账号与多租户支持,能够满足企业级稳定与扩展需求。建议在生产环境中启用 Webhook 模式并完善回调安全校验,同时结合限流与重试策略保障高并发下的可靠性。
附录
- 配置示例要点
- 通道级:domain、connectionMode、webhookPath、dmPolicy/groupPolicy、requireMention、renderMode、streaming、tools 开关。
- 账号级:appId/appSecret/encryptKey/verificationToken/domain/connectionMode/webhookHost/port/path。
- 最佳实践
- 使用外部密钥源存储敏感字段,避免明文写入配置。
- 合理设置 httpTimeoutMs,避免长耗时阻塞。
- 大文档/大图建议分块与异步处理,结合流式卡片优化体验。
- Webhook 模式务必开启 verificationToken 并做好重复消息去重。
企业协作渠道
OpenClaw 以“网关(Gateway)+ 多通道(Channels)+ 工具与技能(Tools/Skills)”为核心架构,通过统一的 WebSocket 控制平面承载会话、路由、工具与事件处理。各企业协作平台以插件或内置通道形式接入,遵循一致的配置模型与安全策略。
graph TB
subgraph "客户端与界面"
UI["Web 控制台/聊天界面"]
Nodes["设备节点macOS/iOS/Android"]
end
subgraph "网关控制平面"
GW["Gateway WebSocket 控制平面"]
Agents["代理/会话引擎"]
Tools["工具与技能平台"]
end
subgraph "企业协作通道"
MSTeams["Microsoft Teams 插件"]
GChat["Google ChatChat API"]
Matrix["Matrix 插件"]
Feishu["飞书内置插件"]
Nextcloud["Nextcloud Talk 插件"]
end
UI --> GW
Nodes --> GW
GW --> Agents
GW --> Tools
GW --> MSTeams
GW --> GChat
GW --> Matrix
GW --> Feishu
GW --> Nextcloud
核心组件
- 网关(Gateway):统一的控制平面,负责会话、路由、工具、事件与安全策略执行。
- 通道(Channels):各企业协作平台的适配层,提供消息收发、媒体、权限与目标解析。
- 认证与密钥(Authentication/Secrets):支持 OAuth、API Key、SecretRef 等多种凭证模式,并提供轮转与失效检测。
- 安全与合规(Security):默认最小权限、沙箱隔离、令牌存储与刷新、审计与漏洞上报流程。
- 多租户与多账号(Multi-tenant/Accounts):按租户/账号维度隔离配置与会话,支持路由到不同代理。
架构总览
下图展示企业协作通道在 OpenClaw 中的端到端交互路径:从企业平台(Teams/Google Chat/Matrix/飞书/Nextcloud)到网关,再到代理与工具链,最终返回到目标平台。
sequenceDiagram
participant User as "用户"
participant MSTeams as "Microsoft Teams"
participant GChat as "Google Chat"
participant Matrix as "Matrix"
participant Feishu as "飞书"
participant NC as "Nextcloud Talk"
participant GW as "OpenClaw 网关"
participant Agent as "代理/会话引擎"
participant Tools as "工具/技能"
User->>MSTeams : 发送消息/文件/投票
MSTeams->>GW : Bot Framework Webhook
GW->>Agent : 解析会话键/路由
Agent->>Tools : 执行工具/技能
Tools-->>Agent : 结果/中间态
Agent-->>GW : 回复内容
GW-->>MSTeams : 发送响应/文件链接
User->>GChat : 发送消息/附件
GChat->>GW : Chat API WebhookBearer 验证
GW->>Agent : 解析空间/会话
Agent->>Tools : 调用工具
Tools-->>Agent : 输出
Agent-->>GW : 文本/卡片
GW-->>GChat : 发送响应
User->>Matrix : DM/房间/线程
Matrix->>GW : 用户事件长连接
GW->>Agent : 会话隔离
Agent->>Tools : 流式/非流式输出
Tools-->>Agent : 块/卡片
Agent-->>GW : 回复含加密/反应
GW-->>Matrix : 发送
User->>Feishu : 消息/富文本/文件
Feishu->>GW : WebSocket 事件
GW->>Agent : DM/群组路由
Agent->>Tools : 生成/处理
Tools-->>Agent : 结果
Agent-->>GW : 卡片/文本
GW-->>Feishu : 发送支持流式
User->>NC : 消息/反应
NC->>GW : Bot Webhook
GW->>Agent : DM/房间识别
Agent->>Tools : 工具调用
Tools-->>Agent : 输出
Agent-->>GW : 文本/URL
GW-->>NC : 发送响应
详细组件分析
Microsoft Teams(企业级集成)
- 插件化部署:Teams 作为独立插件安装,便于版本解耦与依赖更新。
- Bot 注册与权限:需在 Azure Bot 创建单租户应用,配置消息端点与 Teams 渠道;Teams 应用清单需包含资源特定权限(RSC),用于接收/发送频道消息与读取聊天消息。
- 图形 API(可选):启用 Microsoft Graph Application 权限可实现历史消息读取与频道/群组媒体下载,但需要管理员同意。
- 访问控制:DM 默认“配对”策略;群组默认“白名单+@提及”;支持按团队/频道粒度覆盖;支持 per-sender 工具策略。
- 文件上传(群组):通过 SharePoint Site 上传并生成分享链接;可配置组织级或仅成员可见链接。
- 会话与回复样式:支持“主题式(Threads)”与“帖子式(Posts)”两种 UI 风格,需按频道配置 replyStyle。
- 限制与注意事项:Webhook 超时可能导致重复消息与丢包;Markdown 有限;Poll 以 Adaptive Cards 实现。
flowchart TD
Start(["开始:Teams 插件已安装"]) --> Register["注册 Azure Bot单租户"]
Register --> Manifest["配置 Teams 应用清单<br/>含 RSC 权限"]
Manifest --> Endpoint["设置消息端点 URL"]
Endpoint --> Install["在 Teams 中安装应用"]
Install --> Config["配置 OpenClaw msteams 凭据与 webhook"]
Config --> GraphOpt["可选:申请 Graph 权限<br/>读取历史/下载媒体"]
GraphOpt --> SPUpload["可选:配置 SharePoint Site<br/>用于群组文件上传"]
SPUpload --> ReplyStyle["按频道配置 replyStyle"]
ReplyStyle --> Done(["完成:DM/群组/频道可用"])
Google Chat(Chat API)
- 服务账号与 Webhook:使用 Google Cloud 服务账号创建 Chat 应用,启用交互功能与 HTTP 端点 URL;仅暴露 /googlechat 路径至公网,推荐 Tailscale Funnel。
- 认证与受众校验:请求携带 Bearer Token,网关基于 audienceType/audience 进行严格校验;支持 Add-on 的 systemIdToken 预校验。
- 会话与路由:DM 使用 agent::googlechat:dm:;Space 使用 group 键;默认 DM 配对策略。
- 功能与限制:支持 DM/Space;@提及默认开启;反应可通过工具启用;媒体下载受 mediaMaxMb 限制。
sequenceDiagram
participant GC as "Google Chat"
participant GW as "OpenClaw 网关"
participant Agent as "代理"
GC->>GW : Webhook POST /googlechatBearer
GW->>GW : 校验 audienceType/audience
GW->>Agent : 解析空间/会话键
Agent-->>GW : 生成响应
GW-->>GC : 返回文本/卡片/反应
Matrix(去中心化协议)
- 用户型接入:作为 Matrix 用户登录任意 Homeserver,支持 DM、房间、线程、媒体、反应、位置、轮询与 E2EE。
- 加密支持:启用 channels.matrix.encryption 后,首次连接请求设备验证;需确保 Rust 加密模块可用并完成跨会话验证。
- 多账号:channels.matrix.accounts 支持多账户运行与继承顶层配置;支持 per-account 的 DM/群组策略。
- 访问控制:DM 默认配对;群组默认“白名单+@提及”;支持 per-room 允许列表与 per-sender 限制;自动加入策略可配置。
classDiagram
class MatrixChannel {
+enabled : boolean
+homeserver : string
+accessToken : string
+encryption : boolean
+dm.policy : string
+groupPolicy : string
+accounts : map
}
class CryptoStore {
+per-account : string
+deviceVerification() : void
}
MatrixChannel --> CryptoStore : "加密状态与设备验证"
飞书(Lark)Bot(内置插件)
- 事件订阅:通过 WebSocket 接收 im.message.receive_v1 事件,无需公网 Webhook。
- 应用创建与权限:在飞书开放平台创建企业自建应用,批量导入所需权限,启用 Bot 能力并发布。
- 访问控制:DM 默认配对;群组默认“允许所有人+@提及”;支持按群组 requireMention、sender 允许列表与 groupPolicy 切换。
- 配置优化:typingIndicator 与 resolveSenderNames 可降低 API 调用频率;支持流式卡片输出。
- 多账号与路由:支持多账户与 bindings 路由到不同代理。
flowchart TD
Dev["开发者"] --> App["飞书开放平台创建应用"]
App --> Perm["批量导入权限<br/>启用 Bot"]
Perm --> Sub["事件订阅:im.message.receive_v1"]
Sub --> GW["网关启动Feishu 内置插件"]
GW --> DM["DM:配对/允许列表"]
GW --> Group["群组:@提及/允许列表"]
GW --> Stream["可选:流式卡片输出"]
Nextcloud Talk(插件)
- Bot 模式:通过 OCC 命令安装 Bot,配置共享密钥与 Webhook URL;启用目标房间的 Bot。
- 访问控制:DM 默认配对;群组默认“白名单+@提及”;支持 per-room 设置;DM 无法主动发起,需用户先发消息。
- 能力与限制:支持 DM/房间/反应/Markdown;媒体上传不支持,以 URL 形式发送;Webhook 不区分 DM 与房间,需配置 API 用户/密码以进行房间类型判定。
sequenceDiagram
participant NC as "Nextcloud Talk"
participant OCC as "OCC 命令"
participant GW as "OpenClaw 网关"
OCC->>NC : 安装 Bot共享密钥/URL/特性
NC->>GW : Bot Webhook
GW->>GW : 校验签名/识别 DM/房间
GW-->>NC : 发送文本/URL/反应
依赖关系分析
- 通道与网关:所有通道均通过网关统一接入,遵循一致的会话键命名与路由规则。
- 认证与密钥:通道凭据(如 Teams appId/appPassword/tenantId、Google Service Account、Matrix accessToken、飞书 appId/appSecret、Nextcloud Bot Secret)集中存储于网关配置与 SecretRef。
- 多租户与多账号:通过 accounts/agent bindings 实现按租户/账号/房间/用户的隔离与路由。
- 第三方集成:Teams 可选 Graph API 获取历史与媒体;Matrix 可选 E2EE;Google Chat 可选 Add-on;飞书可选流式卡片输出。
graph LR
Conf["配置与密钥SecretRef/OAuth/API Key"] --> MSTeams
Conf --> GChat
Conf --> Matrix
Conf --> Feishu
Conf --> Nextcloud
MSTeams --> GW["网关"]
GChat --> GW
Matrix --> GW
Feishu --> GW
Nextcloud --> GW
GW --> Agents["代理/会话"]
GW --> Tools["工具/技能"]
性能考虑
- 通道选择与延迟
- Teams:Webhook 延迟敏感,需快速响应避免超时与重复;Graph API 查询可离线补足历史,但增加权限与管理复杂度。
- Google Chat:仅暴露 /googlechat 路径,结合 Tailscale Funnel 提升安全性与稳定性。
- Matrix:E2EE 与加密模块加载可能带来启动开销;建议在具备硬件加速的环境中部署。
- 飞书:可通过 typingIndicator 与 resolveSenderNames 降低 API 调用;流式卡片提升交互体验。
- Nextcloud:Bot Webhook 无媒体上传能力,注意 URL 传输与缓存策略。
- 会话与路由
- DM 与群组会话键隔离,避免上下文污染;合理设置 textChunkLimit 与 chunkMode,减少长文本拆分成本。
- 工具与技能
- 按需启用工具,避免不必要的网络往返;对高延迟外部服务采用异步或缓存策略。
故障排查指南
- Teams
- 图像/文件未显示:检查 RSC 权限与 Graph Application 权限是否授予并获得管理员同意;重新安装应用并完全重启 Teams。
- 无响应:确认 requireMention 配置与 allowlist;检查 webhook 端点可达性与身份验证。
- 版本冲突:更新应用版本后需重新安装并在 Teams 中刷新缓存。
- Google Chat
- 405 方法不允许:确认 channels.googlechat 配置存在且网关已重启;检查插件启用状态。
- Webhook URL:仅暴露 /googlechat 路径,避免将其他端口暴露到公网。
- Matrix
- 加密失败:确保加密模块可用并完成设备验证;更换访问令牌后需重新验证。
- 房间被忽略:检查 groupPolicy 与 per-room allowlist。
- 飞书
- Bot 无响应:确认应用已发布、事件订阅包含 im.message.receive_v1、长连接已启用、权限完整。
- 发送失败:确认具有 im:message:send_as_bot 权限并已发布。
- Nextcloud
- 无法识别 DM/房间:配置 apiUser/apiPassword 以启用房间类型查询;确保 webhookPublicUrl 可达。
结论
OpenClaw 在企业协作渠道方面提供了高度可配置、可扩展且安全可控的集成方案。通过统一网关与标准化通道接入,企业可在 Teams、Google Chat、Matrix、飞书与 Nextcloud Talk 等平台上实现一致的认证、权限、会话与工具体验。建议在生产中优先采用最小权限原则、严格的凭据管理与审计策略,并根据平台能力选择合适的实时/历史能力组合,以平衡性能与合规。
附录
- 企业级 API 使用建议
- 统一使用 SecretRef 存储与轮换凭据;为长生命周期实例优先采用 API Key。
- 对 Teams:在满足需求的前提下尽量使用 RSC 实时监听,必要时叠加 Graph 权限以获取历史与媒体。
- 对 Google Chat:仅暴露必要路径,结合 Tailscale Funnel 提升安全性。
- 对 Matrix:启用 E2EE 并完成设备验证;在受限环境中评估加密模块的可用性。
- 对飞书:启用流式卡片输出提升交互体验;合理关闭 typingIndicator/resolveSenderNames 以降低成本。
- 对 Nextcloud:明确 DM/房间识别策略,避免误判;关注 URL 传输与缓存。
- 安全配置与合规
- 默认 DM 配对策略与白名单;群组默认 requireMention;支持 per-sender 工具策略。
- OAuth 令牌存储与刷新;定期检查与轮换;对 Anthropic 等订阅凭证提供 setup-token 与 API Key 双重路径。
- 遵循漏洞上报流程与信任页面指引。
源码阅读地址
- docs/channels/msteams.md
- docs/channels/googlechat.md
- docs/channels/matrix.md
- docs/channels/feishu.md
- docs/channels/nextcloud-talk.md
- docs/gateway/authentication.md
- docs/concepts/oauth.md
- docs/security/README.md
Google Chat 集成
Google Chat 集成由“插件层”和“核心通道框架”共同构成:
- 插件层:位于 extensions/googlechat,封装 Google Chat 特有逻辑(认证、Webhook、消息处理、动作等)
- 核心通道框架:位于 openclaw/plugin-sdk/googlechat,提供统一的通道抽象、配置模式、安全策略与运行时工具
- 文档与配置:docs/channels/googlechat.md 提供快速上手与配置要点;zod-schema.providers-core.ts 定义配置校验规则
graph TB
subgraph "OpenClaw 核心"
SDK["通道 SDK<br/>googlechat"]
Runtime["运行时环境<br/>core.channel.*"]
Hooks["钩子与自动化<br/>hooks/*"]
end
subgraph "Google Chat 插件"
Plugin["插件入口<br/>channel.ts"]
Auth["认证与令牌<br/>auth.ts"]
API["Chat API 客户端<br/>api.ts"]
Monitor["Webhook 监听器<br/>monitor.ts"]
Access["入站访问控制<br/>monitor-access.ts"]
Accounts["账户解析<br/>accounts.ts"]
Targets["目标解析<br/>targets.ts"]
Actions["消息动作<br/>actions.ts"]
Onboarding["引导配置<br/>onboarding.ts"]
end
SDK --> Plugin
Runtime --> Plugin
Plugin --> Auth
Plugin --> API
Plugin --> Monitor
Monitor --> Access
Plugin --> Accounts
Plugin --> Targets
Plugin --> Actions
Plugin --> Onboarding
Hooks --> Monitor
核心组件
- 插件入口与能力声明:定义通道能力(直聊、群组、线程、媒体、反应)、出站文本分块、线程上下文、目录查询、目标解析与动作适配器
- 认证与令牌:基于 Google Auth Library 的服务账号认证,支持 app-url 与 project-number 两种受众验证
- Chat API 客户端:封装消息发送、更新、删除、附件上传下载、反应 CRUD、DM 查找等
- Webhook 监听器:注册路径、鉴权、入站事件处理、媒体下载、打字指示、回复派发
- 入站访问控制:基于 DM/群组策略、@-提及门禁、配对挑战、命令授权、允许列表
- 账户与目标:服务账号解析、多账户继承、目标规范化、DM 空间解析
- 动作与工具:消息发送、反应管理、反应列表查询
- 引导配置:向导式配置服务账号、受众类型与值、DM 策略与允许列表
架构总览
下图展示从 Google Chat 到 OpenClaw 的完整请求链路与内部处理流程:
sequenceDiagram
participant GC as "Google Chat"
participant GW as "OpenClaw 网关"
participant MON as "Webhook 监听器"
participant ACC as "账户解析"
participant SEC as "访问控制"
participant RT as "运行时"
participant API as "Chat API 客户端"
GC->>GW : "POST /googlechat (Authorization : Bearer)"
GW->>MON : "路由到 googlechat 路径"
MON->>ACC : "解析账户与受众配置"
ACC-->>MON : "账户与受众参数"
MON->>SEC : "应用 DM/群组策略与提及门禁"
SEC-->>MON : "授权结果"
MON->>RT : "构建入站上下文与会话键"
RT->>RT : "记录会话元数据"
RT->>RT : "开始打字指示"
RT->>RT : "派发回复分块/附件"
RT->>API : "发送消息/上传附件/删除/更新"
API-->>RT : "返回消息名/附件令牌"
RT-->>GW : "完成出站交付"
详细组件分析
组件一:认证与受众验证(Google OAuth 2.0 与服务账号)
- 支持的服务账号来源:内联 JSON、文件路径、环境变量、SecretRef(需在运行时解析)
- 受众验证支持两种模式:
- app-url:使用 OAuth2Client 验证 ID Token,校验签发邮箱为 chat@system.gserviceaccount.com 或 Google Workspace Add-ons 服务账号模式
- project-number:拉取证书并使用 verifySignedJwtWithCertsAsync 校验 JWT
- 令牌缓存:按账户维度缓存 GoogleAuth 实例,避免重复初始化;证书每 10 分钟刷新一次
flowchart TD
Start(["收到 Bearer Token"]) --> CheckBearer{"存在 Token?"}
CheckBearer --> |否| Reject["拒绝:缺失 Token"]
CheckBearer --> |是| CheckAudience{"存在 Audience?"}
CheckAudience --> |否| Reject
CheckAudience --> |是| Type{"受众类型"}
Type --> |app-url| VerifyID["OAuth2Client.verifyIdToken(...)"]
VerifyID --> Issuer{"签发邮箱有效?"}
Issuer --> |是| Allow["允许"]
Issuer --> |否| Reject
Type --> |project-number| FetchCerts["拉取证书"]
FetchCerts --> VerifyJWT["verifySignedJwtWithCertsAsync(...)"]
VerifyJWT --> Allow
组件二:Webhook 接收与消息处理
- 注册路径:默认 "/googlechat",可由 webhookPath 或 webhookUrl 决定
- 请求处理:限流、路由到插件、鉴权通过后进入事件处理管线
- 处理流程:
- 解析事件类型(当前仅处理 MESSAGE)
- 应用入站访问控制(DM/群组策略、@-提及门禁、配对挑战)
- 构建入站上下文(会话键、消息体、提及状态、媒体信息)
- 记录会话元数据
- 打字指示(消息模式;reaction 模式需用户 OAuth,服务账号不支持)
- 派发回复(分块文本、附件上传与发送)
flowchart TD
Rcv["接收 Webhook 请求"] --> Auth["受众验证"]
Auth --> |失败| Drop["丢弃请求"]
Auth --> |成功| Parse["解析事件"]
Parse --> Type{"事件类型=MESSAGE?"}
Type --> |否| Drop
Type --> |是| Policy["应用入站访问控制"]
Policy --> |拒绝| Drop
Policy --> |允许| BuildCtx["构建入站上下文"]
BuildCtx --> Typing["发送打字指示消息模式"]
Typing --> Dispatch["派发回复分块/附件"]
Dispatch --> Done["完成"]
组件三:入站访问控制(DM/群组策略与 @-提及门禁)
- DM 策略:支持 pairing、allowlist、open;未知发送者触发配对挑战
- 群组策略:支持 allowlist/open,默认 allowlist;可针对特定空间覆盖
- @-提及门禁:可要求 @-提及才触发命令;支持 botUser 辅助识别机器人身份
- 允许列表:支持用户 ID 与原始邮箱(需启用危险模式),自动警告已废弃的 users/ 形式
- 命令授权:根据作者是否在允许列表决定命令是否生效
flowchart TD
Start(["入站消息"]) --> IsGroup{"群组消息?"}
IsGroup --> |是| GroupPolicy["评估群组策略"]
GroupPolicy --> |拒绝| End["丢弃"]
GroupPolicy --> |允许| GroupAllow["检查群组允许列表"]
GroupAllow --> |拒绝| End
GroupAllow --> Mention["@-提及门禁"]
Mention --> |拒绝| End
Mention --> |允许| DM["评估 DM 策略"]
IsGroup --> |否| DM
DM --> Decision{"决策"}
Decision --> |拒绝| Pairing{"是否配对挑战?"}
Pairing --> |是| Challenge["发送配对提示"] --> End
Pairing --> |否| End
Decision --> |允许| Next["继续处理"]
组件四:出站消息与动作(发送、反应、附件)
- 出站发送:支持文本分块(默认 4000 字符)、线程回复、附件上传与发送
- 动作接口:支持 send、react、reactions;反应支持移除与列出
- 附件处理:远程媒体下载、缓冲区大小限制、multipart 上传
sequenceDiagram
participant RT as "运行时"
participant API as "Chat API 客户端"
RT->>API : "上传附件"
API-->>RT : "返回上传令牌"
RT->>API : "发送消息含附件令牌"
API-->>RT : "返回消息名"
RT->>API : "可选创建/删除/列出反应"
组件五:账户与目标解析(多账户、DM 解析)
- 账户解析:支持默认账户与多账户继承,服务账号来源优先级与错误提示
- 目标解析:规范化 users/spaces 前缀,DM 场景通过 Chat API 查找对应空间
flowchart TD
Acc["解析账户配置"] --> Merge["合并默认账户与账户配置"]
Merge --> Creds{"服务账号来源"}
Creds --> |内联/文件/环境| OK["可用"]
Creds --> |SecretRef| Err["需运行时解析"]
OK --> Target["解析目标"]
Target --> DM{"是否 DM?"}
DM --> |是| Find["查找 DM 空间"]
DM --> |否| Space["使用空间 ID"]
组件六:Gmail Pub/Sub 集成与实时通知
- Gmail Watch 与 Pub/Sub:通过 gogcli 启动 watch,将历史变更推送到订阅端点
- 端点暴露:推荐 Tailscale Funnel 暴露 /gmail-pubsub 路径,配合 OpenClaw 钩子进行消息模板化投递
- 配置要点:项目选择、API 启用、主题创建与 IAM 绑定、订阅创建与推送端点
flowchart TD
Setup["启用 Gmail/Pub/Sub API"] --> Topic["创建主题并绑定发布角色"]
Topic --> Sub["创建订阅并指向推送端点"]
Sub --> Watch["启动 Gmail Watch"]
Watch --> Push["Gmail 推送历史变更"]
Push --> Hook["gog gmail watch serve 接收并转发到 OpenClaw 钩子"]
组件七:配置与引导(多组织支持、域策略)
- 配置项:服务账号(内联/文件/SecretRef)、受众类型与值、Webhook 路径、DM 策略与允许列表、群组策略与覆盖、反应与打字指示、媒体大小限制
- 引导配置:向导式配置服务账号与受众,支持多账户场景下的默认账户继承
- 多组织支持:通过 SecretRef 与 per-account 配置实现不同组织的独立账户
依赖关系分析
- 插件对 SDK 的依赖:通过 openclaw/plugin-sdk/googlechat 提供的工具函数与运行时接口,实现统一的通道行为
- 认证与 API:依赖 google-auth-library 与 Chat API;Webhook 依赖 Node HTTP 服务器路由
- 配置与校验:Zod Schema 定义字段与敏感标记,确保配置一致性与安全性
- 审计与安全:安全审计模块收集通道配置与密钥存储的合规性发现
graph LR
Plugin["googlechat 插件"] --> SDK["通道 SDK"]
Plugin --> AuthLib["google-auth-library"]
Plugin --> API["Chat API"]
Plugin --> Zod["Zod Schema"]
Plugin --> Audit["安全审计"]
性能考虑
- 令牌与证书缓存:减少重复初始化与网络请求
- 媒体下载限流:按最大字节限制读取,避免内存膨胀
- 文本分块:默认 4000 字符,支持换行模式,降低 API 调用次数
- Webhook 并发:内置飞行中请求限流,避免过载
故障排除指南
常见问题与定位步骤:
- 405 Method Not Allowed:确认通道已配置、插件已启用、网关已重启、Webhook 路径正确
- 受众验证失败:核对 audienceType 与 audience 值,确保与 Google Chat 应用配置一致
- 无消息到达:检查 Chat 应用的 Webhook URL 与事件订阅;确认域名暴露方式(Tailscale Funnel/Caddy/Cloudflare Tunnel)
- Mention 门禁导致回复被拒:设置 botUser 与 requireMention 行为;或调整群组策略
- 媒体过大:调整 mediaMaxMb 或优化附件尺寸
源码阅读地址
Matrix 协议集成
OpenClaw 将 Matrix 作为可插拔通道(Channel)实现,核心位于扩展目录中的 Matrix 插件。其关键组成包括:
- 插件入口与注册:负责初始化运行时、确保加密运行时可用、注册通道
- 通道适配器:定义配置模式、安全策略、目录查询、目标解析、动作适配等
- Matrix 客户端封装:统一配置解析、客户端生命周期管理、共享客户端与同步等待
- 配置模式:基于 Zod 的强类型配置校验,支持多账户与继承合并
graph TB
subgraph "OpenClaw 核心"
GW["网关/运行时"]
CFG["配置系统"]
end
subgraph "Matrix 插件"
ENTRY["插件入口<br/>index.ts"]
CH["通道适配器<br/>src/channel.ts"]
ACC["账户解析<br/>src/matrix/accounts.ts"]
CLI["客户端封装<br/>src/matrix/client.ts"]
IDX["导出聚合<br/>src/matrix/index.ts"]
PKG["依赖声明<br/>package.json"]
end
GW --> CH
CFG --> CH
CH --> ACC
CH --> CLI
CH --> IDX
ENTRY --> CH
ENTRY --> IDX
PKG --> ENTRY
核心组件
- 通道元数据与生命周期
- 插件标识、文档路径、排序权重、快速开始支持等由通道元数据定义
- 账号启动序列化互斥,避免并发动态导入竞争条件
- 配置与校验
- 使用 Zod 模式定义通道配置字段,支持多账户、继承合并、嵌套对象深合并
- 支持环境变量回退与本地凭据存储
- 安全与权限
- DM 与房间两类策略:配对(Pairing)、白名单(Allowlist)、开放(Open)、禁用(Disabled)
- 允许列表条目规范化为完整用户 ID,支持名称解析为 ID 的向导逻辑
- 目录与目标解析
- 支持用户与房间的在线/离线目录查询,目标识别与标准化
- 动作与工具门控
- 基于 per-action 的工具门控策略,支持反应、消息、成员信息等操作
- 客户端与同步
- 统一的认证解析、共享客户端生命周期管理、初始同步限制控制
架构总览
下图展示从 OpenClaw 网关到 Matrix homeserver 的关键交互路径,包括认证、消息发送、房间解析与同步等待。
sequenceDiagram
participant GW as "OpenClaw 网关"
participant PL as "Matrix 插件"
participant CL as "Matrix 客户端"
participant HS as "Matrix Homeserver"
GW->>PL : 初始化通道与账户
PL->>PL : 解析配置/凭据/认证
PL->>CL : 创建/获取共享客户端
CL->>HS : 登录/轮询同步
HS-->>CL : 事件流/房间/用户信息
CL-->>PL : 已解析事件/房间ID
PL-->>GW : 上报状态/触发消息处理
GW->>CL : 发送消息/反应/投票/输入状态
CL->>HS : 提交事件
HS-->>CL : 确认/回执
CL-->>PL : 同步完成/可继续拉取
详细组件分析
通道适配器与生命周期
- 账号启动序列化:通过全局互斥锁串行化启动过程,规避动态导入竞态
- 插件注册:在运行时设置矩阵运行时、预热加密运行时、注册通道
- 状态探测:基于解析后的认证信息对 homeserver 进行连通性探测
- 多账户:支持继承顶层配置并逐账户覆盖,账户启用状态与配置完备性独立判断
flowchart TD
S["开始启动"] --> L["获取前序锁/释放上一个锁"]
L --> M["动态导入矩阵监控模块"]
M --> R["返回监控函数并传入运行时参数"]
R --> W["等待共享客户端同步就绪"]
W --> OK["进入消息循环/事件处理"]
OK --> E["停止时清理共享客户端"]
配置与账户解析
- 配置模式:Zod Schema 定义了 homeserver、用户 ID、访问令牌、密码、设备名、初始同步限制、加密开关、线程回复策略、文本分片策略、DM/房间策略、自动加入策略、媒体大小限制、动作门控等
- 账户合并:顶层默认配置与单账户配置进行深合并,保留嵌套对象的增量覆盖
- 配置完备性:当存在 homeserver 且具备访问令牌或密码登录凭据或已存储凭据时,视为已配置
classDiagram
class MatrixConfig {
+string? name
+boolean? enabled
+string? homeserver
+string? userId
+string? accessToken
+string? password
+string? deviceName
+number? initialSyncLimit
+boolean? encryption
+enum groupPolicy
+enum replyToMode
+enum threadReplies
+number textChunkLimit
+enum chunkMode
+number mediaMaxMb
+enum autoJoin
+string[] autoJoinAllowlist
+string[] groupAllowFrom
+object dm
+object groups
+object actions
}
class ResolvedMatrixAccount {
+string accountId
+boolean enabled
+string? name
+boolean configured
+string? homeserver
+string? userId
+MatrixConfig config
}
ResolvedMatrixAccount --> MatrixConfig : "合并后的配置"
客户端与认证
- 认证解析:从配置与环境变量解析 homeserver、用户 ID、访问令牌、设备名、初始同步限制与加密开关
- 共享客户端:提供共享客户端生命周期管理与同步等待接口,支持按账户停止
- 类型约定:认证对象隐含设备 ID(由访问令牌推断),加密存储假设设备 ID(与访问令牌)在重启期间不变
sequenceDiagram
participant C as "调用方"
participant CFG as "配置解析"
participant AUTH as "认证解析"
participant SH as "共享客户端"
participant HS as "Homeserver"
C->>CFG : 解析通道配置
CFG-->>C : 返回解析后的配置
C->>AUTH : 解析认证信息
AUTH-->>C : 返回认证对象
C->>SH : 获取/创建共享客户端
SH->>HS : 登录/同步
HS-->>SH : 返回事件/状态
SH-->>C : 可继续拉取/已就绪
权限与访问控制
- DM 策略
- 默认策略为“配对”,未知发件人需要配对码批准
- “开放”策略需显式允许“*”,否则忽略
- 支持允许列表(完整 Matrix 用户 ID),名称解析仅在唯一精确匹配时生效
- 房间策略
- 默认“允许列表(提及触发)”,可通过顶层默认策略覆盖
- 支持自动加入策略与允许列表,可针对房间设置默认提及要求与用户允许列表
- “禁用”策略可完全关闭房间触发
- 安全告警
- 当房间策略为“开放”时,生成安全告警,建议改为允许列表并限制触发源
flowchart TD
A["收到消息"] --> B{"来源是 DM 吗?"}
B -- 是 --> C{"DM 策略"}
C --> |配对| D["检查是否已批准/显示配对码"]
C --> |允许列表| E["检查是否在允许列表"]
C --> |开放| F["检查是否包含 '*'"]
B -- 否 --> G{"房间策略"}
G --> |允许列表| H["检查是否在房间允许列表/提及触发"]
G --> |开放| I["检查是否允许任意房间提及触发"]
G --> |禁用| J["拒绝"]
端到端加密(E2EE)与信任模型
- 支持项:通过 Rust 加密 SDK 实现,加密模块加载失败时会降级并记录警告
- 存储位置:按账户+访问令牌哈希存储在本地 SQLite 数据库,同步状态与之共存
- 设备验证:首次连接会向其他会话请求验证,需在其他客户端确认以建立密钥共享
- 故障处理:若访问令牌或设备变更,将创建新的存储,需重新验证
flowchart TD
S["启动/连接"] --> L["尝试加载加密模块"]
L --> |成功| OK["启用 E2EE 并自动解密"]
L --> |失败| W["记录警告并禁用 E2EE"]
OK --> V["请求设备验证"]
V --> |验证通过| K["建立密钥共享"]
K --> R["可解密加密房间"]
W --> R
房间管理与事件同步
- 房间解析:支持通过房间 ID 或别名解析房间 ID,用于消息发送与权限判定
- 同步策略:支持初始同步限制,避免一次性拉取过多历史
- 事件处理:通过共享客户端维护同步状态,等待同步完成后继续拉取
sequenceDiagram
participant P as "插件"
participant C as "客户端"
participant S as "同步器"
participant H as "Homeserver"
P->>C : 请求共享客户端
C->>S : 初始化同步上下文
S->>H : 初始同步受限制
H-->>S : 返回事件/快照
S-->>C : 同步就绪
C-->>P : 可继续拉取/处理事件
消息流与线程处理
- 线程回复策略:支持关闭、仅入站、总是三种模式
- 回复元数据:支持关闭、仅首个、全部三种回复模式
- 目标解析:支持房间、别名、用户的标准化输入
flowchart TD
I["收到消息"] --> T{"是否在房间内"}
T -- 否 --> D["直接回复至 DM 目标"]
T -- 是 --> R{"线程回复策略"}
R --> |关闭| N["不在线程内回复"]
R --> |仅入站| B["仅对入站消息保持在线程内回复"]
R --> |总是| A["始终在线程内回复"]
A --> M["构造线程上下文并发送"]
B --> M
N --> M
D --> M
多账户与联邦网络
- 多账户:每个账户作为独立 Matrix 用户运行于任意 homeserver,继承顶层配置并可逐账户覆盖
- 联邦:Matrix 为去中心化协议,各 homeserver 之间通过联邦互通,插件无需额外配置即可接入联邦生态
依赖关系分析
Matrix 插件的关键依赖包括:
- matrix-bot-sdk:Matrix 客户端 SDK,负责与 homeserver 通信
- matrix-sdk-crypto-nodejs:Rust 加密 SDK,提供端到端加密能力
- markdown-it:Markdown 渲染
- music-metadata:媒体元数据解析
- zod:配置模式校验
graph LR
PKG["@openclaw/matrix/package.json"] --> SDK["@vector-im/matrix-bot-sdk"]
PKG --> CRY["@matrix-org/matrix-sdk-crypto-nodejs"]
PKG --> MD["markdown-it"]
PKG --> MM["music-metadata"]
PKG --> ZOD["zod"]
性能考量
- 启动序列化:通过互斥锁串行化启动,避免并发动态导入导致的资源竞争
- 同步限制:通过初始同步限制控制首次拉取的数据量,降低冷启动延迟
- 加密模块:加密模块加载失败会降级,避免阻塞主流程;建议提前准备二进制或允许构建脚本以减少启动时间
- 多账户:账户启动串行化,避免并发模块导入引发的竞态
Microsoft Teams 集成
OpenClaw 将 Teams 集成作为独立插件实现,位于 extensions/msteams 目录,采用“插件化 + 通道适配器”的设计:
- 插件入口:负责注册通道、设置运行时、导出能力接口
- 通道适配器:封装 Teams Bot Framework SDK、消息收发、轮询与状态探测
- 运行时:统一存储与访问插件运行时上下文(日志、文本处理、配置)
- 发送模块:负责消息分片、媒体处理、文件上传与分享、投票卡片发送
- 接收模块:解析入站活动、提及识别、会话引用存储
- 图形 API:基于 Graph 的用户/团队/频道解析与媒体下载
- SDK 封装:加载并配置 Bot Framework SDK 与认证
graph TB
subgraph "插件层"
IDX["插件入口<br/>extensions/msteams/index.ts"]
SRCIDX["内部导出索引<br/>extensions/msteams/src/index.ts"]
end
subgraph "通道适配器"
CH["通道插件定义<br/>extensions/msteams/src/channel.ts"]
MON["Webhook 监听器<br/>extensions/msteams/src/monitor.ts"]
MSG["消息适配器/发送器<br/>extensions/msteams/src/messenger.ts"]
end
subgraph "运行时与工具"
RUN["运行时存储<br/>extensions/msteams/src/runtime.ts"]
TOK["凭据解析<br/>extensions/msteams/src/token.ts"]
SDK["SDK 加载/适配器创建<br/>extensions/msteams/src/sdk.ts"]
ATT["附件工具集<br/>extensions/msteams/src/attachments.ts"]
GR["Graph 工具<br/>extensions/msteams/src/graph.ts"]
end
subgraph "文档与配置"
DOC["配置与能力说明<br/>docs/channels/msteams.md"]
PKG["插件元数据/安装信息<br/>extensions/msteams/package.json"]
end
IDX --> CH
SRCIDX --> MON
SRCIDX --> MSG
CH --> MON
CH --> MSG
MON --> SDK
MSG --> SDK
MON --> TOK
MSG --> TOK
MON --> RUN
MSG --> RUN
CH --> ATT
MSG --> ATT
CH --> GR
MSG --> GR
DOC -.-> CH
PKG -.-> IDX
核心组件
- 插件入口与注册
- 负责设置运行时、注册通道、导出监控与工具函数
- 参考路径:extensions/msteams/index.ts
- 通道插件定义
- 定义通道元数据、能力、配额、目标解析、目录查询、动作处理、状态探测与网关启动
- 参考路径:extensions/msteams/src/channel.ts
- Webhook 监听与认证
- 基于 Bot Framework SDK 创建 CloudAdapter,配置 JWT 授权中间件,监听 /api/messages 或自定义路径
- 参考路径:extensions/msteams/src/monitor.ts
- 消息适配器与发送器
- 渲染回复内容、构建 Activity、处理重试、提及解析、媒体内联/拆分模式、文件上传与分享
- 参考路径:extensions/msteams/src/messenger.ts
- 凭据解析与 SDK 配置
- 解析 appId/appPassword/tenantId,构建认证配置并创建适配器
- 参考路径:extensions/msteams/src/token.ts,extensions/msteams/src/sdk.ts
- 发送模块
- 文本/媒体/投票/卡片发送;文件上传至 SharePoint/OneDrive;生成文件卡片
- 参考路径:extensions/msteams/src/send.ts
- 运行时与工具
- 运行时存储、Graph 查询、附件工具集
- 参考路径:extensions/msteams/src/runtime.ts,extensions/msteams/src/graph.ts,extensions/msteams/src/attachments.ts
架构总览
下图展示从 Teams Webhook 到 OpenClaw 处理再到 Bot Framework SDK 的完整链路,以及文件上传与 Graph 集成的关键节点。
sequenceDiagram
participant Teams as "Microsoft Teams"
participant BF as "Bot Framework SDK"
participant Mon as "Webhook 监听器<br/>monitor.ts"
participant Chan as "通道适配器<br/>channel.ts"
participant Msg as "消息适配器<br/>messenger.ts"
participant Tok as "凭据/令牌<br/>token.ts/sdk.ts"
participant Graph as "Graph API<br/>graph.ts"
Teams->>Mon : "POST /api/messages 或自定义路径"
Mon->>BF : "authorizeJWT + CloudAdapter.process"
BF-->>Mon : "Activity 上下文"
Mon->>Chan : "路由到通道处理器"
Chan->>Tok : "解析凭据/获取令牌"
Chan->>Msg : "渲染回复/构建 Activity"
alt "需要上传文件"
Msg->>Graph : "上传到 SharePoint/OneDrive"
Graph-->>Msg : "返回文件项/分享链接"
end
Msg->>BF : "continueConversation 发送"
BF-->>Teams : "回执/消息/卡片"
详细组件分析
OAuth 与认证流程
- 凭据解析
- 支持配置文件与环境变量两种方式,优先使用配置值
- 参考路径:extensions/msteams/src/token.ts
- SDK 与适配器
- 动态加载 @microsoft/agents-hosting,构建认证配置并创建 CloudAdapter
- 参考路径:extensions/msteams/src/sdk.ts
- Webhook 授权
- Express 中间件 authorizeJWT 对请求进行签名验证
- 参考路径:extensions/msteams/src/monitor.ts
flowchart TD
Start(["开始"]) --> LoadSDK["动态加载 SDK"]
LoadSDK --> BuildAuth["构建认证配置"]
BuildAuth --> CreateAdapter["创建 CloudAdapter"]
CreateAdapter --> JWT["JWT 授权中间件"]
JWT --> Listen["监听 /api/messages 或自定义路径"]
Listen --> End(["结束"])
Webhook 配置与实时消息处理
- 路径与端口
- 默认路径为 /api/messages,可配置自定义路径;同时保留标准路径以兼容测试
- 参考路径:extensions/msteams/src/monitor.ts
- 超时与错误处理
- 设置连接空闲、请求、头部超时;捕获并记录错误
- 参考路径:extensions/msteams/src/monitor.ts
- 入站活动解析
- 提取会话 ID、消息 ID、时间戳、提及标记清理
- 参考路径:extensions/msteams/src/inbound.ts
sequenceDiagram
participant C as "客户端"
participant E as "Express 应用"
participant A as "CloudAdapter"
participant H as "ActivityHandler"
C->>E : "POST /api/messages 或自定义路径"
E->>A : "process(req,res)"
A-->>H : "回调 run(context)"
H-->>E : "响应/继续处理"
团队权限管理与频道路由
- 访问控制
- DM:默认 pairing,支持 allowFrom 白名单;支持名称匹配开关
- 群组:默认 allowlist,支持 teams.allowlist 限定团队/频道;支持 per-team/per-channel 覆盖
- 参考路径:docs/channels/msteams.md
- 目标解析
- 用户:支持 user:ID 或 display name(需 Graph 权限)
- 群组/频道:支持 conversation:ID 或 Team/Channel 名称解析
- 参考路径:extensions/msteams/src/channel.ts
- 目录查询
- 支持允许列表与 live 查询(Graph)
- 参考路径:extensions/msteams/src/channel.ts
flowchart TD
A["输入目标"] --> B{"是否带前缀"}
B --> |user:| C["按 ID 匹配或 Graph 解析"]
B --> |conversation:| D["直接使用群组/频道 ID"]
B --> |无前缀| E["Team/Channel 解析"]
C --> F["输出标准化 ID"]
D --> F
E --> F
消息格式转换与回复样式
- 文本分片
- 基于 Markdown 表格模式与分片模式(长度/换行)进行切分
- 参考路径:extensions/msteams/src/messenger.ts
- 回复样式
- thread(嵌套线程)vs top-level(顶部发布),根据频道 UI 风格选择
- 参考路径:docs/channels/msteams.md
- 提及解析
- 从文本解析 @mention 实体并清理 Teams 特有标签
- 参考路径:extensions/msteams/src/messenger.ts,extensions/msteams/src/inbound.ts
flowchart TD
In["原始文本"] --> TableMode["解析 Markdown 表格模式"]
TableMode --> Chunk["按模式分片"]
Chunk --> Mentions["解析 @mention 实体"]
Mentions --> Out["渲染后的消息数组"]
文件上传与分享(群组/频道)
- 上传策略
- 个人聊天:小图片可内联 base64;大文件或非图片触发 FileConsentCard
- 群组/频道:优先 SharePoint 上传并生成原生文件卡片;未配置 SharePoint 时回退 OneDrive 并发送链接
- 参考路径:extensions/msteams/src/send.ts,extensions/msteams/src/messenger.ts
- Graph 权限
- 读取/写入文件、按用户分享(可选 Chat.Read.All)
- 参考路径:docs/channels/msteams.md,extensions/msteams/src/graph.ts
flowchart TD
Start(["发送文件"]) --> Type{"聊天类型"}
Type --> |个人| P1["小图片: 内联 base64"]
Type --> |个人| P2["大文件/非图片: FileConsentCard"]
Type --> |群组/频道| G1["配置 SharePoint?"]
G1 --> |是| SP["上传 SharePoint + 原生文件卡片"]
G1 --> |否| OD["上传 OneDrive + 链接"]
P1 --> End(["完成"])
P2 --> End
SP --> End
OD --> End
机器人权限与企业合规
- RSC 权限
- 通道读/写、成员/所有者读、设置读、团队成员/设置读
- 群组聊天读
- 参考路径:docs/channels/msteams.md
- Graph 权限
- ChannelMessage.Read.All、Chat.Read.All、Sites.ReadWrite.All、User.Read.All(可选)
- 参考路径:docs/channels/msteams.md
- 合规与审计
- 建议启用 Graph 历史读取以补齐离线消息;严格控制媒体来源与鉴权头域名白名单
- 参考路径:docs/channels/msteams.md
API 使用示例与错误处理
- 发送文本/媒体
- 发送投票(Adaptive Cards)
- 发送任意卡片
- 错误分类与提示
依赖关系分析
- 外部依赖
- @microsoft/agents-hosting:Bot Framework SDK
- express:Webhook 服务器
- 参考路径:extensions/msteams/package.json
- 内部依赖
- 插件入口依赖通道适配器与运行时
- 通道适配器依赖 SDK、凭据、发送器、附件工具、Graph 工具
- 参考路径:extensions/msteams/index.ts,extensions/msteams/src/channel.ts
graph LR
IDX["index.ts"] --> CH["channel.ts"]
IDX --> RT["runtime.ts"]
CH --> SDK["sdk.ts"]
CH --> TOK["token.ts"]
CH --> MSG["messenger.ts"]
CH --> ATT["attachments.ts"]
CH --> GR["graph.ts"]
MON["monitor.ts"] --> SDK
MON --> TOK
MSG --> ATT
MSG --> GR
性能考虑
- 超时与并发
- 合理设置连接空闲、请求、头部超时,避免长耗时导致重复投递与丢包
- 参考路径:extensions/msteams/src/monitor.ts
- 重试策略
- 基于错误分类(节流/瞬时)指数退避重试,限制最大延迟
- 参考路径:extensions/msteams/src/messenger.ts
- 媒体大小与分片
- 默认最大媒体 100MB;文本分片上限 4000 字符;按换行或长度分片
- 参考路径:extensions/msteams/src/messenger.ts,extensions/msteams/src/outbound.ts
- 文件上传
- SharePoint 优先,减少 Bot Framework 附件限制带来的失败率
- 参考路径:extensions/msteams/src/send.ts
Nextcloud Talk 集成
Nextcloud Talk 是一个功能强大的自托管通讯平台,支持企业级的即时消息、语音视频通话和文件共享。本集成文档详细介绍了 Nextcloud Talk 与 OpenClaw 生态系统的双向集成,包括:
- 双向 API 集成:通过 Webhook 和 Bot API 实现消息的双向传输
- WebRTC 语音视频通话:基于 Nextcloud Talk 的实时通信能力
- 文件共享与媒体处理:支持图片、视频、文档等多媒体内容
- 自托管部署:完整的部署配置和反向代理设置
- 安全认证:基于签名验证和访问控制的多层安全机制
- 聊天室管理:房间权限控制、密码保护和隐私设置
- 企业集成:与 Nextcloud 文件系统深度集成,实现统一的身份认证和权限控制
项目结构
Nextcloud Talk 集成采用模块化设计,主要包含以下核心模块:
graph TB
subgraph "Nextcloud Talk 插件"
A[index.ts] --> B[channel.ts]
B --> C[inbound.ts]
B --> D[monitor.ts]
B --> E[send.ts]
B --> F[accounts.ts]
B --> G[config-schema.ts]
B --> H[policy.ts]
end
subgraph "配置管理"
I[src/config/talk.ts]
J[src/gateway/server-methods/talk.ts]
end
subgraph "外部接口"
K[Nextcloud Talk API]
L[Webhook 服务器]
M[Bot 认证系统]
end
A --> K
D --> L
E --> K
F --> M
I --> J
核心组件
1. 插件入口与注册
Nextcloud Talk 插件通过标准的 OpenClaw 插件接口进行注册,提供完整的聊天室集成能力。
2. 通道插件实现
通道插件实现了完整的 Nextcloud Talk 集成,包括:
- 消息发送与接收:支持文本消息、媒体文件和表情符号
- 聊天室管理:房间权限控制和访问管理
- 安全策略:基于允许列表的访问控制
- 会话管理:消息历史记录和状态跟踪
3. 入站消息处理
入站消息处理器负责接收和处理来自 Nextcloud Talk 的消息,包括:
- 消息验证:确保消息来源的合法性
- 访问控制:根据配置的策略决定是否处理消息
- 会话管理:维护用户会话状态
- 路由分发:将消息路由到相应的处理流程
架构概览
Nextcloud Talk 集成采用事件驱动的架构模式,通过 Webhook 接收消息并在内部进行处理。
sequenceDiagram
participant NC as Nextcloud Talk
participant WS as Webhook 服务器
participant IP as 入站处理器
participant RT as 运行时环境
participant GP as 网关处理器
participant OA as OpenClaw 应用
NC->>WS : POST /nextcloud-talk-webhook
WS->>WS : 验证签名和负载
WS->>IP : 转发入站消息
IP->>RT : 处理消息验证
RT->>GP : 分发到网关处理器
GP->>OA : 触发相应处理逻辑
OA-->>WS : 返回处理结果
WS-->>NC : 发送响应
Note over WS,RT : 消息流处理管道
详细组件分析
Webhook 服务器组件
Webhook 服务器是集成的核心组件,负责监听 Nextcloud Talk 的消息推送。
classDiagram
class NextcloudTalkWebhookServer {
+number port
+string host
+string path
+string secret
+createServer() Server
+start() Promise~void~
+stop() void
+validateWebhookHeaders() Headers
+verifyWebhookSignature() boolean
+decodeWebhookCreateMessage() Message
}
class MonitorOptions {
+string accountId
+CoreConfig config
+RuntimeEnv runtime
+AbortSignal abortSignal
+onMessage() Function
+statusSink() Function
}
class WebhookMessage {
+string messageId
+string roomToken
+string roomName
+string senderId
+string senderName
+string text
+string mediaType
+number timestamp
+boolean isGroupChat
}
NextcloudTalkWebhookServer --> MonitorOptions : "使用"
MonitorOptions --> WebhookMessage : "处理"
Webhook 服务器配置
服务器支持灵活的配置选项:
| 配置项 | 默认值 | 描述 |
|---|---|---|
| port | 8788 | 监听端口 |
| host | 0.0.0.0 | 绑定地址 |
| path | /nextcloud-talk-webhook | Webhook 路径 |
| maxBodyBytes | 1MB | 最大请求体大小 |
| bodyTimeoutMs | 30000ms | 请求超时时间 |
消息发送组件
消息发送组件负责向 Nextcloud Talk 发送消息和处理响应。
flowchart TD
A[sendMessageNextcloudTalk] --> B[解析账户配置]
B --> C[标准化房间令牌]
C --> D[转换Markdown表格]
D --> E[生成签名]
E --> F[构建HTTP请求]
F --> G[发送到Nextcloud API]
G --> H{响应状态}
H --> |成功| I[提取消息ID]
H --> |失败| J[抛出错误]
I --> K[记录活动日志]
J --> L[返回错误信息]
K --> M[返回发送结果]
发送流程处理
消息发送过程包含多个验证步骤:
- 账户验证:检查账户配置的完整性和有效性
- 房间令牌标准化:确保房间标识符格式正确
- 内容处理:转换 Markdown 表格格式
- 签名生成:使用 HMAC-SHA256 生成消息签名
- API 调用:通过 OCS API 发送消息
- 响应处理:解析响应并提取消息元数据
安全认证组件
安全认证组件确保只有授权的消息才能被处理。
flowchart TD
A[验证Webhook头部] --> B{检查签名头}
B --> |缺失| C[返回400错误]
B --> |存在| D[验证后端来源]
D --> E{后端允许?}
E --> |否| F[返回401错误]
E --> |是| G[验证消息签名]
G --> H{签名有效?}
H --> |否| I[返回401错误]
H --> |是| J[处理消息]
C --> K[停止处理]
F --> K
I --> K
J --> L[继续处理]
认证流程详解
认证系统采用多层验证机制:
- 头部验证:检查必需的签名头部字段
- 后端验证:确保消息来自配置的 Nextcloud 实例
- 签名验证:使用预共享密钥验证消息完整性
- 重复防护:防止重放攻击
聊天室管理组件
聊天室管理组件提供完整的房间权限控制和访问管理。
classDiagram
class RoomConfig {
+boolean requireMention
+ToolPolicy tools
+string[] skills
+boolean enabled
+string[] allowFrom
+string systemPrompt
}
class GroupAccess {
+boolean allowed
+string matchSource
+string matchKey
}
class AccessDecision {
+string decision
+string reason
+boolean shouldBlockControlCommand
+boolean commandAuthorized
}
RoomConfig --> GroupAccess : "影响"
GroupAccess --> AccessDecision : "决定"
房间策略配置
房间支持多种配置选项:
| 配置项 | 类型 | 描述 | 默认值 |
|---|---|---|---|
| requireMention | boolean | 是否需要提及 | true |
| tools | ToolPolicy | 工具策略 | 无限制 |
| skills | string[] | 技能限制 | 无限制 |
| enabled | boolean | 启用状态 | true |
| allowFrom | string[] | 允许来源列表 | 空数组 |
| systemPrompt | string | 系统提示词 | 无 |
依赖关系分析
Nextcloud Talk 集成的依赖关系呈现清晰的层次结构:
graph TB
subgraph "外部依赖"
A[Nextcloud Talk API]
B[Node.js HTTP 模块]
C[OpenClaw SDK]
end
subgraph "内部模块"
D[插件入口]
E[通道实现]
F[消息处理]
G[配置管理]
H[安全认证]
end
subgraph "核心服务"
I[Webhook 服务器]
J[消息发送器]
K[账户解析器]
L[策略评估器]
end
A --> I
B --> I
C --> D
D --> E
E --> F
E --> G
E --> H
F --> I
F --> J
G --> K
H --> L
关键依赖关系
- API 依赖:直接依赖 Nextcloud Talk 的 OCS API
- 运行时依赖:依赖 OpenClaw 的运行时环境和工具函数
- 配置依赖:依赖标准的 OpenClaw 配置系统
- 安全依赖:依赖 Node.js 的加密模块进行签名验证
性能考虑
1. Webhook 服务器优化
- 连接池管理:合理配置并发连接数
- 内存使用:限制请求体大小防止内存溢出
- 超时设置:设置合理的请求超时时间
- 健康检查:提供 /healthz 端点监控服务状态
2. 消息处理优化
- 批量处理:支持消息批处理提高吞吐量
- 缓存机制:缓存房间信息减少查询开销
- 异步处理:使用异步处理避免阻塞
- 错误恢复:实现自动重试机制
3. 安全性能优化
- 签名验证:使用高效的 HMAC 算法
- 连接复用:复用 HTTP 连接减少开销
- 资源清理:及时清理临时资源防止泄漏