Skip to main content

飞书知识库与云文档导入AIS教程

本文介绍如何将飞书中的知识库、云空间、在线文档、电子表格和多维表格接入独立部署的 TorchV AIS 知识库。

本文面向以下场景:

  • 将飞书知识库按原目录结构迁移或同步到 AIS;
  • 将飞书云空间中的 Word、Excel、PDF、PPT 等普通文件导入 AIS;
  • 将飞书在线文档导出为 DOCX,或转换为 Markdown 后导入 AIS;
  • 将飞书电子表格导出为 XLSX,或按工作表转换为结构化文本;
  • 将飞书多维表格按数据表、字段和记录加工成适合检索、问答和 Agent 使用的知识;
  • 建立每日增量同步、权限映射、失败重试和审计机制。

本教程以飞书企业自建应用和服务端 OpenAPI 为基础。示例中的 App ID、App Secret、空间ID和文档Token均使用占位符,不要把真实密钥写入代码仓库或教程文件。

一、整体架构

image-20260824112848221

飞书知识库和云空间不是两套完全独立的正文系统:

  • 知识库负责组织知识空间和节点目录;
  • 知识库节点会指向真实的文档、电子表格、多维表格或文件;
  • 云空间负责文件夹、普通文件和各类云文档资源的存储管理;
  • 获取正文时,必须根据真实资源类型调用对应接口。

二、内容类型与AIS接入方式

飞书资源常见类型推荐接入方式AIS中的形态
知识库wiki节点遍历节点,解析真实资源类型AIS目录结构
普通文件file直接下载原文件DOCX、PDF、XLSX、PPTX等
新版在线文档docx快速方案导出DOCX;长期方案读取Block转MarkdownDOCX或Markdown
旧版在线文档doc使用导出任务导出DOCX/PDFDOCX或PDF
电子表格sheet导出XLSX;重要表格可附加Markdown摘要XLSX+Markdown
多维表格bitable读取数据表、字段、记录并生成结构化Markdown按表或按记录生成Markdown
文件夹folder递归遍历并保留路径AIS目录
快捷方式shortcut解析目标资源后去重不单独重复导入

为什么多维表格不应只导出为Excel

Excel适合保留原始数据,但对于问答和Agent执行,下面这种结构更容易被检索和理解:

# 客户:XXXXX联合银行

- 客户编号:C202608001
- 行业:银行
- 项目阶段:概要设计
- 负责人:卢向东
- 当前风险:部署准入尚未确定
- 下次行动:组织技术架构评审会议
- 最后更新时间:2026-08-24 15:30:00
- 飞书来源:<原记录链接>

因此,生产方案推荐“原文件+结构化知识”并存。

三、准备条件

1. 创建飞书企业自建应用

进入飞书开放平台,创建企业自建应用,记录:

  • App ID;
  • App Secret。

根据需要申请只读权限。常见权限包括:

  • 知识库只读:wiki:wiki:readonly
  • 云空间只读:drive:drive:readonly
  • 新版文档只读:docx:document:readonly
  • 电子表格只读;
  • 多维表格只读:bitable:app:readonly

飞书管理后台实际展示的权限名称可能是中文,应以开放平台当前权限页面和接口要求为准,只申请本项目需要的最小只读权限。

完成权限申请后:

  1. 创建应用版本;
  2. 提交发布;
  3. 由企业管理员审批;
  4. 确认应用已在目标企业生效。

2. 给应用授予文档访问权限

仅开通API权限,不代表应用自动拥有企业内所有文档的访问权。还需要把应用加入目标资源的协作范围。

常见做法:

  • 知识库:在知识空间设置中,将应用或包含应用机器人的群组加入知识库成员或管理员;
  • 云空间文件夹:将目标文件夹分享给应用可访问的协作对象;
  • 在线文档、电子表格和多维表格:在“添加文档应用”中加入该企业自建应用;
  • 生产环境只授权需要同步的知识空间或根文件夹,不要默认开放全部企业文档。

3. 本地目录

