Files
my-assistant/skills/dingtalk-document/references/api.md
root 1a9fdc7274 feat: add dingtalk-log skill for querying work reports
- Add SKILL.md with full API documentation
- Add shell script for quick queries
- Update TOOLS.md with reference to new skill
2026-03-29 14:15:03 +08:00

342 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# dingtalk-document API 参考
> 所有接口均已验证可用。
> `NEW_TOKEN` = 新版 token`api.dingtalk.com` 用),获取方式 `bash scripts/dt_helper.sh --token`
> `OPERATOR_ID` = 用户 unionId获取方式 `bash scripts/dt_helper.sh --get DINGTALK_MY_OPERATOR_ID`
> ⚠️ **重要**:所有接口均需传 `operatorId`unionId缺少则返回 `MissingoperatorId` 错误。
---
## 1. 查询知识库列表
```
GET https://api.dingtalk.com/v2.0/wiki/workspaces?operatorId={OPERATOR_ID}&maxResults=20&nextToken=
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `operatorId` | string | ✅ | 用户 unionId |
| `maxResults` | int | ❌ | 每页数量,默认 20 |
| `nextToken` | string | ❌ | 分页令牌,首次为空 |
响应:
```json
{
"workspaces": [
{
"workspaceId": "QXvd5SLN2AxOQz0Z",
"name": "团队知识库",
"description": "...",
"rootNodeId": "P0MALyR8kl3qpB7qTkM1xn3mW3bzYmDO",
"type": "TEAM",
"url": "https://alidocs.dingtalk.com/i/spaces/.../overview",
"createTime": "2024-01-01T00:00Z",
"modifiedTime": "2024-06-01T00:00Z"
}
],
"nextToken": "..."
}
```
> 翻页:`nextToken` 非空时传入下次请求继续获取。
---
## 2. 查询知识库信息
```
GET https://api.dingtalk.com/v2.0/wiki/workspaces/{workspaceId}?operatorId={OPERATOR_ID}
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
响应:单个 workspace 对象(结构同列表项)
---
## 3. 查询节点列表
```
GET https://api.dingtalk.com/v2.0/wiki/nodes?parentNodeId={nodeId}&operatorId={OPERATOR_ID}&maxResults=50&nextToken=
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `parentNodeId` | string | ✅ | 父节点 ID传知识库的 `rootNodeId` 可列出顶层内容 |
| `operatorId` | string | ✅ | 用户 unionId |
| `maxResults` | int | ❌ | 每页数量,默认 20 |
| `nextToken` | string | ❌ | 分页令牌 |
响应:
```json
{
"nodes": [
{
"nodeId": "LeBq413JAw31yaz1fB0BBdLGWDOnGvpb",
"name": "使用文档.adoc",
"type": "FILE",
"category": "ALIDOC",
"extension": "adoc",
"workspaceId": "QXvd5SnBnzmZdZ0Z",
"url": "https://alidocs.dingtalk.com/i/nodes/...",
"createTime": "2026-03-04T16:58Z",
"modifiedTime": "2026-03-04T17:51Z"
}
],
"nextToken": "..."
}
```
> `type``FILE`(文档/文件)| `FOLDER`(文件夹)
---
## 4. 查询单个节点
```
GET https://api.dingtalk.com/v2.0/wiki/nodes/{nodeId}?operatorId={OPERATOR_ID}
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
响应:`{ "node": { nodeId, name, type, category, workspaceId, url, ... } }`
---
## 5. 通过 URL 查询节点
```
POST https://api.dingtalk.com/v2.0/wiki/nodes/queryByUrl?operatorId={OPERATOR_ID}
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
请求体:
```json
{
"url": "https://alidocs.dingtalk.com/i/nodes/<nodeId>",
"operatorId": "{OPERATOR_ID}"
}
```
响应:与 GET 单个节点相同的 node 结构。
---
## 6. 创建文档
```
POST https://api.dingtalk.com/v1.0/doc/workspaces/{workspaceId}/docs
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
请求体:
```json
{
"operatorId": "{OPERATOR_ID}",
"docType": "DOC",
"name": "文档标题"
}
```
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `operatorId` | string | ✅ | 用户 unionId |
| `docType` | string | ✅ | 固定填 `"DOC"`ALIDOC 富文本格式) |
| `name` | string | ✅ | 文档标题 |
响应:
```json
{
"dentryUuid": "aaa",
"nodeId": "xxx",
"docKey": "yyy",
"workspaceId": "zzz",
"url": "https://..."
}
```
> **重要**
> - `docKey` / `dentryUuid`:用于 `/v1.0/doc/suites/documents/{id}` 内容读写
> - `nodeId`:用于 `/v1.0/doc/workspaces/{workspaceId}/docs/{nodeId}` 删除/管理
---
## 7. 删除文档
```
DELETE https://api.dingtalk.com/v1.0/doc/workspaces/{workspaceId}/docs/{nodeId}?operatorId={OPERATOR_ID}
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
> `workspaceId` 和 `nodeId` 均使用创建文档响应中的值。成功返回 `200 {}`。
---
## 8. 读取文档内容Block 结构)
```
GET https://api.dingtalk.com/v1.0/doc/suites/documents/{docKey}/blocks?operatorId={OPERATOR_ID}
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
> **docKey 的来源**
> - 通过 wiki nodes 接口查到的 `nodeId` 本质是 `dentryUuid`,可直接用于正文读写
> - 通过创建文档接口新建的文档:可使用响应中的 `docKey` 或 `dentryUuid`
> - 创建响应中的 `nodeId`(通常出现在 `/docs/<nodeId>` 链接中)不能直接用于正文读写
响应:
```json
{
"result": {
"data": [
{ "blockType": "heading", "heading": { "level": "heading-2", "text": "快速开始" }, "index": 0, "id": "xxx" },
{ "blockType": "paragraph", "paragraph": { "text": "正文内容..." }, "index": 1, "id": "yyy" },
{ "blockType": "table", "table": { "colSize": 2, "rowSize": 10 }, "index": 2, "id": "zzz" },
{ "blockType": "unknown", "index": 3, "id": "aaa", "unknown": {} }
]
},
"success": true
}
```
`blockType` 枚举:`heading``paragraph``unorderedList``orderedList``table``blockquote``unknown`(代码块/图片等)
---
## 9. 覆盖写入文档内容
```
POST https://api.dingtalk.com/v1.0/doc/suites/documents/{docKey}/overwriteContent?operatorId={OPERATOR_ID}
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
> ⚠️ `operatorId` 必须**同时**作为 query param 和请求体字段传入,缺一会报 `Missingcontent` 错误。
请求体:
```json
{
"operatorId": "{OPERATOR_ID}",
"content": "# 新标题\n\n新的正文内容支持 Markdown 格式。",
"contentType": "markdown"
}
```
> ⚠️ 此操作**全量覆盖**文档内容,不可撤销。
---
## 10. 追加文本到段落
```
POST https://api.dingtalk.com/v1.0/doc/suites/documents/{docKey}/blocks/{blockId}/paragraph/appendText
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
请求体:
```json
{ "operatorId": "{OPERATOR_ID}", "text": "追加的文字" }
```
---
## 11. 添加文档成员
```
POST https://api.dingtalk.com/v1.0/doc/workspaces/{workspaceId}/docs/{nodeId}/members
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
请求体:
```json
{
"operatorId": "{OPERATOR_ID}",
"members": [
{ "id": "<userId>", "roleType": "viewer" }
]
}
```
| 参数 | 说明 |
|---|---|
| `id` | 用户 userId**注意**:这里用 userId不是 unionId|
| `roleType` | `viewer`(只读)| `editor`(可编辑)|
---
## 12. 更新文档成员权限
```
PUT https://api.dingtalk.com/v1.0/doc/workspaces/{workspaceId}/docs/{nodeId}/members/{memberId}
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
请求体:
```json
{ "operatorId": "{OPERATOR_ID}", "roleType": "viewer" }
```
---
## 13. 移除文档成员
```
DELETE https://api.dingtalk.com/v1.0/doc/workspaces/{workspaceId}/docs/{nodeId}/members/{memberId}?operatorId={OPERATOR_ID}
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
---
## 14. 搜索文档(用于找回可读写 ID
```
GET https://api.dingtalk.com/v1.0/doc/docs?operatorId={OPERATOR_ID}&workspaceId={workspaceId}&keyword={keyword}&maxResults=20&nextToken=
Header: x-acs-dingtalk-access-token: {NEW_TOKEN}
```
说明:
- 需要权限:`Document.WorkspaceDocument.Read`
- 返回结果中的 `docs[].nodeBO.nodeId` 即可用于 `/v1.0/doc/suites/documents/{id}` 的读写(该值是 `dentryUuid` 风格 ID
示例响应(节选):
```json
{
"docs": [
{
"nodeBO": {
"name": "测试创建.adoc",
"nodeId": "np9zOoBVBYwB2OZBIn4y0G1vW1DK0g6l",
"url": "https://alidocs.dingtalk.com/i/nodes/np9zOoBVBYwB2OZBIn4y0G1vW1DK0g6l"
},
"workspaceBO": {
"workspaceId": "QXvd5SLN2AxOQz0Z"
}
}
],
"hasMore": false
}
```
---
## 错误码
| HTTP状态码 | 错误码 | 说明 | 处理建议 |
|---|---|---|---|
| 400 | `MissingoperatorId` | operatorId 未传 | 补充 operatorIdunionId|
| 400 | `paramError` | 参数类型错误 | operatorId 必须是 unionId不是 userId |
| 403 | `Forbidden.AccessDenied.AccessTokenPermissionDenied` | 应用缺少权限 | 错误中有 `requiredScopes`,开通对应权限 |
| 404 | `InvalidAction.NotFound` | 接口路径不存在 | 检查版本号v1.0/v2.0)和路径 |
| 429 | — | QPS 限流 | 1 秒后重试 |
---
## 所需应用权限
| 功能 | 权限 scope |
|---|---|
| 查询知识库/节点 | `Wiki.Node.Read` |
| 读取文档正文 | `Storage.File.Read` |
| 写入文档正文 | `Storage.File.Write` |
| 创建/删除文档 | `Storage.File.Write` |
| 查询用户 unionId | `Contact.User.Read` |