9.0 KiB
URL 格式与处理规范
路由第 0 步:意图直达(优先级高于 URL 探测)
用户已经明确表达某产品的内容意图时,直接进入对应产品场域,不要先做 URL 类型 探测。尤其:
- 明确提到 Markdown /
.md文件的读取或修改,按普通文件走drive场域: 先dws drive download下载到本地处理,再用dws drive upload回传。 - 明确“读这篇文档 / 编辑文档正文”进入
doc;明确“看这个在线表格数据”进入sheet。
仅当用户只粘贴 URL、没有明确产品意图,或意图与链接类型可能冲突时,才执行下方 类型探测。
alidocs URL 分流决策(意图不明确时执行)
收到 alidocs.dingtalk.com URL 且无法从指令判断产品时,必须按以下顺序判断:
- URL 路径含
/i/p/→ 分享短链,禁止调用dws doc任何子命令 → 按下方 分享短链处理 执行 - URL 路径含
/i/nodes/→ 节点链接,需探测类型 → 按下方 alidocs URL 类型探测流程 执行 - URL 路径含
/spreadsheetv2/→ 电子表格直链,直接路由到sheet,将完整 URL 原样传给--node参数 - URL 路径含
/document/edit或/document/preview且 query 参数包含dentryKey→ 文档链接,直接路由到doc,将完整 URL 原样传给--node参数(URL 中不一定有type=d,只需匹配路径和dentryKey参数即可) - 其他 alidocs URL 格式 → 告知用户当前暂不支持该链接格式
已知 URL 格式
需要自行拼接链接时,只能使用以下模板:
| 产品 | 用途 | URL 格式 | ID 来源 |
|---|---|---|---|
aitable |
AI表格 Base 链接 | https://alidocs.dingtalk.com/i/nodes/{baseId} |
base list/search/create/get 返回的 baseId |
aitable |
AI表格指定数据表链接 | https://alidocs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId} |
baseId + table create/get 或 base get 返回的 tableId |
aitable |
AI表格指定数据表+视图链接 | https://alidocs.dingtalk.com/i/nodes/{baseId}?iframeQuery=sheetId%3D{tableId}%26viewId%3D{viewId} |
baseId + tableId + view create/get 返回的 viewId |
aitable |
AI表格模板预览 | https://docs.dingtalk.com/table/template/{templateId} |
template search 返回的 templateId |
doc |
文档链接 | https://alidocs.dingtalk.com/i/nodes/{dentryUuid} |
doc 命令返回的 dentryUuid |
sheet |
电子表格链接 | https://alidocs.dingtalk.com/i/nodes/{dentryUuid} |
sheet create 返回的 dentryUuid |
sheet |
电子表格直链 | https://alidocs.dingtalk.com/spreadsheetv2/{key}/...?dentryKey={key}&type=s |
用户提供的完整 URL,直接传给 --node |
doc |
文档链接(edit/preview) | https://alidocs.dingtalk.com/document/{edit|preview}?...&dentryKey={key} |
用户提供的完整 URL,直接传给 --node |
minutes |
听记链接 | https://shanji.dingtalk.com/app/transcribes/{taskUuid} |
list mine/shared 返回的 taskUuid |
不在此表中的产品,禁止自行拼接 URL。命令返回中包含完整链接时直接使用,否则告知用户无法提供。
分享短链处理
alidocs.dingtalk.com/i/p/{shortKey} 是钉钉文档的对外分享短链,dws doc 命令无法解析此格式。
识别规则
URL 路径中包含 /i/p/ 即为分享短链(无论后面是否还有子路径),例如:
https://alidocs.dingtalk.com/i/p/Y7kmbokZp3pgGLq2https://alidocs.dingtalk.com/i/p/Y7kmbokZp3pgGLq2/docs/AY39rGpMPmeVNpXZevZm8OZkXKnaoNQ7https://alidocs.dingtalk.com/i/p/AbCdEfGh1234https://alidocs.dingtalk.com/i/p/AbCdEfGh1234/sheets/XYZ789
关键:只要 URL 中出现
/i/p/,无论后面跟什么子路径(/docs/...、/sheets/...等),都属于分享短链,一律禁止调用dws doc。
处理方式
不要调用 dws doc 任何子命令(包括 doc info、doc read 等),dws 无法解析此格式。
- 需要获取文档内容时:使用
read_url工具直接读取该链接 - 其他操作(如移动、复制、权限管理等):告知用户此链接为分享短链,无法直接执行复制、移动、权限管理等操作。如需保存该文档内容,建议用户在钉钉客户端中打开该页面,手动复制文本内容,然后可通过
dws doc create创建一篇新文档并将内容写入
# 需要读取文档内容时(无论 /i/p/ 后面有没有子路径,都用 read_url)
read_url("https://alidocs.dingtalk.com/i/p/Y7kmbokZp3pgGLq2")
read_url("https://alidocs.dingtalk.com/i/p/Y7kmbokZp3pgGLq2/docs/AY39rGpMPmeVNpXZevZm8OZkXKnaoNQ7")
# 禁止(以下全部会失败,dws 无法解析任何含 /i/p/ 的 URL)
dws doc info --node "https://alidocs.dingtalk.com/i/p/Y7kmbokZp3pgGLq2" --format json
dws doc read --node "https://alidocs.dingtalk.com/i/p/Y7kmbokZp3pgGLq2/docs/AY39rGpMPmeVNpXZevZm8OZkXKnaoNQ7" --format json
当 read_url 返回内容不完整时
钉钉文档分享页是动态渲染的,read_url 可能只能获取到页面标题等有限信息,无法获取文档正文。此时禁止猜测原因(如"权限不足""文档为空""文档已删除"等),禁止建议用户"提供 /i/nodes/ 格式链接"(分享短链和节点链接是不同体系,普通用户无法自行转换)。应直接告知用户:
这个链接是钉钉文档的分享短链,由于页面是动态渲染的,我无法通过该链接直接获取文档的完整正文内容。
你可以:
- 在钉钉客户端中打开该文档,将正文内容复制粘贴给我
- 如果文档已保存在你的文档空间中,可以告诉我文档名称,我通过
dws drive search搜索后再读取
alidocs URL 类型探测流程
alidocs.dingtalk.com/i/nodes/{id} 是钉钉文档空间的统一 URL,可能指向文档、电子表格、多维表、文件、文件夹等不同类型。禁止仅凭 URL 就假定为文档,必须先探测类型再路由到正确的产品。
探测步骤
Step 1 → dws drive info --node "<URL>" --format json
Step 2 → 从返回中提取 extension、nodeType 字段
Step 3 → 按下方路由规则映射到对应产品
路由依据是
extension,不是contentType。drive info检测到adoc/axls/able时会自动补充在线文档信息。
路由映射表
| 条件 | 路由到产品 | 后续操作 |
|---|---|---|
extension=adoc |
doc |
加载 dingtalk-doc 操作内容 |
extension=axls |
sheet |
加载本包 references/sheet.md 操作(仅 axls 在线电子表格) |
extension=able |
aitable |
将 nodeId 作为 baseId,加载 dingtalk-aitable 操作 |
extension=xlsx / xls / xlsm / csv |
drive |
必须用 dws drive download 下载到本地处理,禁止走 sheet |
nodeType=file(非在线文档扩展名,含 md) |
drive |
下载用 dws drive download --node <ID> --output <PATH> --format json;上传/覆盖用 dws drive upload |
nodeType=folder |
drive / wiki |
调用 dws drive list --workspace <WS_ID> 或 dws wiki node list 列出子节点 |
| 以上均不匹配 | — | 告知用户当前暂不支持该类型 |
axls vs xlsx 关键区分:
axls(钉钉在线电子表格,contentType=ALIDOC)→ 走sheet产品线(读/写/筛选/导出等服务端原子操作)xlsx/xls/xlsm/csv(上传到文档空间的本地表格文件,contentType=DOCUMENT)→ 必须走dws drive download下载到本地后再解析处理,严禁错误路由到sheet产品线(sheet 命令只支持在线表格,调用 xlsx 节点会直接报错)- 用户想把在线表格导出为 xlsx 文件 → 用
dws sheet export(输入是axls,输出是 xlsx,这是 axls → xlsx 的格式转换,不属于 xlsx 读取场景)
示例
# 用户传入: https://alidocs.dingtalk.com/i/nodes/abc123
dws drive info --node "https://alidocs.dingtalk.com/i/nodes/abc123" --format json
# 返回 extension=axls → 在线电子表格,路由到 sheet
dws sheet list --node "https://alidocs.dingtalk.com/i/nodes/abc123" --format json
# 返回 extension=xlsx/xls/csv → 本地表格文件,必须下载处理(禁止走 sheet)
dws drive download --node "https://alidocs.dingtalk.com/i/nodes/xlsx456" --output <PATH> --format json
# 返回 nodeType=file → 普通文件,下载
dws drive download --node "https://alidocs.dingtalk.com/i/nodes/def456" --output <PATH> --format json
# 返回 nodeType=folder → 文件夹,列出子节点
dws drive list --workspace <WS_ID> --format json
何时可跳过探测
当用户指令中已明确指定产品(如"帮我读这个文档"、"看下这个表格的数据"),可结合用户意图跳过探测直接路由。仅在以下情况必须执行探测:
- 用户只粘贴 URL,无其他上下文
- 用户指令与 URL 实际类型可能不一致(如说"文档"但实际是表格)