mkdir -p /Users/lu/Documents/Codex/feishu-ais-sync/{staging,state,logs}
cd /Users/lu/Documents/Codex/feishu-ais-sync

本教程使用以下变量:

export FEISHU_BASE_URL="https://open.feishu.cn/open-apis"
export FEISHU_APP_ID="<飞书App ID>"
export FEISHU_APP_SECRET="<飞书App Secret>"

export FEISHU_SYNC_DIR="/Users/lu/Documents/Codex/feishu-ais-sync"
export AIS_KB_BIN="/Users/lu/Documents/Codex/.agents/bin/ais-kb.sh"
export AIS_TARGET_PATH="/卢向东的个人知识库/飞书知识导入目录"

生产环境应通过密钥管理服务、容器Secret或系统钥匙串注入App Secret,不要提交到Git。

检查基础工具:

curl --version
jq --version
file --version

四、获取飞书访问凭证

企业自建应用通常使用 tenant_access_token 代表应用访问本企业已授权的数据。

TOKEN_RESPONSE="$(curl -sS \
-X POST "$FEISHU_BASE_URL/auth/v3/tenant_access_token/internal" \
-H "Content-Type: application/json; charset=utf-8" \
-d "$(jq -n \
--arg app_id "$FEISHU_APP_ID" \
--arg app_secret "$FEISHU_APP_SECRET" \
'{app_id:$app_id, app_secret:$app_secret}')")"

printf '%s' "$TOKEN_RESPONSE" | jq -e '.code == 0' >/dev/null
export FEISHU_ACCESS_TOKEN="$(printf '%s' "$TOKEN_RESPONSE" | jq -r '.tenant_access_token')"

验证Token不为空,但不要打印完整Token:

test -n "$FEISHU_ACCESS_TOKEN" && echo "飞书访问凭证获取成功"

访问凭证会过期。生产程序应缓存Token,并根据接口返回的有效期提前刷新,不能每处理一个文件都重新申请。

五、导入飞书知识库

1. 获取知识空间列表

curl -sS -G "$FEISHU_BASE_URL/wiki/v2/spaces" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "page_size=50" \
| tee "$FEISHU_SYNC_DIR/state/wiki-spaces.json" \
| jq .

从真实返回中找到目标 space_id

export FEISHU_WIKI_SPACE_ID="<目标知识空间space_id>"

如果返回 has_more=true,使用 page_token 继续分页,直到全部读取完成。不要默认选择列表中的第一个空间。

2. 获取知识库根节点

curl -sS -G \
"$FEISHU_BASE_URL/wiki/v2/spaces/$FEISHU_WIKI_SPACE_ID/nodes" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "page_size=50" \
| tee "$FEISHU_SYNC_DIR/state/wiki-root-nodes.json" \
| jq .

3. 获取某个节点的子节点

export FEISHU_PARENT_NODE_TOKEN="<父节点node_token>"

curl -sS -G \
"$FEISHU_BASE_URL/wiki/v2/spaces/$FEISHU_WIKI_SPACE_ID/nodes" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "parent_node_token=$FEISHU_PARENT_NODE_TOKEN" \
--data-urlencode "page_size=50" \
| jq .

生产程序需要完成:

  • 所有分页;
  • 有界递归;
  • 节点去重;
  • 路径保存;
  • 最大深度和最大节点数保护。

4. 解析知识库节点的真实资源

export FEISHU_NODE_TOKEN="<知识库node_token>"

curl -sS -G "$FEISHU_BASE_URL/wiki/v2/spaces/get_node" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "token=$FEISHU_NODE_TOKEN" \
| tee "$FEISHU_SYNC_DIR/state/wiki-node.json" \
| jq .

重点保存:

  • node_token:知识库节点ID;
  • obj_token:真实文档或表格Token;
  • obj_type:真实资源类型;
  • title:节点标题;
  • parent_node_token:父节点;
  • has_child:是否包含子节点。

后续应按 obj_type 分流:

doc/docx  → 在线文档
sheet → 电子表格
bitable → 多维表格
file → 普通文件

