@amaster.ai/pi-lark 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/skills/lark-apps/SKILL.md +41 -6
- package/skills/lark-apps/references/lark-apps-cloud-dev.md +5 -4
- package/skills/lark-apps/references/lark-apps-create.md +6 -3
- package/skills/lark-apps/references/lark-apps-db.md +130 -2
- package/skills/lark-apps/references/lark-apps-get.md +1 -1
- package/skills/lark-apps/references/lark-apps-list.md +1 -1
- package/skills/lark-apps/references/lark-apps-local-dev.md +27 -1
- package/skills/lark-apps/references/lark-apps-release-create.md +1 -1
- package/skills/lark-apps/references/lark-apps-user-id-convert.md +63 -0
- package/skills/lark-base/SKILL.md +155 -159
- package/skills/lark-base/references/{lark-base-role-guide.md → lark-base-advanced-permission-and-role.md} +5 -5
- package/skills/lark-base/references/lark-base-app-block-data-config.md +122 -0
- package/skills/lark-base/references/lark-base-app.md +225 -0
- package/skills/lark-base/references/lark-base-cell-value.md +26 -19
- package/skills/lark-base/references/{dashboard-block-data-config.md → lark-base-dashboard-block-config.md} +37 -5
- package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +18 -2
- package/skills/lark-base/references/lark-base-dashboard.md +25 -12
- package/skills/lark-base/references/lark-base-data-analysis-pandas.md +93 -0
- package/skills/lark-base/references/lark-base-data-analysis-python-stdlib.md +120 -0
- package/skills/lark-base/references/lark-base-data-query.md +8 -11
- package/skills/lark-base/references/lark-base-field-create.md +13 -45
- package/skills/lark-base/references/{formula-field-guide.md → lark-base-field-formula.md} +1 -1
- package/skills/lark-base/references/{lookup-field-guide.md → lark-base-field-lookup.md} +1 -1
- package/skills/lark-base/references/{lark-base-field-json.md → lark-base-field-schema.md} +18 -100
- package/skills/lark-base/references/lark-base-field-update.md +13 -51
- package/skills/lark-base/references/lark-base-filter-condition.md +19 -31
- package/skills/lark-base/references/lark-base-record-batch-create.md +5 -1
- package/skills/lark-base/references/lark-base-record-batch-update.md +5 -2
- package/skills/lark-base/references/lark-base-record-query-and-analysis-cloud-sop.md +145 -0
- package/skills/lark-base/references/lark-base-record-query-and-analysis-sop.md +233 -0
- package/skills/lark-base/references/{role-config.md → lark-base-role-config.md} +2 -2
- package/skills/lark-base/references/lark-base-view-set-filter.md +1 -1
- package/skills/lark-base/references/lark-base-workflow-schema.md +2 -2
- package/skills/lark-base/references/{lark-base-workflow-guide.md → lark-base-workflow.md} +1 -1
- package/skills/lark-calendar/SKILL.md +3 -1
- package/skills/lark-calendar/references/lark-calendar-create.md +4 -3
- package/skills/lark-doc/SKILL.md +26 -61
- package/skills/lark-doc/references/genres/business-analysis.md +30 -0
- package/skills/lark-doc/references/genres/data-report.md +32 -0
- package/skills/lark-doc/references/genres/email.md +38 -0
- package/skills/lark-doc/references/genres/execution-plan.md +27 -0
- package/skills/lark-doc/references/genres/formal-doc.md +37 -0
- package/skills/lark-doc/references/genres/meeting-minutes.md +24 -0
- package/skills/lark-doc/references/genres/memo-brief.md +25 -0
- package/skills/lark-doc/references/genres/official-redhead.md +73 -0
- package/skills/lark-doc/references/genres/prd.md +26 -0
- package/skills/lark-doc/references/genres/proposal.md +24 -0
- package/skills/lark-doc/references/genres/research-report.md +32 -0
- package/skills/lark-doc/references/genres/retrospective.md +25 -0
- package/skills/lark-doc/references/genres/route-consumer.md +37 -0
- package/skills/lark-doc/references/genres/route-creative.md +36 -0
- package/skills/lark-doc/references/genres/route-knowledge.md +39 -0
- package/skills/lark-doc/references/genres/route-marketing.md +40 -0
- package/skills/lark-doc/references/genres/route-media.md +36 -0
- package/skills/lark-doc/references/genres/route-opinion.md +38 -0
- package/skills/lark-doc/references/genres/route-personal-brand.md +36 -0
- package/skills/lark-doc/references/genres/route-platform.md +9 -0
- package/skills/lark-doc/references/genres/route-report.md +10 -0
- package/skills/lark-doc/references/genres/route-workplace.md +17 -0
- package/skills/lark-doc/references/genres/sop-tutorial.md +41 -0
- package/skills/lark-doc/references/genres/technical-doc.md +39 -0
- package/skills/lark-doc/references/genres/wechat.md +39 -0
- package/skills/lark-doc/references/genres/weekly-report.md +24 -0
- package/skills/lark-doc/references/genres/white-paper.md +32 -0
- package/skills/lark-doc/references/genres/xiaohongshu.md +38 -0
- package/skills/lark-doc/references/lark-doc-create-workflow.md +121 -0
- package/skills/lark-doc/references/lark-doc-create.md +22 -48
- package/skills/lark-doc/references/lark-doc-fetch.md +80 -92
- package/skills/lark-doc/references/lark-doc-history.md +16 -15
- package/skills/lark-doc/references/lark-doc-md.md +5 -1
- package/skills/lark-doc/references/lark-doc-media-download.md +2 -1
- package/skills/lark-doc/references/lark-doc-script.md +76 -0
- package/skills/lark-doc/references/lark-doc-update.md +73 -221
- package/skills/lark-doc/references/lark-doc-whiteboard.md +5 -9
- package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +17 -12
- package/skills/lark-doc/references/lark-doc-xml.md +38 -167
- package/skills/lark-drive/SKILL.md +11 -7
- package/skills/lark-drive/references/lark-drive-apply-permission.md +1 -1
- package/skills/lark-drive/references/lark-drive-copy.md +87 -0
- package/skills/lark-drive/references/lark-drive-download.md +29 -2
- package/skills/lark-drive/references/lark-drive-export.md +4 -0
- package/skills/lark-drive/references/lark-drive-member-remove.md +59 -0
- package/skills/lark-drive/references/lark-drive-preview.md +21 -2
- package/skills/lark-drive/references/lark-drive-push.md +5 -1
- package/skills/lark-drive/references/lark-drive-search.md +2 -0
- package/skills/lark-drive/references/lark-drive-task-result.md +3 -0
- package/skills/lark-drive/references/lark-drive-update-title.md +78 -0
- package/skills/lark-event/SKILL.md +7 -4
- package/skills/lark-event/references/lark-event-vc.md +8 -2
- package/skills/lark-im/SKILL.md +14 -9
- package/skills/lark-im/references/lark-im-chat-list.md +9 -2
- package/skills/lark-im/references/lark-im-chat-members-list.md +7 -4
- package/skills/lark-im/references/lark-im-chat-messages-list.md +10 -3
- package/skills/lark-im/references/lark-im-chat-search.md +9 -2
- package/skills/lark-im/references/lark-im-feed-group-list-item.md +2 -2
- package/skills/lark-im/references/lark-im-feed-group-list.md +2 -2
- package/skills/lark-im/references/lark-im-feed-shortcut-list.md +1 -1
- package/skills/lark-im/references/lark-im-flag-list.md +2 -2
- package/skills/lark-im/references/lark-im-message-enrichment.md +1 -1
- package/skills/lark-im/references/lark-im-messages-resources-download.md +19 -25
- package/skills/lark-im/references/lark-im-messages-search.md +4 -5
- package/skills/lark-im/references/lark-im-threads-messages-list.md +8 -4
- package/skills/lark-mail/references/lark-mail-triage.md +19 -4
- package/skills/lark-minutes/SKILL.md +12 -6
- package/skills/lark-minutes/references/lark-minutes-apply-permission.md +95 -0
- package/skills/lark-minutes/references/lark-minutes-detail.md +7 -6
- package/skills/lark-minutes/references/lark-minutes-download.md +4 -2
- package/skills/lark-minutes/references/lark-minutes-search.md +6 -7
- package/skills/lark-note/SKILL.md +13 -9
- package/skills/lark-note/references/lark-note-detail.md +5 -2
- package/skills/lark-note/references/lark-note-transcript.md +2 -0
- package/skills/lark-shared/SKILL.md +39 -3
- package/skills/lark-sheets/SKILL.md +83 -82
- package/skills/lark-sheets/references/lark-sheets-batch-update.md +13 -58
- package/skills/lark-sheets/references/lark-sheets-chart.md +2 -1
- package/skills/lark-sheets/references/lark-sheets-conditional-format.md +1 -1
- package/skills/lark-sheets/references/lark-sheets-range-operations.md +5 -5
- package/skills/lark-sheets/references/lark-sheets-read-data.md +80 -6
- package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +21 -10
- package/skills/lark-sheets/references/lark-sheets-styles-put.md +93 -0
- package/skills/lark-sheets/references/lark-sheets-visual-standards.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-workbook.md +4 -3
- package/skills/lark-sheets/references/lark-sheets-write-cells.md +40 -12
- package/skills/lark-sheets/scripts/lark_detect_subtables.py +593 -0
- package/skills/lark-sheets/scripts/lark_inspect_workbook.py +188 -0
- package/skills/lark-sheets/scripts/lark_profile_table.py +614 -0
- package/skills/lark-sheets/scripts/lark_sheet_range.py +176 -0
- package/skills/lark-sheets/scripts/lark_sheet_read_cli.py +184 -0
- package/skills/lark-sheets/scripts/sheets_df.py +21 -3
- package/skills/lark-slides/SKILL.md +64 -81
- package/skills/lark-slides/references/cli/lark-slides-add-slide.md +92 -0
- package/skills/lark-slides/references/cli/lark-slides-create.md +176 -0
- package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +65 -0
- package/skills/lark-slides/references/cli/lark-slides-history.md +132 -0
- package/skills/lark-slides/references/cli/lark-slides-media-upload.md +103 -0
- package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +259 -0
- package/skills/lark-slides/references/cli/lark-slides-screenshot.md +115 -0
- package/skills/lark-slides/references/cli/lark-slides-update-slide.md +163 -0
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +110 -0
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +188 -0
- package/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md +157 -0
- package/skills/lark-slides/references/iconpark-index.json +5 -41901
- package/skills/lark-slides/references/iconpark.md +3 -44
- package/skills/lark-slides/references/lark-slides-add-slide.md +5 -0
- package/skills/lark-slides/references/lark-slides-create.md +3 -162
- package/skills/lark-slides/references/lark-slides-delete-slide.md +5 -0
- package/skills/lark-slides/references/lark-slides-edit-workflows.md +3 -142
- package/skills/lark-slides/references/lark-slides-history.md +3 -130
- package/skills/lark-slides/references/lark-slides-media-upload.md +3 -124
- package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +3 -83
- package/skills/lark-slides/references/lark-slides-replace-slide.md +3 -235
- package/skills/lark-slides/references/lark-slides-screenshot.md +3 -95
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +3 -108
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +3 -186
- package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +3 -132
- package/skills/lark-slides/references/planning-layer.md +1 -1
- package/skills/lark-slides/references/slides_chart_demo.xml +5 -1416
- package/skills/lark-slides/references/slides_xml_schema_definition.xml +3 -3468
- package/skills/lark-slides/references/troubleshooting.md +3 -61
- package/skills/lark-slides/references/validation-checklist.md +3 -154
- package/skills/lark-slides/references/workflow/error-handling.md +62 -0
- package/skills/lark-slides/references/workflow/slides-editing.md +143 -0
- package/skills/lark-slides/references/workflow/template-editing.md +85 -0
- package/skills/lark-slides/references/workflow/validation-xml.md +156 -0
- package/skills/lark-slides/references/xml/iconpark-index.json +37458 -0
- package/skills/lark-slides/references/xml/iconpark.md +46 -0
- package/skills/lark-slides/references/xml/slides_chart_demo.xml +1415 -0
- package/skills/lark-slides/references/xml/slides_xml_schema_definition.xml +3514 -0
- package/skills/lark-slides/references/xml/xml-schema-quick-ref.md +497 -0
- package/skills/lark-slides/references/xml-schema-quick-ref.md +3 -483
- package/skills/lark-slides/scripts/iconpark_tool.py +1 -1
- package/skills/lark-slides/scripts/sxsd_validator.py +154 -10
- package/skills/lark-slides/scripts/xml_lint.py +2989 -0
- package/skills/lark-slides/scripts/xml_lint_test.py +4720 -0
- package/skills/lark-slides/scripts/xml_text_overlap_lint.py +3 -2691
- package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +5 -3788
- package/skills/lark-task/SKILL.md +12 -0
- package/skills/lark-task/references/lark-task-create.md +3 -1
- package/skills/lark-vc/SKILL.md +15 -5
- package/skills/lark-vc/references/lark-vc-detail.md +11 -6
- package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-events.md → lark-vc/references/lark-vc-meeting-events.md} +121 -20
- package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-list-active.md → lark-vc/references/lark-vc-meeting-list-active.md} +2 -2
- package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-message-send.md → lark-vc/references/lark-vc-meeting-message-send.md} +3 -3
- package/skills/lark-vc/references/lark-vc-recording.md +8 -6
- package/skills/lark-vc/references/vc-domain-boundaries.md +8 -1
- package/skills/lark-vc-agent/SKILL.md +24 -9
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +2 -2
- package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +2 -2
- package/skills/lark-whiteboard/SKILL.md +15 -8
- package/skills/lark-whiteboard/references/lark-whiteboard-export.md +4 -3
- package/skills/lark-whiteboard/references/lark-whiteboard-update.md +4 -4
- package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +19 -17
- package/skills/lark-whiteboard/routes/dsl.md +8 -2
- package/skills/lark-whiteboard/routes/mermaid.md +1 -1
- package/skills/lark-whiteboard/routes/svg-edit.md +5 -2
- package/skills/lark-whiteboard/routes/svg.md +3 -1
- package/skills/lark-whiteboard/scenes/mention.md +71 -0
- package/skills/lark-wiki/SKILL.md +8 -4
- package/skills/lark-wiki/references/lark-wiki-delete-space.md +6 -3
- package/skills/lark-wiki/references/lark-wiki-node-copy.md +5 -19
- package/skills/lark-wiki/references/lark-wiki-node-create.md +19 -2
- package/skills/lark-wiki/references/lark-wiki-node-get.md +15 -0
- package/skills/lark-wiki/references/lark-wiki-node-list.md +1 -1
- package/skills/lark-base/references/lark-base-data-analysis-sop.md +0 -210
- package/skills/lark-base/references/lark-base-data-query-guide.md +0 -61
- package/skills/lark-base/references/lark-base-record-upsert.md +0 -63
- package/skills/lark-doc/references/lark-doc-word-stat.md +0 -93
- package/skills/lark-doc/references/style/lark-doc-create-workflow.md +0 -47
- package/skills/lark-doc/references/style/lark-doc-style.md +0 -68
- package/skills/lark-doc/references/style/lark-doc-update-workflow.md +0 -48
- package/skills/lark-doc/scripts/doc_word_stat.py +0 -1243
- package/skills/lark-slides/references/lark-slides-replace-pages.md +0 -95
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +0 -219
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +0 -126
|
@@ -1,46 +1,5 @@
|
|
|
1
|
-
# IconPark
|
|
1
|
+
# IconPark 图标(兼容入口)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文档已迁移至 [`xml/iconpark.md`](xml/iconpark.md)。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
python3 skills/lark-slides/scripts/iconpark_tool.py search --query "增长趋势" --limit 8
|
|
9
|
-
python3 skills/lark-slides/scripts/iconpark_tool.py resolve --name chart-line
|
|
10
|
-
python3 skills/lark-slides/scripts/iconpark_tool.py list-categories
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
`search` 返回 JSON 数组,每项包含 `iconType`、`category`、`name`、`tags`、`score`。直接把选中的 `iconType` 写入 XML,并为图标指定可见颜色:
|
|
14
|
-
|
|
15
|
-
```xml
|
|
16
|
-
<icon iconType="iconpark/Charts/chart-line.svg" topLeftX="80" topLeftY="120" width="32" height="32">
|
|
17
|
-
<fill>
|
|
18
|
-
<fillColor color="rgba(37, 99, 235, 1)"/>
|
|
19
|
-
</fill>
|
|
20
|
-
</icon>
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## 使用规则
|
|
24
|
-
|
|
25
|
-
- 默认先检索:语义图标需求必须先用 `iconpark_tool.py search --limit 8` 或 `--limit 10`,让 agent 从候选里结合版面语义二次判断;不要阅读全文索引,也不要编造不存在的 `iconType`。
|
|
26
|
-
- 图标用于概念提示、步骤、状态、指标、角色和导航;不要用无关装饰图标填充版面。
|
|
27
|
-
- 常用尺寸:行内状态图标 16-24px,卡片标题图标 28-40px,主视觉图标 56-96px。
|
|
28
|
-
- 图标必须填充颜色并和背景有足够对比;深色背景优先放在浅色圆形/方形底上,或使用 `rgba(255, 255, 255, 1)` 作为图标填充色。
|
|
29
|
-
- 查不到合适图标时,从高频示例里选择替代图标(随机选择,不要千篇一律),不留空图标位。
|
|
30
|
-
|
|
31
|
-
## 高频示例
|
|
32
|
-
|
|
33
|
-
| 语义 | iconType |
|
|
34
|
-
|---|---|
|
|
35
|
-
| 设置/配置 | `iconpark/Base/setting.svg` |
|
|
36
|
-
| 目标 | `iconpark/Base/aiming.svg` |
|
|
37
|
-
| 增长趋势 | `iconpark/Charts/positive-dynamics.svg` |
|
|
38
|
-
| 折线趋势 | `iconpark/Charts/chart-line.svg` |
|
|
39
|
-
| 占比 | `iconpark/Charts/chart-proportion.svg` |
|
|
40
|
-
| 数据看板 | `iconpark/Charts/data-screen.svg` |
|
|
41
|
-
| 成功 | `iconpark/Character/check-one.svg` |
|
|
42
|
-
| 失败/风险 | `iconpark/Character/close-one.svg` |
|
|
43
|
-
| 团队/用户 | `iconpark/Peoples/peoples.svg` |
|
|
44
|
-
| 安全防护 | `iconpark/Safe/protect.svg` |
|
|
45
|
-
| 全球/市场 | `iconpark/Travel/world.svg` |
|
|
46
|
-
| 邮件/联系 | `iconpark/Office/envelope-one.svg` |
|
|
5
|
+
此文件仅保留旧路径兼容性;后续引用请使用新路径。
|
|
@@ -1,164 +1,5 @@
|
|
|
1
|
+
# slides +create(创建飞书幻灯片)(兼容入口)
|
|
1
2
|
|
|
2
|
-
|
|
3
|
+
本文档已迁移至 [`cli/lark-slides-create.md`](cli/lark-slides-create.md)。
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
提交源必须是直接生成的单页 `<slide>` XML。禁止从完整 `<presentation>` XML 解析、拆分、重序列化出 slide 数组再提交。
|
|
7
|
-
|
|
8
|
-
本命令只从零创建演示文稿,没有导入本地 PPT 文件的参数。要把已有 PPTX 变成 Slides,用 `drive +import --file <x.pptx> --type slides`,再在导入结果上编辑,流程见 [lark-slides-pptx-template-workflows.md](lark-slides-pptx-template-workflows.md)。
|
|
9
|
-
|
|
10
|
-
## 创建方式选择
|
|
11
|
-
|
|
12
|
-
| 场景 | 推荐方式 |
|
|
13
|
-
|------|----------|
|
|
14
|
-
| 简单 XML(1-3 页、结构简单、几乎无复杂中文和特殊字符) | `slides +create --slides '[...]'` 一步创建 |
|
|
15
|
-
| 复杂 XML(多页、含中文、大段文本、复杂布局、嵌套引号、特殊字符较多) | **两步创建**:先 `slides +create` 创建空白 PPT,再用 [`xml_presentation.slide create`](lark-slides-xml-presentation-slide-create.md) 逐页添加 |
|
|
16
|
-
| 已有 PPT 继续追加或插入页面 | 使用 [`xml_presentation.slide create`](lark-slides-xml-presentation-slide-create.md),必要时配合 `before_slide_id` |
|
|
17
|
-
|
|
18
|
-
> [!WARNING]
|
|
19
|
-
> `--slides '[...]'` 的风险点主要在 shell 参数传递,而不是单纯页数。即使只有 1 页,只要 XML 足够复杂,也建议使用两步创建法。
|
|
20
|
-
> [!IMPORTANT]
|
|
21
|
-
> `slides +create --slides` 底层会逐页创建,不是原子操作。中途失败时先记录 `xml_presentation_id`,回读确认当前状态,再继续修复或追加。
|
|
22
|
-
|
|
23
|
-
## 命令
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# 创建空白 PPT
|
|
27
|
-
lark-cli slides +create --title "项目汇报"
|
|
28
|
-
|
|
29
|
-
# 创建 PPT + 添加 slide 页面
|
|
30
|
-
lark-cli slides +create --title "项目汇报" --slides '[
|
|
31
|
-
"<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>封面</p></content></shape></data></slide>",
|
|
32
|
-
"<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>第二页</p></content></shape></data></slide>"
|
|
33
|
-
]'
|
|
34
|
-
|
|
35
|
-
# 以应用身份创建(自动授权当前用户)
|
|
36
|
-
lark-cli slides +create --title "项目汇报" --as bot
|
|
37
|
-
|
|
38
|
-
# 预览(不执行)
|
|
39
|
-
lark-cli slides +create --title "项目汇报" --slides '[...]' --dry-run
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
复杂内容建议按页保存 XML,再用 `jq --rawfile` 组装 `--slides` 参数:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
lark-cli slides +create --as user --title "项目汇报" \
|
|
46
|
-
--slides "$(jq -n \
|
|
47
|
-
--rawfile s1 .lark-slides/plan/project/slide-01.xml \
|
|
48
|
-
--rawfile s2 .lark-slides/plan/project/slide-02.xml \
|
|
49
|
-
'[$s1, $s2]')"
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
`--rawfile` 会把文件内容作为字符串读入 JSON,自动处理 XML 中的引号和换行;不要手动拼接带大量转义符的 JSON 字符串。
|
|
53
|
-
|
|
54
|
-
## 返回值
|
|
55
|
-
|
|
56
|
-
工具成功执行后,返回一个 JSON 对象,包含以下字段:
|
|
57
|
-
|
|
58
|
-
- **`xml_presentation_id`**(string):演示文稿的唯一标识符,后续添加页面时需要此 ID
|
|
59
|
-
- **`title`**(string):演示文稿标题
|
|
60
|
-
- **`url`**(string,可选):演示文稿的在线链接,如有返回则务必展示给用户(需要 drive 相关权限;若获取失败则不返回此字段)
|
|
61
|
-
- **`revision_id`**(integer):演示文稿版本号
|
|
62
|
-
- **`slide_ids`**(string[],可选):仅传 `--slides` 时返回,成功添加的页面 ID 列表
|
|
63
|
-
- **`slides_added`**(integer,可选):仅传 `--slides` 时返回,成功添加的页面数量
|
|
64
|
-
- **`images_uploaded`**(integer,可选):仅 `--slides` 中含 `@<本地路径>` 占位符时返回,已上传的去重后图片数量
|
|
65
|
-
- **`permission_grant`**(object,可选):仅 `--as bot` 时返回,说明是否已自动为当前 CLI 用户授予可管理权限
|
|
66
|
-
|
|
67
|
-
> [!IMPORTANT]
|
|
68
|
-
> 不传 `--slides` 时,`slides +create` 只创建空白演示文稿。创建后需要使用 `xml_presentation.slide create` 逐页添加 slide 内容。
|
|
69
|
-
>
|
|
70
|
-
> 传了 `--slides` 时,CLI 先创建空白演示文稿,再逐页调用 `xml_presentation.slide create` 添加页面。如果某一页添加失败,CLI 会停止并报错,已创建的演示文稿和已添加的页面会保留。
|
|
71
|
-
>
|
|
72
|
-
> 如果演示文稿是**以应用身份(bot)创建**的,如 `lark-cli slides +create --as bot`,CLI 会**尝试为当前 CLI 用户自动授予该演示文稿的 `full_access`(可管理权限)**。
|
|
73
|
-
>
|
|
74
|
-
> 以应用身份创建时,结果里会额外返回 `permission_grant` 字段,明确说明授权结果:
|
|
75
|
-
> - `status = granted`:当前 CLI 用户已获得该演示文稿的可管理权限
|
|
76
|
-
> - `status = skipped`:本地没有可用的当前用户 `open_id`,因此不会自动授权
|
|
77
|
-
> - `status = failed`:演示文稿已创建成功,但自动授权用户失败
|
|
78
|
-
>
|
|
79
|
-
> **不要擅自执行 owner 转移。** 如果用户需要把 owner 转给自己,必须单独确认。
|
|
80
|
-
|
|
81
|
-
## 参数
|
|
82
|
-
|
|
83
|
-
| 参数 | 必填 | 说明 |
|
|
84
|
-
|------|------|------|
|
|
85
|
-
| `--title` | 否 | 演示文稿标题(不传则默认 "Untitled") |
|
|
86
|
-
| `--slides` | 否 | slide 内容 JSON 数组,每个元素是一个 `<slide>` XML 字符串(最多 10 个;超过 10 页请先用 `+create` 创建空白 PPT,再用 `xml_presentation.slide create` 逐页添加) |
|
|
87
|
-
|
|
88
|
-
## `--slides` 参数格式
|
|
89
|
-
|
|
90
|
-
```json
|
|
91
|
-
[
|
|
92
|
-
"<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...第1页XML...</slide>",
|
|
93
|
-
"<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...第2页XML...</slide>"
|
|
94
|
-
]
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
JSON string 数组,每个元素是一页 slide 的完整 XML。CLI 内部负责包装成 API 所需的 `{"slide": {"content": "..."}}` 格式并逐页调用。
|
|
98
|
-
|
|
99
|
-
### 本地图片:`@<path>` 占位符
|
|
100
|
-
|
|
101
|
-
`<img>` 元素的 `src` 属性如果以 `@` 开头,CLI 会把它当作本地文件路径,自动上传到当前演示文稿,并把占位符替换为返回的 `file_token`。
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
lark-cli slides +create --as user --title "图测试" --slides '[
|
|
105
|
-
"<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><img src=\"@./assets/chart.png\" topLeftX=\"100\" topLeftY=\"100\" width=\"320\" height=\"180\"/></data></slide>"
|
|
106
|
-
]'
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
行为:
|
|
110
|
-
|
|
111
|
-
- 路径相对于**当前工作目录**(CWD)解析;**必须是 CWD 内的相对路径**(如 `./pic.png`、`./assets/x.png`)
|
|
112
|
-
- 同一份图被多次引用时**只上传一次**(按路径去重)
|
|
113
|
-
- `src` 不以 `@` 开头的会原样保留,但**只允许写 `slides +media-upload` 拿到的 `file_token`**;**禁止写 http(s) 外链 URL**:飞书 slides 渲染端不会代理外链图片,外链 src 通常显示破图。要用网图必须先下载到 CWD 内、再走上传流程
|
|
114
|
-
- 单张图片最大 20 MB(slides upload API 不支持分片上传)
|
|
115
|
-
- 校验阶段就会检查所有占位符文件存在及大小;缺文件或超限直接报错,不会创建空白 PPT 占位
|
|
116
|
-
- 创空白 PPT → 上传所有图 → 替换 token → 逐页创建 slide,按这个顺序执行
|
|
117
|
-
|
|
118
|
-
> [!IMPORTANT]
|
|
119
|
-
> **路径必须在 CWD 内**:`@/abs/path/x.png` 或 `@../up/x.png` 这种会被 CLI 拒绝(报 `unsafe file path`)。如果素材在别的目录,先 `cd` 过去再执行。
|
|
120
|
-
|
|
121
|
-
### 给已有 PPT 加带图新页
|
|
122
|
-
|
|
123
|
-
`+create --slides` 只在新建 PPT 时使用 `@` 占位符。给已有 PPT 加带图新页要分两步(CLI 没封装这个组合):
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
# 1) 上传图片
|
|
127
|
-
TOKEN=$(lark-cli slides +media-upload --as user \
|
|
128
|
-
--file ./pic.png --presentation $PRES_ID | jq -r .data.file_token)
|
|
129
|
-
|
|
130
|
-
# 2) 用返回的 file_token 创建带图新页
|
|
131
|
-
lark-cli slides xml_presentation.slide create --as user \
|
|
132
|
-
--params "{\"xml_presentation_id\":\"$PRES_ID\"}" \
|
|
133
|
-
--data "{\"slide\":{\"content\":\"<slide xmlns=\\\"http://www.larkoffice.com/sml/2.0\\\"><data><img src=\\\"$TOKEN\\\" topLeftX=\\\"100\\\" topLeftY=\\\"100\\\" width=\\\"200\\\" height=\\\"200\\\"/></data></slide>\"}}"
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## 创建后续步骤
|
|
137
|
-
|
|
138
|
-
如果没有使用 `--slides`,`slides +create` 返回的 `xml_presentation_id` 用于后续操作:
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
# 第 1 步:创建空白 PPT
|
|
142
|
-
PRES_ID=$(lark-cli slides +create --title "项目汇报" | jq -r '.data.xml_presentation_id')
|
|
143
|
-
|
|
144
|
-
# 第 2 步:添加页面(使用返回的 xml_presentation_id)
|
|
145
|
-
lark-cli slides xml_presentation.slide create --as user \
|
|
146
|
-
--params "{\"xml_presentation_id\":\"$PRES_ID\"}" \
|
|
147
|
-
--data '{
|
|
148
|
-
"slide": {
|
|
149
|
-
"content": "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...</slide>"
|
|
150
|
-
}
|
|
151
|
-
}'
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## 常见错误
|
|
155
|
-
|
|
156
|
-
| 错误码 | 含义 | 解决方案 |
|
|
157
|
-
|--------|------|----------|
|
|
158
|
-
| 400 | 参数错误 | 检查参数格式是否正确 |
|
|
159
|
-
| 403 | 权限不足 | 检查是否拥有 `slides:presentation:create` 和 `slides:presentation:write_only` scope |
|
|
160
|
-
|
|
161
|
-
## 相关命令
|
|
162
|
-
|
|
163
|
-
- [xml_presentation.slide create](lark-slides-xml-presentation-slide-create.md) — 添加幻灯片页面
|
|
164
|
-
- [slides +xml-get](lark-slides-xml-presentations-get.md) — 读取 PPT 内容并保存到本地文件
|
|
5
|
+
此文件仅保留旧路径兼容性;后续引用请使用新路径。
|
|
@@ -1,144 +1,5 @@
|
|
|
1
|
-
# 编辑已有 PPT
|
|
1
|
+
# 编辑已有 PPT:读-改-写闭环(兼容入口)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文档已迁移至 [`workflow/slides-editing.md`](workflow/slides-editing.md)。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## 决策树:block_replace vs block_insert
|
|
8
|
-
|
|
9
|
-
| 需求 | 推荐 action | 理由 |
|
|
10
|
-
|------|------------|------|
|
|
11
|
-
| 已知某块的 `block_id`,要换这块内容(改标题、换图、挪坐标) | `block_replace` | 精准替换,原子性好;`replacement` 根 `id` 由 CLI 自动注入为 `block_id` |
|
|
12
|
-
| 只加 1~N 个元素、不动现有布局 | `block_insert` | 新增不覆盖,可选 `insert_before_block_id` 指定位置 |
|
|
13
|
-
| 一次动多个元素(如:换标题 + 加图) | 单次 `--parts` 里拼多条 | 整批作为原子事务,任一失败整批不生效;`block_replace` 和 `block_insert` 可混用 |
|
|
14
|
-
| 多页版式重建、整页坐标重排 | `+replace-pages` | 原 presentation 内批量 create-before/delete-old,不生成新 Slides 链接 |
|
|
15
|
-
|
|
16
|
-
> **没有字段级 patch**:即便只想改一个 `shape` 的 `topLeftX`,也得把整个块的新 XML 写出来用 `block_replace`。这不是"微调",是块级重写。
|
|
17
|
-
|
|
18
|
-
## 最小读-改-写闭环
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
PID="xml_presentation_id_here"
|
|
22
|
-
SID="slide_id_here"
|
|
23
|
-
|
|
24
|
-
# 1. 读原页,从 XML 里挑出要改的块的 3 位 short id(如 bUn / bab)
|
|
25
|
-
lark-cli slides xml_presentation.slide get --as user \
|
|
26
|
-
--params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}"
|
|
27
|
-
|
|
28
|
-
# 2. 用 +replace-slide 直接改那个块(不需要搬原 XML)
|
|
29
|
-
lark-cli slides +replace-slide --as user \
|
|
30
|
-
--presentation "$PID" --slide-id "$SID" \
|
|
31
|
-
--parts '[{"action":"block_replace","block_id":"bUn","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"}]'
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
`slide_id` / 页序不会变。`block_replace` 的 `replacement` 根元素 `id` 会自动注入为 `block_id`,用户手写 XML 时不需要自己加。
|
|
35
|
-
|
|
36
|
-
## `revision_id` 参数
|
|
37
|
-
|
|
38
|
-
`--revision-id` 默认 `-1`,表示基于当前最新版执行。传具体版本号时,服务端以该版本为 base 应用变更:
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
# 读时拿当前 revision_id
|
|
42
|
-
REV=$(lark-cli slides xml_presentation.slide get --as user \
|
|
43
|
-
--params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}" \
|
|
44
|
-
| jq '.data.revision_id')
|
|
45
|
-
|
|
46
|
-
# 写时传该版本号,服务端以此为 base
|
|
47
|
-
lark-cli slides +replace-slide --as user \
|
|
48
|
-
--presentation "$PID" --slide-id "$SID" --revision-id "$REV" \
|
|
49
|
-
--parts '[{"action":"block_replace","block_id":"bUn","replacement":"<shape type=\"rect\" topLeftX=\"100\" topLeftY=\"100\" width=\"200\" height=\"100\"/>"}]'
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
注意:传不存在的版本号(超过当前 revision)会返回 3350002 not found;不确定时用 `-1` 即可。
|
|
53
|
-
|
|
54
|
-
## `--tid` 事务锁
|
|
55
|
-
|
|
56
|
-
跨请求的并发事务 ID,多人协作长事务才用得上。**单人单次调用留空**即可。
|
|
57
|
-
|
|
58
|
-
## 两种 action 详解
|
|
59
|
-
|
|
60
|
-
### block_replace — 整块替换
|
|
61
|
-
|
|
62
|
-
适合"已知块 ID,要换这块整体内容"的场景。`replacement` 根元素的 `id="<block_id>"` 由 CLI 自动注入(用户手写的 XML 如果没带 `id` 直接省略即可;如果带了错的会被覆盖为正确值)。
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
lark-cli slides +replace-slide --as user \
|
|
66
|
-
--presentation "$PID" --slide-id "$SID" \
|
|
67
|
-
--parts '[{"action":"block_replace","block_id":"bab","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"}]'
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
字段说明:
|
|
71
|
-
|
|
72
|
-
| 字段 | 必填 | 说明 |
|
|
73
|
-
|------|------|------|
|
|
74
|
-
| `action` | 是 | 固定为 `block_replace` |
|
|
75
|
-
| `block_id` | 是 | 目标块的 3 位 short element ID(从 `slide.get` 返回的 XML 里读)|
|
|
76
|
-
| `replacement` | 是 | 新 XML 片段;根元素 `id` 会被 CLI 自动注入为 `block_id` |
|
|
77
|
-
|
|
78
|
-
### block_insert — 整块插入
|
|
79
|
-
|
|
80
|
-
适合"只想加一个元素,不动现有元素"的场景(典型:给已有页加图)。
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
lark-cli slides +replace-slide --as user \
|
|
84
|
-
--presentation "$PID" --slide-id "$SID" \
|
|
85
|
-
--parts "$(jq -n --arg token "$FILE_TOKEN" \
|
|
86
|
-
'[{action:"block_insert",insertion:("<img src=\""+$token+"\" topLeftX=\"500\" topLeftY=\"100\" width=\"200\" height=\"150\"/>"),insert_before_block_id:"baa"}]')"
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
字段说明:
|
|
90
|
-
|
|
91
|
-
| 字段 | 必填 | 说明 |
|
|
92
|
-
|------|------|------|
|
|
93
|
-
| `action` | 是 | 固定为 `block_insert` |
|
|
94
|
-
| `insertion` | 是 | 要插入的完整 XML 片段 |
|
|
95
|
-
| `insert_before_block_id` | 否 | 插到这个块之前;省略(不提供此字段)则追加到页面末尾 |
|
|
96
|
-
|
|
97
|
-
> **`<img>` 必须用 `file_token`**,不能用外链 URL——先 `slides +media-upload --file ./pic.png --presentation $PID` 拿 token。
|
|
98
|
-
|
|
99
|
-
### 批量 parts
|
|
100
|
-
|
|
101
|
-
一次 `--parts` 最多 200 条,按数组顺序串行执行。`block_replace` 和 `block_insert` 可以在同一批次混用。举例:一次性把标题块替换、然后在末尾追加一个装饰图。
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
lark-cli slides +replace-slide --as user \
|
|
105
|
-
--presentation "$PID" --slide-id "$SID" \
|
|
106
|
-
--parts '[
|
|
107
|
-
{"action":"block_replace","block_id":"bab","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"},
|
|
108
|
-
{"action":"block_insert","insertion":"<img src=\"<file_token>\" topLeftX=\"700\" topLeftY=\"400\" width=\"180\" height=\"100\"/>"}
|
|
109
|
-
]'
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
整批作为原子事务:任一条失败整批不生效。失败时后端通常返回 3350001;若响应中带 `failed_part_index` / `failed_reason` 字段,shortcut 会原样透传。
|
|
113
|
-
|
|
114
|
-
## 大 --parts 用 jq 或 stdin 组装
|
|
115
|
-
|
|
116
|
-
`--parts` 支持 `@file`(读文件)和 `-`(stdin)作为值来源,适合批量 XML 场景:
|
|
117
|
-
|
|
118
|
-
```bash
|
|
119
|
-
# 从文件读
|
|
120
|
-
lark-cli slides +replace-slide --as user --presentation "$PID" --slide-id "$SID" \
|
|
121
|
-
--parts @parts.json
|
|
122
|
-
|
|
123
|
-
# 从 stdin 读
|
|
124
|
-
cat parts.json | lark-cli slides +replace-slide --as user --presentation "$PID" --slide-id "$SID" \
|
|
125
|
-
--parts -
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## 错误排查
|
|
129
|
-
|
|
130
|
-
| 现象 | 原因 | 对策 |
|
|
131
|
-
|------|------|------|
|
|
132
|
-
| 3350001,hint 含 "block_id not found" | `parts[i].block_id` 在当前页不存在 | 重新 `slide.get` 拿最新 XML,按里面的 short ID 再填 |
|
|
133
|
-
| 3350002 not found | `--revision-id` 传了不存在的版本号 | 用 `-1` 或实际存在的 `revision_id` |
|
|
134
|
-
| `<img>` 不显示 / 显示破图 | `src` 写了外链 URL | 换成通过 `+media-upload` 拿到的 `file_token` |
|
|
135
|
-
| 3350001(block_replace 返回) | 正常情况下 CLI 已自动注入 `id` 和 `<content/>`;如果仍报错,确认 `block_id` 在当前页存在(重新 `slide.get`),检查 XML 结构是否合法;坐标是否超出 960×540 范围 | — |
|
|
136
|
-
|
|
137
|
-
## 相关文档
|
|
138
|
-
|
|
139
|
-
- [lark-slides-replace-slide.md](lark-slides-replace-slide.md) — +replace-slide shortcut 参数详情
|
|
140
|
-
- [lark-slides-replace-pages.md](lark-slides-replace-pages.md) — 多页整页重建 shortcut
|
|
141
|
-
- [lark-slides-xml-presentation-slide-get.md](lark-slides-xml-presentation-slide-get.md) — slide.get 参考(拿 `block_id` / `revision_id`)
|
|
142
|
-
- [lark-slides-xml-presentation-slide-replace.md](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考(一般直接用 shortcut 即可)
|
|
143
|
-
- [lark-slides-media-upload.md](lark-slides-media-upload.md) — 上传图片拿 file_token
|
|
144
|
-
- [xml-schema-quick-ref.md](xml-schema-quick-ref.md) — XML 元素和属性速查
|
|
5
|
+
此文件仅保留旧路径兼容性;后续引用请使用新路径。
|
|
@@ -1,132 +1,5 @@
|
|
|
1
|
-
# slides history
|
|
1
|
+
# slides history(历史版本与回滚)(兼容入口)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文档已迁移至 [`cli/lark-slides-history.md`](cli/lark-slides-history.md)。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## 安全流程
|
|
8
|
-
|
|
9
|
-
1. 先用分页接口 `+history-list` 找到目标版本的 `history_version_id`。
|
|
10
|
-
2. 如果用户指定的是 `revision_id`,不要假设它唯一,也不要把 `revision_id` 直接传给 `+history-revert`。先拉一页并在 `entries[]` 中筛选 `revision_id` 相同的候选;如果未匹配到且 `has_more=true`,继续用 `page_token` 翻页;如果已匹配到候选,最多额外再拉一页补齐可能跨页的相邻候选。最终优先根据用户目标时间与 `edit_time` 的接近程度选择最合适的一条,取同一条的 `history_version_id`;如果没有目标时间,或多个候选无法可靠区分,再向用户展示候选版本(`history_version_id`、`revision_id`、`edit_time`、`name/description`)并确认后回滚。
|
|
11
|
-
3. 如果用户指定的是某一时刻但没有指定 `revision_id`,按 `entries[].edit_time` 匹配;优先选择不晚于目标时刻的最近一条历史记录,无法明确匹配时先向用户确认候选版本。
|
|
12
|
-
4. 使用 `+history-revert` 发起回滚。接口会立即返回 `task_id`,回滚任务在服务端异步执行。
|
|
13
|
-
5. 如果返回 `status: running`,保存 `task_id`,按照返回的 `poll_after_ms` 等待后调用 `+history-revert-status`。任务创建成功后,不得因为状态查询失败而重新发起回滚。
|
|
14
|
-
6. 状态变为 `done`、`partial_failed` 或 `failed` 后停止轮询;达到整体轮询上限时也停止轮询,并向用户返回 `task_id` 和当前状态。
|
|
15
|
-
7. 回滚完成后,用 `slides +xml-get` 或 `slides xml_presentations get` 读取演示文稿确认内容。
|
|
16
|
-
|
|
17
|
-
## 按 revision_id 或时间点回滚
|
|
18
|
-
|
|
19
|
-
当用户说“回滚到 revision_id=42”“恢复到昨天下午 3 点的版本”这类需求时,流程是:
|
|
20
|
-
|
|
21
|
-
1. 执行 `slides +history-list --presentation <presentation>` 获取第一页历史记录;`+history-list` 是分页接口,只有 `has_more=true` 且还需要更多候选时才继续传 `--page-token` 翻页。
|
|
22
|
-
2. 如果用户给出 `revision_id`:先筛选当前页中 `entries[].revision_id == 用户给出的 revision_id`。如果未命中且 `has_more=true`,继续拉下一页;如果已经命中候选,最多额外再拉一页,补齐同一个 `revision_id` 可能跨页出现的相邻 `history_version_id`。若用户同时给出目标时间,在候选里选择 `edit_time` 与目标时间最接近的一条;若未给目标时间但候选只有一条,可直接使用;若多个候选无法可靠区分,不要自行取第一条,向用户展示候选并确认。
|
|
23
|
-
3. 如果用户只给出时间:用 `entries[].edit_time` 匹配,选择目标时刻之前最近的一条;如果用户表达的是“最接近某时刻”,则选择绝对时间差最小的一条。
|
|
24
|
-
4. 从最终匹配条目读取 `history_version_id`。`history_version_id` 对应服务端 `minor_history.version`,这是回滚接口需要的 ID。
|
|
25
|
-
5. 执行 `slides +history-revert --presentation <presentation> --history-version-id <history_version_id>`。
|
|
26
|
-
|
|
27
|
-
候选确认时使用类似格式:
|
|
28
|
-
|
|
29
|
-
```text
|
|
30
|
-
同一个 revision_id 命中多个历史版本,请确认要回滚哪一条:
|
|
31
|
-
- history_version_id=11 revision_id=42 edit_time=2026-06-22T12:24:45Z name=...
|
|
32
|
-
- history_version_id=12 revision_id=42 edit_time=2026-06-22T12:25:14Z name=...
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## 命令
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
# 列出历史版本
|
|
39
|
-
lark-cli slides +history-list --presentation "<slides_url_or_token>" --page-size 20
|
|
40
|
-
|
|
41
|
-
# 翻页
|
|
42
|
-
lark-cli slides +history-list --presentation "<slides_url_or_token>" --page-size 20 --page-token "<page_token>"
|
|
43
|
-
|
|
44
|
-
# 发起回滚任务,立即返回 task_id
|
|
45
|
-
lark-cli slides +history-revert --presentation "<slides_url_or_token>" --history-version-id 42
|
|
46
|
-
|
|
47
|
-
# 查询回滚任务状态
|
|
48
|
-
lark-cli slides +history-revert-status --presentation "<slides_url_or_token>" --task-id "<task_id>"
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## 参数
|
|
52
|
-
|
|
53
|
-
| 命令 | 参数 | 必填 | 说明 |
|
|
54
|
-
|-|-|-|-|
|
|
55
|
-
| `+history-list` | `--presentation` | 是 | `xml_presentation_id`、Slides URL,或可解析为 Slides 的 wiki URL |
|
|
56
|
-
| `+history-list` | `--page-size` | 否 | 返回条数,范围 `1-20`,默认 `20` |
|
|
57
|
-
| `+history-list` | `--page-token` | 否 | 上一页返回的 `page_token` |
|
|
58
|
-
| `+history-revert` | `--presentation` | 是 | 同一个演示文稿 |
|
|
59
|
-
| `+history-revert` | `--history-version-id` | 是 | `+history-list` 返回的 `history_version_id`,必须大于 0 |
|
|
60
|
-
| `+history-revert-status` | `--presentation` | 是 | 同一个演示文稿 |
|
|
61
|
-
| `+history-revert-status` | `--task-id` | 是 | `+history-revert` 返回的 `task_id` |
|
|
62
|
-
|
|
63
|
-
## 异步轮询策略
|
|
64
|
-
|
|
65
|
-
1. `+history-revert` 返回 `task_id` 后,认为回滚任务已经成功创建。
|
|
66
|
-
2. 如果 `status` 不是 `running`,不再调用状态接口。
|
|
67
|
-
3. 如果 `status` 是 `running`,等待响应中的 `poll_after_ms` 后调用 `+history-revert-status`;`poll_after_ms` 缺失、为 `0` 或非法时,默认等待 10 秒。
|
|
68
|
-
4. 状态查询返回 `running` 时继续轮询;返回 `done`、`partial_failed` 或 `failed` 时停止。
|
|
69
|
-
5. 除非用户另有要求,默认最多轮询 5 分钟。达到上限后停止轮询,向用户说明任务仍在运行并返回 `task_id`,不得将其描述为回滚失败。
|
|
70
|
-
6. 状态查询出现临时错误时,按相同间隔最多连续重试 3 次;只重试 `+history-revert-status`,不得重新调用 `+history-revert`。
|
|
71
|
-
7. `done` 后读取当前演示文稿内容进行验证。
|
|
72
|
-
8. `partial_failed` 或 `failed` 时展示 `failed_block_tokens`;除非用户明确确认,不得自动再次发起回滚。
|
|
73
|
-
|
|
74
|
-
## 返回值要点
|
|
75
|
-
|
|
76
|
-
`+history-list` 返回:
|
|
77
|
-
|
|
78
|
-
```json
|
|
79
|
-
{
|
|
80
|
-
"entries": [
|
|
81
|
-
{
|
|
82
|
-
"revision_id": 42,
|
|
83
|
-
"history_version_id": "11",
|
|
84
|
-
"edit_time": "2026-06-22T12:24:45Z",
|
|
85
|
-
"type": 1,
|
|
86
|
-
"name": "版本名",
|
|
87
|
-
"description": "版本说明",
|
|
88
|
-
"editor_ids": ["ou_xxx"]
|
|
89
|
-
}
|
|
90
|
-
],
|
|
91
|
-
"has_more": true,
|
|
92
|
-
"page_token": "page_token"
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
`+history-revert` 返回:
|
|
97
|
-
|
|
98
|
-
```json
|
|
99
|
-
{
|
|
100
|
-
"task_id": "task_xxx",
|
|
101
|
-
"status": "running",
|
|
102
|
-
"history_version_id": "11",
|
|
103
|
-
"poll_after_ms": 10000
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
`+history-revert-status` 返回:
|
|
108
|
-
|
|
109
|
-
```json
|
|
110
|
-
{
|
|
111
|
-
"status": "partial_failed",
|
|
112
|
-
"history_version_id": "11",
|
|
113
|
-
"failed_block_tokens": ["blk_xxx"]
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
`status` 可能是 `running`、`done`、`partial_failed`、`failed`。当状态是 `partial_failed` 或 `failed` 时,优先检查 `failed_block_tokens`。
|
|
118
|
-
|
|
119
|
-
## 回滚后验证
|
|
120
|
-
|
|
121
|
-
回滚成功后必须读取一次当前内容确认:
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
lark-cli slides +xml-get --presentation "<slides_url_or_token>" --output ./presentation.xml
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
如果只需要快速检查返回结构,也可以走 raw OpenAPI:
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
lark-cli api get "/open-apis/slides_ai/v1/xml_presentations/<xml_presentation_id>" \
|
|
131
|
-
--params '{"revision_id":-1}'
|
|
132
|
-
```
|
|
5
|
+
此文件仅保留旧路径兼容性;后续引用请使用新路径。
|
|
@@ -1,126 +1,5 @@
|
|
|
1
|
+
# slides +media-upload(兼容入口)
|
|
1
2
|
|
|
2
|
-
|
|
3
|
+
本文档已迁移至 [`cli/lark-slides-media-upload.md`](cli/lark-slides-media-upload.md)。
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
## 命令
|
|
7
|
-
|
|
8
|
-
```bash
|
|
9
|
-
# 直接传 xml_presentation_id
|
|
10
|
-
lark-cli slides +media-upload --as user \
|
|
11
|
-
--file ./pic.png \
|
|
12
|
-
--presentation slidesXXXXXXXXXXXXXXXXXXXXXX
|
|
13
|
-
|
|
14
|
-
# 传 slides URL 也行
|
|
15
|
-
lark-cli slides +media-upload --as user \
|
|
16
|
-
--file ./chart.png \
|
|
17
|
-
--presentation "https://xxx.feishu.cn/slides/slidesXXXXXXXXXXXXXXXXXXXXXX"
|
|
18
|
-
|
|
19
|
-
# 传 wiki URL(CLI 自动 wiki.spaces.get_node 解析为真实 token,校验 obj_type=slides)
|
|
20
|
-
lark-cli slides +media-upload --as user \
|
|
21
|
-
--file ./pic.png \
|
|
22
|
-
--presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX"
|
|
23
|
-
|
|
24
|
-
# 预览(不实际上传)
|
|
25
|
-
lark-cli slides +media-upload --file ./pic.png --presentation $PRES_ID --dry-run
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 返回值
|
|
29
|
-
|
|
30
|
-
```json
|
|
31
|
-
{
|
|
32
|
-
"file_token": "boxcnXXXXXXXXXXXXXXXXXXXXXX",
|
|
33
|
-
"file_name": "pic.png",
|
|
34
|
-
"size": 12345,
|
|
35
|
-
"presentation_id": "slidesXXXXXXXXXXXXXXXXXXXXXX"
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
- **`file_token`**:把它写进 `<img src="...">`
|
|
40
|
-
- **`file_name` / `size`**:上传文件元信息
|
|
41
|
-
- **`presentation_id`**:解析后的真实 `xml_presentation_id`(wiki URL 解析后会变化)
|
|
42
|
-
|
|
43
|
-
## 参数
|
|
44
|
-
|
|
45
|
-
| 参数 | 必填 | 说明 |
|
|
46
|
-
|------|------|------|
|
|
47
|
-
| `--file` | 是 | 本地图片路径,**必须是 CWD 内的相对路径**(如 `./pic.png`)。**最大 20 MB**(slides upload API 不支持分片上传) |
|
|
48
|
-
| `--presentation` | 是 | `xml_presentation_id`、`/slides/<token>` URL,或 `/wiki/<token>` URL |
|
|
49
|
-
|
|
50
|
-
> [!IMPORTANT]
|
|
51
|
-
> **路径必须在 CWD 内**:`--file /abs/path/x.png` 或 `--file ../up/x.png` 会被 CLI 拒绝(报 `unsafe file path`)。如果素材在别的目录,先 `cd` 过去再执行。
|
|
52
|
-
|
|
53
|
-
## 使用流程
|
|
54
|
-
|
|
55
|
-
### 给已有 PPT 加带图新页
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
# 1) 上传图片
|
|
59
|
-
TOKEN=$(lark-cli slides +media-upload --as user \
|
|
60
|
-
--file ./pic.png \
|
|
61
|
-
--presentation $PRES_ID | jq -r .data.file_token)
|
|
62
|
-
|
|
63
|
-
# 2) 用 file_token 创建带图新页
|
|
64
|
-
lark-cli slides xml_presentation.slide create --as user \
|
|
65
|
-
--params "{\"xml_presentation_id\":\"$PRES_ID\"}" \
|
|
66
|
-
--data "{\"slide\":{\"content\":\"<slide xmlns=\\\"http://www.larkoffice.com/sml/2.0\\\"><data><img src=\\\"$TOKEN\\\" topLeftX=\\\"100\\\" topLeftY=\\\"100\\\" width=\\\"320\\\" height=\\\"180\\\"/></data></slide>\"}}"
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### 新建带图 PPT(推荐用 `+create --slides` 的 `@` 占位符,一步到位)
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
# 不需要单独 +media-upload,写 src="@<本地路径>" 即可
|
|
73
|
-
lark-cli slides +create --as user --title "图测试" --slides '[
|
|
74
|
-
"<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><img src=\"@./pic.png\" topLeftX=\"100\" topLeftY=\"100\" width=\"320\" height=\"180\"/></data></slide>"
|
|
75
|
-
]'
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
详见 [+create 文档](lark-slides-create.md#本地图片path-占位符)。
|
|
79
|
-
|
|
80
|
-
### 给已有 PPT 的已有页加图
|
|
81
|
-
|
|
82
|
-
拿到 `file_token` 后走 [`+replace-slide`](lark-slides-replace-slide.md) 的 `block_insert`,不用搬原 XML、不改 `slide_id`、不打乱页序:
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
PRES_ID=xxx
|
|
86
|
-
SID=yyy # 要加图的那一页
|
|
87
|
-
|
|
88
|
-
# 1) 上传图片拿 file_token
|
|
89
|
-
TOKEN=$(lark-cli slides +media-upload --as user \
|
|
90
|
-
--file ./pic.png --presentation $PRES_ID | jq -r '.data.file_token')
|
|
91
|
-
|
|
92
|
-
# 2) block_insert 到页末(或用 insert_before_block_id 指定插入位置)
|
|
93
|
-
lark-cli slides +replace-slide --as user \
|
|
94
|
-
--presentation "$PRES_ID" --slide-id "$SID" \
|
|
95
|
-
--parts "$(jq -n --arg token "$TOKEN" \
|
|
96
|
-
'[{action:"block_insert",insertion:("<img src=\""+$token+"\" topLeftX=\"500\" topLeftY=\"100\" width=\"200\" height=\"150\"/>")}]')"
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
注意事项:
|
|
100
|
-
|
|
101
|
-
1. **`<img>` 坐标避开现有元素** —— 先读现有元素 bbox 挑空白区;空间不够就先用 `block_replace` 挪动/缩小现有元素后再放图
|
|
102
|
-
2. **`<img>` 的 `width:height` 对齐原图比例** —— 比例不一致会被裁剪,参见 [xml-schema-quick-ref.md](xml-schema-quick-ref.md) `<img>` 说明
|
|
103
|
-
|
|
104
|
-
## 工作原理
|
|
105
|
-
|
|
106
|
-
`+media-upload` 内部调用 `POST /open-apis/drive/v1/medias/upload_all`(单次上传,最大 20 MB),固定使用:
|
|
107
|
-
|
|
108
|
-
- `parent_type=slide_file`(slides 后端唯一接受的取值)
|
|
109
|
-
- `parent_node=<xml_presentation_id>`
|
|
110
|
-
|
|
111
|
-
**不要尝试用 `slides_image`、`slide_image` 等 parent_type**——后端会返回 1061001 / 1061002 错误。这是 slides 的特殊约定。
|
|
112
|
-
|
|
113
|
-
## 常见错误
|
|
114
|
-
|
|
115
|
-
| 错误码 | 含义 | 解决方案 |
|
|
116
|
-
|--------|------|----------|
|
|
117
|
-
| 1061002 | params error / 不支持的 parent_type | 不要用原生 API 自己拼 parent_type;用 `+media-upload` 即可 |
|
|
118
|
-
| 1061004 | forbidden:当前身份对该演示文稿无编辑权限 | 确认当前身份(user 或 bot)对目标 PPT 有编辑权限。bot 模式常见原因:PPT 不是该 bot 创建的——可用 `+create --as bot` 新建,或以 user 身份给 bot 授权 `lark-cli drive permission.members create --as user ...` |
|
|
119
|
-
| 1061044 | parent node not exist | `--presentation` 给的 token 不对,或不是 slides 类型 |
|
|
120
|
-
| 403 | 权限不足 | 检查 `docs:document.media:upload` scope;wiki URL 还需要 `wiki:node:read` |
|
|
121
|
-
|
|
122
|
-
## 相关命令
|
|
123
|
-
|
|
124
|
-
- [+create](lark-slides-create.md) — 新建 PPT(支持 `@` 占位符自动上传图片)
|
|
125
|
-
- [+replace-slide](lark-slides-replace-slide.md) — 给已有页加图 / 换图(`block_insert` / `block_replace`)
|
|
126
|
-
- [xml_presentation.slide create](lark-slides-xml-presentation-slide-create.md) — 创建 slide 页面(拿到 file_token 后塞进 XML)
|
|
5
|
+
此文件仅保留旧路径兼容性;后续引用请使用新路径。
|