飞书知识库文档批量上传指南

1729 words
9 minutes
飞书知识库文档批量上传指南

飞书知识库文档批量上传指南#

🗂️ 基于三次实战经验沉淀(岗位资料47篇、面经47篇、经验贴44篇) 📅 更新于 2026-06-27 🎯 目标:快速、稳定地将本地 Markdown 文件批量上传至飞书知识库


一、整体流程概览#

1️⃣ 创建知识库节点 → 2️⃣ 复制文件到工作目录 → 3️⃣ 批量上传为飞书文档 → 4️⃣ 更新索引文档

二、前置准备#

2.1 查看知识库空间 ID#

Terminal window
lark-cli wiki +space-list

输出中找到目标知识库的 space_id,例如:

我的知识库 → space_id: 7655878760121502674

2.2 查看知识库根节点#

Terminal window
lark-cli wiki +node-list --space-id "<space_id>"

返回的 nodes 列表中,根目录下的节点会显示 parent_node_token 为根节点 token。


三、创建知识库节点#

3.1 创建分类节点(origin 类型)#

Terminal window
lark-cli wiki +node-create \
--space-id "7655878760121502674" \
--title "面经" \
--node-type "origin" \
--obj-type "docx"

参数说明:

  • --node-type origin:创建文件夹类型节点(可包含子文档)
  • --obj-type docx:节点关联的默认文档类型

返回示例:

{
"ok": true,
"data": {
"node_token": "Gs8TwCHdiiv75wkYQUJcgWyHnGg",
"title": "面经",
"url": "https://my.feishu.cn/wiki/Gs8TwCHdiiv75wkYQUJcgWyHnGg"
}
}

⚠️ 保存好 node_token 后续上传文档时要用作 --parent-token


四、文件准备#

4.1 复制文件到可访问目录#

飞书 CLI 的 --content @file 必须使用相对路径,不能直接使用 Android 绝对路径。