不要把知识库的 node_token 直接当作在线文档的 document_id

六、导入飞书云空间

1. 确定目标文件夹Token

飞书文件夹链接通常类似:

https://example.feishu.cn/drive/folder/<folder_token>

应通过链接或API返回取得真实 folder_token,不要猜测。

export FEISHU_FOLDER_TOKEN="<目标文件夹folder_token>"

2. 列出文件夹内容

curl -sS -G "$FEISHU_BASE_URL/drive/v1/files" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "folder_token=$FEISHU_FOLDER_TOKEN" \
--data-urlencode "page_size=50" \
| tee "$FEISHU_SYNC_DIR/state/drive-files.json" \
| jq .

重点读取:

  • token:资源Token;
  • name:文件或文档名称;
  • typefilefolderdocxsheetbitable等;
  • parent_token:父文件夹;
  • url:飞书原始链接;
  • shortcut_info:快捷方式指向的真实资源。

next_page_tokenhas_more 时继续分页。

3. 下载普通文件

只有 type=file 的普通二进制文件使用直接下载接口:

export FEISHU_FILE_TOKEN="<普通文件file_token>"
export LOCAL_FILE="$FEISHU_SYNC_DIR/staging/文件名.pdf"

curl -fL \
"$FEISHU_BASE_URL/drive/v1/files/$FEISHU_FILE_TOKEN/download" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
-o "$LOCAL_FILE"

检查结果:

test -s "$LOCAL_FILE"
file "$LOCAL_FILE"
shasum -a 256 "$LOCAL_FILE"

在线文档、电子表格和多维表格不能当作普通二进制文件下载,应使用后续章节的读取或导出流程。

七、导入飞书在线文档

在线文档有两种主要策略。

策略A:导出为DOCX

适合快速上线和保留文档版式。

1. 创建导出任务

export FEISHU_DOC_TOKEN="<obj_token或document_id>"

EXPORT_RESPONSE="$(curl -sS \
-X POST "$FEISHU_BASE_URL/drive/v1/export_tasks" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d "$(jq -n \
--arg token "$FEISHU_DOC_TOKEN" \
'{file_extension:"docx", token:$token, type:"docx"}')")"

printf '%s' "$EXPORT_RESPONSE" | jq .
export FEISHU_EXPORT_TICKET="$(printf '%s' "$EXPORT_RESPONSE" | jq -r '.data.ticket')"

旧版文档的 type 可能是 doc,新版文档通常是 docx。必须使用节点或文件元数据返回的真实类型,不能固定写死。

2. 查询导出任务

curl -sS -G \
"$FEISHU_BASE_URL/drive/v1/export_tasks/$FEISHU_EXPORT_TICKET" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "token=$FEISHU_DOC_TOKEN" \
| tee "$FEISHU_SYNC_DIR/state/export-result.json" \
| jq .

data.result.job_status=0 时,保存返回的导出产物 file_token。如果尚未完成,应采用有上限的退避轮询,不要无限循环。

3. 下载导出结果

export FEISHU_EXPORT_FILE_TOKEN="<导出结果file_token>"

curl -fL \
"$FEISHU_BASE_URL/drive/v1/export_tasks/file/$FEISHU_EXPORT_FILE_TOKEN/download" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
-o "$FEISHU_SYNC_DIR/staging/文档名称.docx"

飞书导出产物是临时文件,任务成功后应及时下载。

策略B:读取正文并生成Markdown

适合长期同步、精细切分、保留标题层级以及让Agent引用具体章节。

1. 获取纯文本

export FEISHU_DOCUMENT_ID="<新版文档document_id>"

curl -sS \
"$FEISHU_BASE_URL/docx/v1/documents/$FEISHU_DOCUMENT_ID/raw_content" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
| tee "$FEISHU_SYNC_DIR/state/doc-raw-content.json" \
| jq .

纯文本适合验证和快速接入,但会损失标题、表格、图片、附件和富文本结构。

2. 获取文档Block

