ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

飞书知识库节点信息解析:lark-cli `wiki +node-get` 实战指南

飞书知识库节点信息解析:lark-cli `wiki +node-get` 实战指南 CLIAI 技能【免费下载链接】cliThe official Lark/飞书 CLI tool, maintained by the larksuite team — built for humans and AI Agents. Covers core business domains including Messenger, Docs, Base, Sheets, Calendar, Mail, Tasks, Meetings, and more, with 200 commands and 20 AI Agent Skills.项目地址https://gitcode.com/gh_mirrors/cli414/cli点击查看免费下载lark-cli是 Lark/飞书官方维护的命令行工具覆盖知识库Wiki、文档、表格、日历、邮件、任务、会议等核心业务域内置 200 命令与 20 AI Agent Skills。wiki node-get是该工具知识库模块中最基础也最关键的一个只读 Shortcut它负责把知识库节点令牌node_token、云文档对象令牌obj_token或 Lark/飞书 URL 解析成结构化的节点详情。本文基于仓库中 skills/lark-wiki/references/lark-wiki-node-get.md 编写并结合作者在 shortcuts/wiki/wiki_node_get.go 中的源码实现与 shortcuts/wiki/wiki_node_get_test.go 的测试用例完整讲解该命令的用法、参数、输出契约、错误分类与限流策略。读完本文你将能够在脚本化工作流、AI Agent 编排以及手工排障中熟练使用node-get并在任何写操作移动、复制、删除、建空间之前准确确认即将操作的节点到底是什么。一、命令定位一切 Wiki 写操作前的探路步骤知识库Wiki中的每个节点都有两套身份知识库节点令牌node_token形如wikcn...与底层对象令牌obj_token形如docx.../sht.../bascn...等并归属于某个知识空间space_id。node-get的官方定位非常明确——它是move/node-copy/node-delete等写操作之前的 what am I about to touch?我即将操作的是什么检查步骤操作前先用node-get拿到space_id、obj_type、parent_node_token等关键字段避免对错误对象执行写操作用户只给了一个知识库 URL如https://feishu.cn/wiki/token时先用它解析出真实的space_id与node_token再传递给下游命令AI Agent 场景下它是wiki node-list、wiki member-list、wiki delete-space等命令的统一令牌解析器。这一点在 skills/lark-wiki/SKILL.md 中被反复强调例如delete-space只接受真实的space_id如果用户只给 URL 或名称必须先执行lark-cli wiki node-get --node-token wiki_url --as user --format json读取data.space_id再传给它。从源码结构看node-delete内部同样先调用node_by_token解析节点并校验空间见 shortcuts/wiki/wiki_node_delete.go 中的resolveWikiNodeDeleteSpaceID因此node-get也可以被视为所有 Wiki 写命令内部解析逻辑的前置镜像。二、基本用法与参数详解2.1 命令形态lark-cli wiki node-get \ --node-token node_token | obj_token | Lark URL \ [--space-id space_id] \ [--format json|pretty|table|csv|ndjson] \ [--as user|bot]--node-token接受三种输入且不需要显式声明类型——令牌类型由服务端自动探测输入类型示例说明知识库节点令牌wikcnExampleWiki 节点的原生令牌云文档对象令牌docxExample/shtExample等文档/表格/多维表格等底层对象令牌Lark/飞书 URLhttps://feishu.cn/wiki/token、https://feishu.cn/docx/token命令行会先从 URL 路径中提取令牌2.2 参数一览FlagsFlag类型必填默认值说明--node-tokenstring是—node_token、云文档obj_token或内嵌其中之一的 Lark URL如https://feishu.cn/wiki/token或https://feishu.cn/docx/token。与同族的node-delete/node-copy/move使用相同的--node-token命名约定。--tokenstring—已弃用—旧版参数名为向后兼容仍被接受但使用时会向 stderr 输出Flag --token has been deprecated, use --node-token instead警告。新脚本应改用--node-token。--space-idstring否—可选的交叉校验如果解析出的节点不属于该知识空间命令直接失败--formatenum否jsonjson/pretty/table/csv/ndjson--asenum否auto身份user/bot知识库以用户为中心建议显式传--as user2.3 身份选择为什么建议显式--as user知识空间和节点是用户的个人资源skills/lark-wiki/SKILL.md 明确说明CLI 的--as默认值是auto不带--as时常常被解析成bot此时列出的是应用所属的空间而非用户自己的。因此策略上应优先显式使用--as user仅当用户明确要求应用 / bot 视角时才用--as bot。node-get同时支持user与bot两种AuthTypes见 shortcuts/wiki/wiki_node_get.go 中的WikiNodeGet定义。三、输出契约JSON 字段逐一拆解默认--format json输出示例{ space_id: 7160145948494381236, node_token: wikcnEXAMPLE, obj_token: docxEXAMPLE, obj_type: docx, node_type: origin, parent_node_token: wikcnPARENT, origin_node_token: , title: Design Spec, has_child: true, creator: ou_xxx, owner: ou_yyy, obj_edit_time: 1700000000, obj_create_time: 1690000000, node_create_time: 1690000001, updated_at: 2023-11-14T22:13:20Z }各字段含义与来源对照 shortcuts/wiki/wiki_node_get.go 中wikiNodeGetOutput的实现字段含义说明space_id知识空间 ID写操作前确认目标空间node-get是唯一解析入口node_token知识库节点令牌作为节点在 Wiki 中的身份标识obj_token底层对象令牌节点背后实际文档/表格/Base 的令牌obj_type对象类型docx、sheet、bitable、mindnote、slides、file等以服务端返回为准node_type节点类型origin原始节点或 shortcut快捷方式parent_node_token父节点令牌判断节点在空间树中的位置origin_node_token原始节点令牌shortcut 节点指向的原始节点原始节点为空串title节点标题如 Design Spechas_child是否含子节点true时说明该节点是子树根creator创建者 open_id优先取node_creator缺失时回退到creatorowner所有者 open_id—obj_edit_time对象编辑时间原始 Unix 秒字符串obj_create_time对象创建时间原始 Unix 秒字符串node_create_time节点创建时间原始 Unix 秒字符串updated_at更新时间obj_edit_time格式化为 RFC3339UTC值得注意的实现细节updated_at是obj_edit_time的格式化副本源码formatWikiTimestamp将 Unix 秒字符串统一转换为 UTC 时区的 RFC3339如1700000000→2023-11-14T22:13:20Z保证输出不随运行主机时区漂移空值或非数字输入返回空串pretty 视图渲染为-。creator双字段回退源码先读node_creator为空时再读creator对应测试TestWikiNodeGetFallsBackToCreatorWhenNodeCreatorMissing验证了该回退行为。输出不合成url字段即使 API 响应中携带urlnode-get也会保持既有输出字段不变、不输出urlnode_token/obj_token才是精确标识符对应测试中的断言 did not expect a url field in node-get output。--space-id交叉校验当--space-id被指定且与解析结果不一致时命令以校验错误失败--space-id %q does not match the resolved node space %q若 API 未返回space_id则会向 stderr 输出一条 could not be verified 警告避免调用方误以为校验已生效。--format pretty会渲染为可读的分行视图Wiki node:头 各字段对齐输出table/csv/ndjson则分别适合终端表格展示、Excel/CSV 管道与逐行流式消费。四、令牌解析规则源码级原理node-get的输入处理逻辑集中在 shortcuts/wiki/wiki_node_get.go 的parseWikiNodeGetSpec与tokenAndObjTypeFromWikiURL其规则可以归纳为四条原样透传原始令牌不含://与/?#直接作为请求参数不校验前缀、不限制长度——令牌类型与长度合法性完全交给服务端node_by_token探测。对应测试TestParseWikiNodeGetSpecLeavesTokenLengthToServer覆盖了 1 到 128 位长度的各种输入。URL 提取输入包含://时先用url.Parse校验语法再从路径段中提取令牌。支持路径前缀见下表提取时只取第一个路径段wikiPathSegmentAfter查询参数?foobar被忽略URL 路径前缀含义/wiki/知识库节点不推断底层文档类型/docx/文档对象令牌/doc/旧版文档/sheets/表格/base/多维表格/mindnote/思维笔记/slides/幻灯片/file/文件前缀映射定义在源码wikiNodeGetURLObjTypes中注释强调前缀之间必须互不为前缀如/docx/不能以/doc/开头否则 Go map 随机迭代顺序会导致匹配不确定。拒绝半路径输入包含/?#但不是完整 URL如/wiki/wikcnABC时直接报错partial paths are not accepted要求要么给原始令牌要么给完整 URL。URL 不用于断言类型URL 路径只用来提取令牌绝不拿路径暗示的类型去断言返回的obj_type——最终obj_type一律以服务端返回值为准。此外--node-token与弃用的--token同时给出且值不同时会直接以校验错误拒绝提示只用--node-token两者相同或只给一个时正常工作这个冲突前置拦截逻辑由resolveWikiNodeGetRawToken实现见对应测试TestResolveWikiNodeGetRawTokenRejectsConflict。兼容性--token与--obj-type--token是旧版参数名通过 cobra 的MarkDeprecated注册PostMount钩子使用时在 stderr 打印弃用警告功能照常可用--obj-type是已弃用且隐藏的兼容参数旧脚本传入时其值被静默忽略不产生任何警告与额外输出。URL 路径只用于提取令牌、不断言对象类型--space-id仍是响应后的交叉校验。五、底层 API 与请求细节node-get背后只调用一个 HTTP 接口GET /open-apis/wiki/v2/spaces/node_by_token?tokentoken关键事实源码RequestParams与测试TestBuildWikiNodeGetDryRunSendsOnlyToken/TestWikiNodeGetShortTokenReachesAPI均验证请求参数只有token--space-id、--obj-type等都不会进入请求服务端自行判断传入的是 Wiki 令牌还是文档令牌并校验其长度CLI 只做最小前置校验令牌非空、URL 语法合法、资源名不含非法字符其余全部放行给服务端dry-run 预览--dry-run会输出一条只含token参数的 GET 调用预览Resolve wiki node from token (token type detected by server)方便在真实请求前确认将发送的内容。从更广的视角看该接口是 Wiki 模块的公共解析原语node-delete、node-copy、move、delete-space等命令内部都复用同一接口见 shortcuts/wiki/wiki_node_lookup.go 中的lookupWikiNode这正是node-get输出可直接管道给下游写命令的底层原因。六、业务错误码HTTP 200 不等于成功这是node-get排障中最重要的认知这些 HTTP 200 响应携带非零业务码且使用相同输入重试无效终端业务错误Code含义应对动作131005Wiki 节点不存在检查令牌或获取最新的 Wiki 链接131006当前用户或应用/bot 身份无权访问该节点或空间这是资源访问权限问题不是应用 scope 授权问题。不要重试同一请求、不要通过重新授权或切换身份试错请节点所有者或 Wiki 管理员授予读权限或改用可访问的资源131012Wiki 节点已被删除不要重试同一节点令牌重新发现节点或索要最新 Wiki 链接131013资源令牌无效不要切换身份或重新授权修正 URL/令牌131014文档未挂载到 Wiki停止 Wiki 解析改用对应的 docs/sheets/base/drive 命令或提供 Wiki URL/node_token131016令牌过短提供完整令牌或文档 URL不要用同一输入重试131001非法请求与网关错误仍可能返回 HTTP 4xx/5xx。源码层面这些码的归类与恢复提示由wikiNodeGetProblem调用 shortcuts/wiki/wiki_node_lookup.go 的wikiNodeLookupProblem完成测试TestWikiNodeGetMountedClassifiesTerminalBusinessErrors逐项断言了错误分类SubtypeNotFound/SubtypeInvalidParameters/SubtypeFailedPrecondition与提示文本131006额外强制Retryablefalse其提示由wikiPermissionDeniedHint统一给出明确不要重试、不要切换身份试错131013/131016的提示还会追加提供完整的原始obj_token的恢复指引。这些终端错误全部不可重试——修复方向永远是换令牌、换操作或换权限而不是换一种姿势重发同一请求。七、限流策略当收到99991400/rate_limit错误时不要立即重试等待retry_after_seconds或使用带抖动jitter的指数退避总共最多尝试 3 次1 次初始 2 次重试。该策略在源码中体现为常量提示wikiNodeGetRateLimitHint与上游的退避指导合并追加到错误提示中测试TestWikiNodeGetProblemBoundsRateLimitRetries验证了99991400保持Retryabletrue、保留RetryAfterSeconds、并追加限流提示的行为。注意这与上述业务码不可重试形成鲜明对比只有rate_limit才做退避重试。八、权限要求与典型工作流8.1 所需 Scopewiki:node:retrieve该 scope 在 shortcuts/wiki/wiki_node_get.go 的WikiNodeGet.Scopes中声明测试TestWikiNodeGetSilentlyIgnoresLegacyObjectType还专门断言了该 scope 列表的稳定性。由于解析节点需要 Wiki 读权限即使后续操作如删除还依赖其他 scopenode-get这一环始终需要wiki:node:retrieve。8.2 三个高频实战组合场景一用 URL 解析出空间 ID再查空间成员lark-cli wiki node-get --node-token https://feishu.cn/wiki/token --as user --format json # 读取 data.space_id 后 lark-cli wiki member-list --space-id space_id --as user场景二写操作前的安全检查# 移动 / 复制 / 删除前先确认对象类型、父节点与所属空间 lark-cli wiki node-get --node-token node_token --format table --as user lark-cli wiki move --node-token node_token --space-id space_id ... lark-cli wiki node-copy --node-token node_token --space-id space_id ... lark-cli wiki node-delete --node-token node_token --space-id space_id --yes场景三给--space-id加交叉校验防止误操作lark-cli wiki node-get --node-token url --space-id 期望的空间ID --format json # 若节点不在该空间命令立即以校验错误失败九、使用注意事项小结身份优先用--as userWiki 是用户中心资源auto常解析为 bot 视角看到的是应用所属空间URL 路径只在/wiki/、/docx/、/doc/、/sheets/、/base/、/mindnote/、/slides/、/file/后提取令牌其他路径如 IM 链接直接报unsupported URL path令牌类型永远以服务端返回为准--obj-type已被弃用并静默忽略业务错误码不可重试唯一例外是99991400限流最多 3 次尝试输出中node_token/obj_token是权威标识符不要依赖合成 URL该命令是纯只读Risk: read可以放心用于 AI Agent 的探索步骤不会改变任何资源状态。掌握wiki node-get就等于掌握了整个飞书知识库命令族的钥匙——无论你是在为node-copy确认源节点、为node-delete核对空间归属还是仅仅需要把一个 Wiki URL 翻译成机器可读的 JSON它都是最快、最稳的第一步。赞分享CLIAI 技能【免费下载链接】cliThe official Lark/飞书 CLI tool, maintained by the larksuite team — built for humans and AI Agents. Covers core business domains including Messenger, Docs, Base, Sheets, Calendar, Mail, Tasks, Meetings, and more, with 200 commands and 20 AI Agent Skills.项目地址https://gitcode.com/gh_mirrors/cli414/cli点击查看免费下载相关推荐lark-cli 飞书知识库 node-create 命令实战自动空间解析的知识库节点创建指南lark cli 飞书知识库 node create 命令实战自动空间解析的知识库节点创建指南 导读 本文围绕 lark cli 的 wiki nodeCLIAI 技能飞书知识库节点移动全攻略lark-cli wiki move 的 node / docs_to_wiki 双模式详解飞书知识库节点移动全攻略lark cli wiki move 的 node / docs_to_wiki 双模式详解 本文以 Lark 官方 CLIlarCLIAI 技能使用 lark-cli 的 wiki member-list 命令查询飞书知识库空间成员使用 lark cli 的 wiki member list 命令查询飞书知识库空间成员 导读 wiki member list 是飞书官方 CLI 工具CLIAI 技能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表