Terminal window
# 创建临时工作目录
mkdir -p /home/mianjing
# 复制所有 .md 文件过去
cp /storage/emulated/0/小万工作间/面经/*.md /home/mianjing/

4.2 确认文件完整性#

Terminal window
ls /home/mianjing/*.md | wc -l
# 输出文件总数

五、批量上传文档#

5.1 核心命令#

Terminal window
cd /home/mianjing
lark-cli docs +create \
--doc-format markdown \
--parent-token "<node_token>" \
--title "文档标题" \
--content "@./文件名.md"

关键参数:

  • --doc-format markdown:以 Markdown 格式导入(本地 .md 文件直接用这个)
  • --parent-token:目标知识库节点的 token(步骤三中返回的)
  • --content @./xxx.md相对路径!相对路径!相对路径!

5.2 ⚠️ 踩坑记录:文件路径问题#

Terminal window
# ❌ 错误写法——CLI 会报 invalid file path
--content @/storage/emulated/0/小万工作间/面经/xxx.md
# ✅ 正确写法——cd 到文件所在目录后用相对路径
cd /home/mianjing
--content @./xxx.md

错误信息:

--content: invalid file path "xxx": --file must be a relative path
within the current directory

5.3 批量上传脚本模板#

Terminal window
cd /home/mianjing
for f in *.md; do
title="${f%.md}"
echo "🔄 $title"
result=$(lark-cli docs +create \
--doc-format markdown \
--parent-token "<node_token>" \
--title "$title" \
--content "@./$f" 2>&1)
if echo "$result" | grep -q '"ok": true'; then
echo " ✅ 成功"
else
echo " ⏳ 限流,等待重试..."
sleep 8
result=$(lark-cli docs +create \
--doc-format markdown \
--parent-token "<node_token>" \
--title "$title" \
--content "@./$f" 2>&1)
if echo "$result" | grep -q '"ok": true'; then
echo " ✅ 重试成功"
else
echo " ❌ 失败"
fi
fi
sleep 2 # 间隔请求,避免限流
done

5.4 ⚠️ 踩坑记录:API 限流#

现象: 连续上传约 10 个文件后,所有请求返回 rate_limit 错误。

解决方案:

  • 每上传一个文件后 sleep 2
  • 限流后等待 8-10 秒 再重试
  • 重试成功率接近 100%
  • 宁可慢一点,不要并发上传(会全部限流)

六、验证上传结果#

6.1 查看节点下文档列表#

Terminal window
lark-cli wiki +node-list \
--space-id "7655878760121502674" \
--parent-node-token "<node_token>"

6.2 对比本地文件和已上传文件#

import subprocess, json, re, os
# 获取已上传的
r = subprocess.run(["lark-cli", "wiki", "+node-list",
"--space-id", "7655878760121502674",
"--parent-node-token", "<node_token>"],
capture_output=True, text=True, timeout=15)
raw = r.stdout
m = re.search(r'\{.*', raw, re.DOTALL)
data = json.loads(m.group())
uploaded = set(n['title'] for n in data['data']['nodes'])
# 本地文件
local = set(f[:-3] for f in os.listdir("/home/mianjing")
if f.endswith('.md'))
missing = local - uploaded
print(f"已上传: {len(uploaded)}")
print(f"本地: {len(local)}")
print(f"未同步: {len(missing)}")
for p in sorted(missing):
print(f" ⏳ {p}")

6.3 ⚠️ 踩坑记录:node-list 数据结构#

lark-cli wiki +node-list 返回的 JSON 结构是:

{
"ok": true,
"data": {
"has_more": false,
"nodes": [
{
"node_token": "xxx",
"title": "文档标题",
"node_type": "origin"
}
],
"page_token": "..."
}
}

注意: 记录在 data.nodes 里,不是 data.recordsdata.data


七、更新索引文档#

7.1 获取当前索引文档内容#

Terminal window
lark-cli docs +fetch \
--doc "<doc_token>" \
--doc-format markdown

返回的 JSON 中,内容在 data.document.content

注意 revision_id: 每次更新后 revision 会递增,更新时需要传入最新的 revision。

7.2 获取节点下所有文档的链接#

import subprocess, json, re
# 处理分页
all_nodes = []
page_token = None
while True:
cmd = ["lark-cli", "wiki", "+node-list",
"--space-id", "7655878760121502674",
"--parent-node-token", "<node_token>"]
if page_token:
cmd += ["--page-token", page_token]
r = subprocess.run(cmd, capture_output=True, text=True, timeout=15)
raw = r.stdout
m = re.search(r'\{.*', raw, re.DOTALL)
data = json.loads(m.group())
all_nodes.extend(data['data']['nodes'])
if data['data'].get('has_more') and data['data'].get('page_token'):
page_token = data['data']['page_token']
else:
break
# 文档链接格式:https://my.feishu.cn/wiki/<node_token>
for n in sorted(all_nodes, key=lambda x: x['title']):
print(f"- [{n['title']}](https://my.feishu.cn/wiki/{n['node_token']})")

7.3 覆盖更新索引文档#

Terminal window
lark-cli docs +update \
--doc "<doc_token>" \
--command overwrite \
--doc-format markdown \
--content "<完整的新文档内容>" \
--revision-id <latest_revision>

7.4 ⚠️ 踩坑记录:overwrite vs str_replace#

  • overwrite:用 --content 完全替换文档内容。适合大段增删改。
  • str_replace:替换文档中的指定文本。适合小范围修改(如更新篇数)。
  • replace_all不存在这个命令! 会报 invalid value "replace_all"

更新文档总数的示例:

Terminal window
# 先找到文档中的旧数字,用 str_replace 精准替换
lark-cli docs +update \
--doc "<doc_token>" \
--command str_replace \
--pattern "🗂️ 共 73 篇文档" \
--content "🗂️ 共 120 篇文档" \
--revision-id <rev>

八、最佳实践总结#

8.1 建议的上传节奏#

批次文件数间隔预计耗时
第一批(热身)5 个2 秒~15s
第二批10 个2 秒~25s
第三批及以后每次 10-15 个2-3 秒~1min/批
限流后重试等待 8-10 秒--

40-50 个文件的总耗时约 5-8 分钟。

8.2 批量操作流程速查#

Terminal window
# 1. 创建节点
lark-cli wiki +node-create --space-id "xxx" --title "节点名" --node-type origin --obj-type docx
# 2. 复制文件
mkdir -p /home/temp && cp /storage/emulated/0/小万工作间/xxx/*.md /home/temp/
# 3. 批量上传(cd 到目录后用 for 循环)
cd /home/temp && for f in *.md; do ... done
# 4. 验证
lark-cli wiki +node-list --space-id "xxx" --parent-node-token "xxx" | python3 -c "..."
# 5. 更新索引
lark-cli docs +update --doc "xxx" --command overwrite --doc-format markdown --content "..." --revision-id x

8.3 坑点速查表#

表现解决
--content @file 路径错误invalid file path相对路径,先 cd 到目录
API 限流rate_limit 错误每文件间隔 2s,限流后等 8-10s 重试
node-list 数据路径KeyError: 'records'记录在 data.nodes
replace_all 不存在invalid valueoverwritestr_replace
索引 revision 过期更新失败先 fetch 获取最新 revision
仪表盘统计卡片”数据加载失败”配置正确但客户端渲染卡顿,刷新即可

九、常用命令速查#

Terminal window
# 知识库操作
lark-cli wiki +space-list # 列出知识库空间
lark-cli wiki +node-list --space-id "xxx" # 列出根节点
lark-cli wiki +node-list --space-id "xxx" --parent-node-token "xxx" # 列出子节点
lark-cli wiki +node-create --space-id "xxx" --title "xx" --node-type origin --obj-type docx # 创建节点
# 文档操作
lark-cli docs +create --doc-format markdown --parent-token "xxx" --title "xx" --content @./xx.md # 创建文档
lark-cli docs +fetch --doc "xxx" --doc-format markdown # 获取文档内容
lark-cli docs +update --doc "xxx" --command overwrite --doc-format markdown --content "..." --revision-id x # 更新文档
# 多维表格操作
lark-cli base +field-list --base-token "xxx" --table-id "xxx" # 列出字段
lark-cli base +record-list --base-token "xxx" --table-id "xxx" --format json # 列出记录
lark-cli base +record-upsert --base-token "xxx" --table-id "xxx" --record-id "xxx" --json '{"字段":"值"}' # 更新单条
lark-cli base +record-batch-update --base-token "xxx" --table-id "xxx" --json @./file.json # 批量更新

💡 核心原则: 耐心比速度重要——每次间隔几秒,限流了等一会再重试,反而比盲目快冲更快完成全部上传。

Share Article

If this article helped you, please share it with others!

飞书知识库文档批量上传指南
https://estars-blog.pages.dev/posts/操作指南-飞书知识库文档批量上传指南/
Author
Estars
Published at
2026-06-27
License
CC BY-NC-SA 4.0
Profile Image of the Author
Estars
这条路要走完,才能看到世界的终点,是海纳百川,还是星火燎原。
公告
欢迎来到我的博客!这是一则示例公告。
Music
Cover

Music

No playing

0:00 0:00
No lyrics available
Categories
Tags
Site Statistics
Posts
85
Categories
7
Tags
15
Total Words
218,958
Running Days
0 days
Last Activity
0 days ago

Table of Contents