curl -sS -G \
"$FEISHU_BASE_URL/docx/v1/documents/$FEISHU_DOCUMENT_ID/blocks" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "page_size=100" \
| tee "$FEISHU_SYNC_DIR/state/doc-blocks.json" \
| jq .

生产转换器应将Block映射为Markdown:

飞书BlockMarkdown
标题1~9##########
正文普通段落
有序/无序列表Markdown列表
代码块围栏代码块
引用> 引用
表格Markdown表格或HTML表格
图片下载资源后使用相对链接
附件下载附件,并在正文保留文件链接

长期方案建议同时保存原飞书链接、文档版本号和更新时间。

八、导入飞书电子表格

策略A:导出为XLSX

创建导出任务:

export FEISHU_SPREADSHEET_TOKEN="<电子表格spreadsheet_token>"

curl -sS \
-X POST "$FEISHU_BASE_URL/drive/v1/export_tasks" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d "$(jq -n \
--arg token "$FEISHU_SPREADSHEET_TOKEN" \
'{file_extension:"xlsx", token:$token, type:"sheet"}')" \
| jq .

然后沿用“查询导出任务结果 → 下载导出文件”的流程。

如果只导出某个工作表为CSV,需要传入对应的 sub_id。缺少 sub_id 时,CSV导出可能返回参数错误。

策略B:读取工作表并生成结构化文本

1. 获取工作表列表

curl -sS \
"$FEISHU_BASE_URL/sheets/v3/spreadsheets/$FEISHU_SPREADSHEET_TOKEN/sheets/query" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
| tee "$FEISHU_SYNC_DIR/state/sheets.json" \
| jq .

保存每个工作表的:

  • sheet_id
  • title
  • index
  • hidden

2. 读取单元格范围

export FEISHU_SHEET_ID="<sheet_id>"
export FEISHU_RANGE="$FEISHU_SHEET_ID!A1:Z1000"

curl -sS \
"$FEISHU_BASE_URL/sheets/v2/spreadsheets/$FEISHU_SPREADSHEET_TOKEN/values/$FEISHU_RANGE" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
| tee "$FEISHU_SYNC_DIR/state/sheet-values.json" \
| jq .

实际范围应根据工作表元数据或业务规则确定,不应对超大表格一次请求无限范围。

AIS加工建议

对于数据量较小的说明表,可转换为Markdown表格;对于大型业务表,应:

  1. 第一行作为字段名;
  2. 每一行转换为带字段名的文本;
  3. 按业务主键或固定行数分块;
  4. 在每块中保留表格名、工作表名、行号和来源链接;
  5. 同时保留原始XLSX作为附件。

九、导入飞书多维表格

多维表格Token通常称为 app_token。一个多维表格中可能包含多个数据表,每个数据表具有独立 table_id

1. 获取数据表列表

export FEISHU_BITABLE_APP_TOKEN="<多维表格app_token>"

curl -sS -G \
"$FEISHU_BASE_URL/bitable/v1/apps/$FEISHU_BITABLE_APP_TOKEN/tables" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "page_size=100" \
| tee "$FEISHU_SYNC_DIR/state/bitable-tables.json" \
| jq .

2. 获取字段定义

export FEISHU_BITABLE_TABLE_ID="<table_id>"

curl -sS -G \
"$FEISHU_BASE_URL/bitable/v1/apps/$FEISHU_BITABLE_APP_TOKEN/tables/$FEISHU_BITABLE_TABLE_ID/fields" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "page_size=100" \
| tee "$FEISHU_SYNC_DIR/state/bitable-fields.json" \
| jq .

字段定义非常重要,应保存:

  • 字段ID;
  • 字段名称;
  • 字段类型;
  • 是否为主字段;
  • 选项、人员、关联记录和附件等配置。

3. 获取记录

curl -sS -G \
"$FEISHU_BASE_URL/bitable/v1/apps/$FEISHU_BITABLE_APP_TOKEN/tables/$FEISHU_BITABLE_TABLE_ID/records" \
-H "Authorization: Bearer $FEISHU_ACCESS_TOKEN" \
--data-urlencode "page_size=100" \
| tee "$FEISHU_SYNC_DIR/state/bitable-records.json" \
| jq .

