飞书
用一个飞书应用接入登录、通讯录同步、通知、知识同步和 Agent 私聊
飞书集成是一个内置单例应用:App ID 与 App Secret 由管理员保存一次,登录、通讯录同步、通知、知识同步和 Agent 会话共享同一套凭据。所有功能都必须显式开启;启用集成本身不等于开启任何功能,飞书登录尤其如此。Agent 会话只负责接收私聊消息和投递回复,执行由 Clouisle 的 Agent 运行体系完成。
配置入口
打开站点设置 > 集成 > 飞书(/site-settings/integrations/feishu)。页面按标签页组织:
| 标签页 | 内容 | 谁能操作 |
|---|---|---|
| 集成配置 | App ID/App Secret、功能开关(通讯录同步、用户登录、通知、智能体对话)、登录按钮文案 | 拥有服务设置权限的管理员;登录开关还需要登录源权限 |
| 通讯录同步 | 浏览部门、保存同步范围、手动同步 | 拥有服务设置权限的管理员 |
| 消息通知 | 检查连接、选择已绑定飞书的用户并发送测试消息 | 同上 |
| 智能体对话 | 事件接收方式(HTTP 回调/长连接)、回调密钥、接收状态 | 同上 |
| 飞书知识同步 | Wiki 空间来源、目标知识库、同步间隔与手动同步 | 仅超级管理员 |
App Secret、Verification Token 和 Encrypt Key 都加密保存在服务端,页面只显示是否已配置,不回显明文;密钥输入框留空表示保留已保存的值。功能开关在集成本身启用之前不可操作。
权限配置
在飞书开放平台开启机器人能力,并授予下列应用身份权限。
一键导入(推荐)
逐条勾选容易漏,尤其是通讯录与知识同步那部分。飞书开放平台支持批量导入,可以直接粘贴一份 JSON:
- 打开飞书开放平台 → 你的应用 → 权限管理 → 批量处理 → 导入。
- 粘贴下面的 JSON,点击下一步,确认新增权限。导入只新增权限,不影响已申请或已开通的权限。
- 回到版本管理与发布,创建并发布新版本,完成管理员审批。
{
"scopes": {
"tenant": [
"bitable:app",
"bitable:app:readonly",
"contact:contact.base:readonly",
"contact:department.base:readonly",
"contact:department.organize:readonly",
"contact:user.base:readonly",
"contact:user.email:readonly",
"contact:user.employee_id:readonly",
"docx:document:readonly",
"im:message.group_at_msg.include_bot:readonly",
"im:message.p2p_msg:readonly",
"im:message:readonly",
"im:message:send_as_bot",
"im:resource",
"tenant:tenant:readonly",
"wiki:space:retrieve",
"wiki:wiki",
"wiki:wiki:readonly"
],
"user": []
}
}
这份清单覆盖登录、通讯录同步、通知、Agent 会话与知识同步所需权限;只启用其中一部分功能时,多出的权限不会被使用,也不会产生额外数据访问。不打算同步飞书知识库的话,可以删掉 bitable:*、docx:document:readonly、wiki:*,保存时不会被拒绝。
权限范围与权限声明是两件事
JSON 导入的是权限声明。部门树能打开但同步失败,通常是成员不在应用的通讯录权限范围内;知识同步读不到内容,通常是应用没有被授予对应空间或文档的资源访问权限。两者都要在飞书后台单独配置。
各权限的用途
导入上面 JSON 后,可用下表核对。下表只列 Agent 会话相关的几项;登录、通讯录与知识同步的权限要求写在各自章节。
| 权限 / 事件 | 用途 |
|---|---|
im:message.p2p_msg:readonly | 接收用户发给机器人的单聊消息;群聊 @ 权限不能替代 |
im:message:send_as_bot | 以应用身份发送回复 |
im:resource | 读取消息附件、上传生成的图片/视频/文件;仅发送文件时也可用 im:resource:upload |
contact:user.base:readonly | 查询用户基本信息,用于身份映射 |
im.message.receive_v1 | 接收消息事件;回调模式与长连接模式都必须订阅 |
新增权限后必须发布新的应用版本并完成所需的管理员审批;仅勾选权限不代表已生效。使用飞书的消息查询接口查看原始消息时还需要 im:message:readonly;下载资源走消息资源接口。缺少上传权限时文字回复可能正常,但产物无法发送。
登录
飞书网页登录是用户登录功能的显式选项,复用通讯录同步的应用凭据,不需要第二个身份源。
- 在飞书开放平台为应用登记重定向地址:
https://<backend-host>/api/v1/sso/callback/feishu。飞书子页会显示本站的精确值,可直接复制。 - 确认权限配置已导入并发布;登录需要的
contact:user.base:readonly、contact:user.email:readonly与contact:user.employee_id:readonly都在其中。 - 在站点设置 > 安全开启全局 SSO;再在飞书子页打开用户登录,可选设置按钮文案。
- 登录页只有在全局 SSO 已开启、飞书集成已启用且用户登录已打开时才显示飞书按钮。
外部身份以飞书账号的 union_id 为主、缺失时使用 open_id,因此在同一开发者账号下更换应用不会破坏已有连接。没有邮箱的飞书账号会自动生成占位地址(形如 feishu-<哈希>@accounts.clouisle.example);生成该地址需要 contact:user.employee_id:readonly,缺少该权限时这类账号的首次登录会被拒绝,而不是创建一个占位身份。
绑定已有账号
已登录的 Clouisle 用户可以在头像菜单 > 个人资料 > 账户安全 > 已连接账户选择关联飞书。关联会保留当前账号、密码、邮箱、权限与登录会话,不创建新账号,也不按邮箱自动匹配。
- 关联入口只在全局 SSO 与飞书登录都已开启时出现。
- 已绑定到其他账号的飞书身份会被拒绝,不会转移归属。
- 通过此方式关联的账号会被通讯录同步排除:后续同步不会创建重复账号、覆盖本地资料或添加部门团队关系。
通讯录同步
通讯录同步是手动、单向的:Clouisle 从选定飞书部门创建或更新本地账号与团队,不回写飞书,也不会因为飞书成员离职或停用而停用本地账号。
- 按权限配置导入权限并发布应用版本;通讯录同步需要的
contact:*与tenant:tenant:readonly已包含在其中。 - 在飞书后台配置通讯录权限范围,范围必须同时包含要同步的部门和部门成员。
- 在飞书子页启用集成、打开通讯录同步并保存 App ID/Secret。
- 浏览部门树,勾选部门并保存范围。顶层公司节点代表根部门(ID
0),选中即整个组织;选中其他部门只包含该部门及其下级。树中只显示应用可见的部门。 - 选择同步所选部门成员。结果会报告新增、更新、跳过的账号数,以及新建团队数。
新账号没有本地密码,使用配置的默认角色和默认团队关系;飞书未返回邮箱时使用自动生成的占位地址。.example 是保留域名,永不可投递。重复同步按已保存的飞书用户 ID 匹配并更新,不会按邮箱自动合并;邮箱冲突的账号会被跳过。每个选中的飞书部门对应一个 Clouisle 团队,成员可同时属于多个部门团队。
应用权限与数据范围是两件事
只勾选通讯录读取权限还不够。部门树能打开、同步却失败,通常是个别成员不在应用的通讯录权限范围内。历史占位邮箱会一次性改写为 .example,升级时自动完成,无需手工修数据。
知识同步
飞书知识同步把 Wiki 空间内容导入 Clouisle 知识库。它使用应用自己的身份读取内容,不使用登录用户的身份,并且仅超级管理员可见、可操作;普通集成设置权限不会看到该标签页。
- 保存并启用飞书应用,并按权限配置导入权限。已包含 Wiki、Docx 与多维表格读取;如需下载图片或附件,还要在飞书后台补
drive:drive.metadata:readonly(文件元数据)与docs:document.media:download(媒体下载)。 - 除权限声明外,还必须为应用授予所选空间和文档的资源访问权限;只有权限声明没有资源权限仍会读取失败。
- 在目标团队创建知识库。添加来源时选择可见的 Wiki 空间与目标知识库,并设置同步间隔:
1–43200分钟,默认60。未显式选择 embedding 模型时使用系统默认模型,该模型必须存在且已启用。 - 启用自动同步或选择立即同步。自动同步按设置的间隔在平台后台运行,无需额外操作。页面展示每个来源的状态、上次同步时间、结果计数、错误和转换警告。
| 来源类型 | 导入行为 |
|---|---|
新版文档 docx | 富文本、标题、列表、代码、引用、待办、表格;认证下载图片并提取内嵌附件文本 |
旧版文档 doc | 先导出为 DOCX,再走既有文档处理流程 |
表格 sheet | 读取每个网格工作表的行列区间,保留显示值与源公式 |
多维表格 bitable | 读取可访问的表、字段定义和分页记录;可解析的附件文本/图片一并包含 |
云空间文件 file | 下载并解析 PDF、DOC/DOCX、TXT、MD/Markdown、HTML/HTM、CSV、XLS/XLSX、JSON、PPTX |
思维笔记 mindnote | 不支持;飞书公开接口明确排除,需先导出为受支持文件 |
权限边界: 导入的是团队知识,不是飞书用户权限的镜像。导入后由本地团队/知识库权限控制读取、检索、引用和共享;确认目标受众后再启用同步。撤权只会在后续同步检测到时才在本地生效。
导入的文档在本地只读:不能编辑分块、删除或重新处理。每次运行先扫描整个空间再移除缺失文档;内容变化会在成功处理后替换本地索引并保留文档 ID,未变化则不重复嵌入。下载失败、扫描不完整或处理失败会保留上一版本;确认访问被拒绝时才删除对应本地副本。停用来源会停止同步但保留已导入文档;删除来源会移除其导入的文档与索引,不影响其他本地上传。
不支持的来源类型和文件格式会跳过而不是失败,并在结果中记为跳过/不支持;没有真实失败的运行仍算成功,并清除上次错误。
通知
飞书通知是独立于 Agent 会话的通知功能,需要:
- 飞书集成已启用,且通知已打开;
- 已保存 App ID 与 App Secret;
- 接收人拥有通过通讯录同步建立的飞书身份绑定;仅网页登录或手动关联不会创建该绑定。
满足后,手动通知和自动通知都可以把飞书选为外部渠道。飞书以私聊消息发送 Markdown 渲染的标题、正文与站内链接。未绑定或已停用的接收人不会收到消息;部分成功会显示成功数与总数,全部失败时按通知的重试策略重试。投递结果在通知详情中查看,与消息集成的投递记录是两套数据,见通知与外部渠道。
管理员可在消息通知标签页检查连接、搜索已绑定飞书的启用用户并发送测试消息。
Agent 会话
飞书 Agent 会话让用户私聊机器人,与自己选择的已发布 Agent 对话。消息进入 Clouisle 的 Agent 运行体系;飞书里没有第二套 Agent 循环。仅接受私聊(p2p)文本、文件、图片和富文本(post);群聊消息和机器人自己发送的消息会被忽略。
事件接收方式
订阅事件前先按权限配置一次性导入权限并发布版本;下面只讲接收方式本身。
两种方式都在飞书开放平台一侧完成订阅配置:
| 方式 | 配置 | 特点 |
|---|---|---|
| HTTP 回调 | 在飞书开放平台的事件与回调中登记本站显示的事件回调地址(https://<backend-host>/api/v1/integrations/feishu/callback),并保存 Verification Token 与 Encrypt Key | 需要公网可达;支持 URL 校验挑战与加密事件;平台会校验请求签名与时间戳,拒绝明显过期(超过 300 秒)的请求;请求体上限 64 KiB |
| 长连接(WebSocket) | 在飞书开放平台的事件与回调中选择长连接接收事件,订阅 im.message.receive_v1;在 Clouisle 侧选择长连接并保存应用凭据 | 无需公网回调地址、Verification Token 或 Encrypt Key;连接由平台后台自动维护,无需额外服务或命令 |
长连接由平台后台自动维护,保存接收方式后立即生效。关闭智能体对话或切回 HTTP 回调会停止接收;更换应用凭据后会自动重连。
Connected ≠ 消息权限就绪
长连接状态显示已连接只表示连接建立成功,不代表私聊权限或事件订阅已经生效。如果没有入站回执,检查已发布应用版本是否授予 im:message.p2p_msg:readonly,以及是否订阅了 im.message.receive_v1 并选择长连接投递。配置生效后发送新的私聊消息;此前未接收的消息不保证重放。
身份、个人开关与 Agent 选择
入站消息在读取发送者、Agent 或回执状态之前先完成身份校验;重复的消息会被去重。消息必须绑定到一个已映射且启用的 Clouisle 用户,以及该用户选择的、有权限使用的已发布 Agent。没有选择时,机器人返回设置/命令指引,不会创建 Agent 运行。
用户在个人设置 > 飞书中保存回复用的 Agent 并打开启用智能体对话:
- 共享通道可用时个人开关才能打开;新用户默认关闭。
- 打开开关要求通道可用、已绑定飞书身份,并已保存一个有权访问的 Agent。
- 关闭只暂停新消息接收、排队处理和未发送回复,不删除选择、历史或待处理状态;已开始的工作可能完成。重新打开后继续处理。
- 个人设置与
/use共用同一份偏好;变更只影响之后的消息。 /use不能绕过已关闭的个人开关;必须先在个人设置中重新启用。
回复、卡片、附件与产物
最终回复以飞书交互卡片发送,正文是一个 Markdown 元素。长文本会按飞书限制分片(单条上限 3500 字符),不会截断多字节字符。
| 类型 | 投递方式 | 上限 |
|---|---|---|
| 图片(JPEG、PNG、WEBP、GIF、BMP、ICO、TIFF、HEIC) | 原生图片消息 | 10 MiB |
| MP4 视频 | 原生视频消息 | 30 MiB |
| 其他文件 | 文件消息 | 30 MiB |
生成产物只投递本次运行最终结果中、作用域正好是该会话与该 Agent 团队的产物。发送时接收人仍须拥有该会话,Agent 仍须有授权,否则不会上传产物。
用户发送的附件通过飞书的消息资源接口下载,保存为会话私有的文件,并挂到当前的聊天请求上。所选 Agent 必须开启附件;文件数量、大小与扩展名限制仍然生效。下载或校验失败会返回明确回复,不会静默丢弃。附件不能回答待处理的结构化提问。
命令
| 命令 | 中文别名 | 行为 |
|---|---|---|
/agents | /智能体 | 列出当前用户可访问的已发布 Agent |
/use <编号或 UUID> | /使用 <编号或 UUID> | 切换回复用的 Agent,等同修改个人设置 |
/new | /新对话 | 在当前任务完成后开始新会话 |
/status | /状态 | 查看当前运行状态 |
/stop | /停止 | 停止当前 Agent 的进行中运行 |
/help | /帮助 | 列出可用命令 |
普通文本会在 Agent 等待用户回答时作为答案恢复该运行。命令优先于排队消息;/new 在当前任务未结束时不会立即重置,需等待或先停止。切换 Agent 不会重路由已经接受的消息。
常见错误与排障
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 长连接显示已连接,但机器人没有回执 | 私聊权限或事件订阅未生效,或订阅了旧应用版本 | 检查 im:message.p2p_msg:readonly 与 im.message.receive_v1,发布新版本并完成审批,再发送新消息 |
| 长连接状态停在等待 / 重连 / 异常 | 应用凭据未保存、网络不通或飞书侧连接失败 | 重新保存 App ID/Secret 后重试;持续异常时检查集成页的连接状态 |
| HTTP 回调被拒绝(403) | 时间戳超出 300 秒、签名不匹配、请求体超过 64 KiB、加密密钥不一致,或当前选择的是长连接 | 校准服务器时间,核对 Verification Token/Encrypt Key 与飞书配置,确认接收方式与飞书侧一致 |
| 机器人只返回设置指引 | 用户未绑定飞书身份、未选择 Agent 或个人开关关闭 | 完成通讯录同步/登录绑定,在个人设置中选择 Agent 并启用 |
| 文字正常、文件/产物失败 | 缺少 im:resource 上传权限,或产物不属于本次运行的最终结果、团队授权已变化 | 补授上传权限并发布;核对产物所属会话与团队授权 |
飞书返回 234001 Invalid request param | 上传或消息参数被拒,例如文件名、类型或大小不符合要求 | 查看投递记录的原始错误,按图片 10 MiB、文件/视频 30 MiB 限制处理 |
通讯录同步报 41050 或 40004 | 成员/部门不在应用通讯录权限范围 | 在飞书开放平台扩大通讯录权限范围后重试 |
| 提示「已保存的飞书应用密钥无法解密」 | 服务端加密密钥发生变化 | 重新保存 App Secret |
| 提示飞书通知未开启或应用凭据缺失 | 通知功能未打开,或 App ID/Secret 缺失 | 在集成配置打开通知并保存 App ID/Secret |
相关文档
这篇文章对你有帮助吗?