必须根据 has_morepage_token 读取全部记录。

4. 将记录转换为AIS知识

可按两种粒度生成Markdown。

一张数据表生成一个文档

适合记录较少、需要整体比较的表格:

# 项目风险台账

## 风险 R-001:后端部署准入

- 类别:技术风险
- 影响等级:高
- 责任人:肖玉民
- 当前状态:处理中
- 影响:可能导致项目交付延期
- 建议措施:组织架构、开发和安全部门联合评审

## 风险 R-002:前端React框架准入

...

每条记录生成一个文档

适合客户、项目、产品、案例、合同和风险等实体型数据:

飞书多维表格/项目管理/项目风险台账/R-001-后端部署准入.md

这种方式更适合增量更新、权限控制和Agent按实体检索。

5. 特殊字段处理

字段类型建议处理
人员转换为姓名,必要时保留用户ID
单选/多选输出选项文本
日期转为带时区的可读时间
关联记录展开为目标记录标题和ID,避免无限递归
附件下载附件并上传AIS,在正文保留关系
公式保存计算后的显示值,必要时附加公式定义
链接保留显示文本和URL
富文本转换为Markdown

对于敏感人员字段和附件,应先完成权限评估再导入。

十、上传到TorchV AIS

1. 检查目标目录

"$AIS_KB_BIN" \
"kb tree 卢向东的个人知识库/飞书知识导入目录/ --depth 2 --limit 50"

如果目标目录尚未创建,应先在AIS中创建或由AIS Skill创建。

2. 上传Office或PDF文件

"$AIS_KB_BIN" \
--upload-file "$FEISHU_SYNC_DIR/staging/文档名称.docx" \
--path-name "$AIS_TARGET_PATH"

电子表格:

"$AIS_KB_BIN" \
--upload-file "$FEISHU_SYNC_DIR/staging/表格名称.xlsx" \
--path-name "$AIS_TARGET_PATH"

3. 上传加工后的Markdown

"$AIS_KB_BIN" \
--upload-file "$FEISHU_SYNC_DIR/staging/项目风险台账.md" \
--path-name "$AIS_TARGET_PATH"

4. 验证AIS结果

保存上传接口返回的AIS文档编码,然后读回:

"$AIS_KB_BIN" "kb cat --code <AIS文档编码> --head 160"

端到端成功需要同时满足:

  1. 飞书接口返回成功;
  2. 所有分页读取完成;
  3. 下载或生成的本地文件存在且大小正常;
  4. AIS返回稳定文档编码;
  5. 文件出现在正确目录;
  6. AIS知识加工完成并能读回正文;
  7. 关键标题、正文、表格字段和记录抽样核对正确。

十一、同步清单设计

每个源对象建议记录:

{
"sourceSystem": "feishu",
"sourceContainerType": "wiki",
"spaceId": "<wiki space_id>",
"nodeToken": "<wiki node_token>",
"objectToken": "<obj_token>",
"objectType": "docx",
"sourcePath": "产品知识库/安装部署/私有化部署指南",
"sourceTitle": "私有化部署指南",
"sourceUrl": "https://example.feishu.cn/wiki/xxxxx",
"sourceUpdatedAt": "2026-08-24T15:30:00+08:00",
"sourceVersion": 18,
"localFile": "staging/私有化部署指南.docx",
"sha256": "<本地文件SHA-256>",
"aisDirectoryCode": "<AIS目录编码>",
"aisDocumentCode": "<AIS文档编码>",
"syncStatus": "SUCCESS",
"lastSyncedAt": "2026-08-24T16:00:00+08:00"
}

源对象主键建议:

内容主键
知识库节点space_id + node_token
云空间资源type + token
在线文档document_id 或真实 obj_token
电子表格spreadsheet_token
多维表格数据表app_token + table_id
多维表格记录app_token + table_id + record_id

不要只使用文件名作为主键。

十二、增量同步方案

image-20260824112250242

建议采用:

  • 文档:obj_token + revision_id/版本号 + update_time
  • 普通文件:file_token + size + update_time + SHA-256
  • 电子表格:spreadsheet_token + update_time,必要时计算规范化内容哈希;
  • 多维表格记录:record_id + last_modified_time
  • 同步失败:保持上次成功版本,不覆盖为损坏或空文档。

十三、权限与删除策略

1. 权限不能只在导入时检查一次

飞书资源权限可能随时变化。生产同步应定期检查:

  • 应用是否仍有知识空间访问权;
  • 文件夹或文档是否取消共享;
  • 文档是否启用高级权限或水印;
  • AIS目标目录是否具有匹配的访问范围。

2. ACL映射

推荐在同步清单中保存源权限摘要:

{
"sourceAcl": {
"visibility": "restricted",
"departments": ["产品部"],
"users": ["ou_xxx"],
"groups": ["oc_xxx"]
}
}

如果AIS无法一一映射飞书ACL,应按照更严格的权限创建独立知识库或目录,不能直接降级为全员可见。

3. 删除策略

初期建议:

  • 飞书源文档删除:AIS中标记“源已删除”并告警;
  • 飞书权限收回:暂停服务该文档并告警;
  • 不自动物理删除AIS内容;
  • 管理员确认后执行归档或软删除。

十四、常见问题

1. 能列出知识库,但读取文档报无权限

API权限和资源权限是两层控制。需要确认:

  • 应用版本已经发布和审批;
  • 已申请对应文档类型的只读权限;
  • 应用已加入目标知识库或文档协作范围;
  • 使用的Token身份与授权方式一致。

2. 为什么知识库node_token不能直接读取正文

知识库节点是组织层标识。需要先调用节点信息接口取得 obj_tokenobj_type,再调用文档、表格或多维表格接口。

3. 普通文件和在线文档有什么区别

普通文件有可直接下载的二进制内容;在线文档是云端结构化对象,需要读取内容API或创建导出任务。

4. 导出任务为什么不能立即下载

飞书云文档导出是异步任务,需要先创建任务,再轮询状态,获得导出产物的 file_token 后下载。

5. 电子表格应该上传XLSX还是转Markdown

建议两者并存:

  • XLSX保留原始数据和版式;
  • Markdown保留字段语义,方便问答和Agent检索。

6. 多维表格应该按表还是按记录生成文档

  • 记录少、需要整体分析:按数据表生成;
  • 客户、项目、产品、风险等实体数据:按记录生成;
  • 可以同时生成表级说明和记录级知识。

7. 如何避免快捷方式导致重复导入

解析 shortcut_info 指向的真实Token,使用真实资源Token去重,路径关系单独保留。

8. 是否可以直接全企业扫描

不建议。应明确知识空间、根文件夹、最大深度、最大页数和最大文件数,从小范围只读POC开始。

十五、建议的实施顺序

第一阶段:POC

选择:

  • 一个小型飞书知识库;
  • 一个云空间测试文件夹;
  • 一篇在线文档;
  • 一个电子表格;
  • 一个多维表格。

完成“发现 → 读取/导出 → 上传AIS → 读回验证”。

第二阶段:增量同步

增加:

  • 定时任务;
  • 分页与递归;
  • 同步清单;
  • 哈希与版本判断;
  • 失败重试;
  • AIS稳定编码映射。

第三阶段:企业级治理

增加:

  • 飞书ACL到AIS权限映射;
  • 敏感内容识别;
  • 删除和权限收回处理;
  • 审计日志;
  • 知识健康检查;
  • 文档版本合并;
  • 同步质量看板。

十六、官方参考资料


本教程适合作为飞书接入AIS的总体实施指南。真正开始对接时,建议先提供一个飞书测试知识库、测试云空间文件夹和五种测试资源链接,逐类型验证接口权限、导出质量和AIS解析效果,再编写自动同步程序。