From a13837fe0f106a970575d480c4140d44d8fc8cd4 Mon Sep 17 00:00:00 2001 From: karuo Date: Thu, 12 Mar 2026 23:41:37 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=84=20=E5=8D=A1=E8=8B=A5AI=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=202026-03-12=2023:41=20|=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=9A=E6=B0=B4=E6=A1=A5=E5=B9=B3=E5=8F=B0=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E3=80=81=E6=80=BB=E7=B4=A2=E5=BC=95=E4=B8=8E=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E3=80=81=E8=BF=90=E8=90=A5=E4=B8=AD=E6=9E=A2=E3=80=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E4=B8=AD=E6=9E=A2=E5=B7=A5=E4=BD=9C=E5=8F=B0=20|=20?= =?UTF-8?q?=E6=8E=92=E9=99=A4=20>20MB:=2011=20=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../飞书管理/参考资料/飞书JSON格式全手册.md | 852 ++++++++---------- .../水桥_平台对接/飞书管理/飞书JSON格式_SKILL.md | 278 +++--- SKILL_REGISTRY.md | 4 +- .../scripts/receivesms_find_soul_numbers.py | 70 ++ 运营中枢/工作台/gitea_push_log.md | 1 + 运营中枢/工作台/代码管理.md | 1 + 6 files changed, 641 insertions(+), 565 deletions(-) create mode 100644 运营中枢/scripts/receivesms_find_soul_numbers.py diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/飞书JSON格式全手册.md b/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/飞书JSON格式全手册.md index 81e70f9e..095c98fa 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/飞书JSON格式全手册.md +++ b/02_卡人(水)/水桥_平台对接/飞书管理/参考资料/飞书JSON格式全手册.md @@ -1,74 +1,139 @@ # 飞书 JSON 格式全手册 -> 基于项目 `/Users/karuo/Documents/1、金:项目` 下 52 个 `.feishu.json` 实际文件, -> 结合卡若AI 飞书管理脚本与 API 文档系统整理。 -> 版本:1.0 | 更新:2026-03-12 +> 基于项目 52 个 `.feishu.json` 实际文件 + 6 个脚本验证 + 飞书开放平台官方文档。 +> **版本:2.0** | **更新:2026-03-12** +> 来源:卡若AI 水桥 · 飞书管理 + +--- + +## 零、标准操作流程(SOP · 强制) + +**以后所有飞书相关文档,均按本手册格式写、转、传。** + +### SOP-A:写新文档 → 上传飞书 + +``` +1. 先在本地写 Markdown(推荐) + ↓ +2. 转成 .feishu.json: + python3 脚本/md_to_feishu_json.py /path/to/文章.md + ↓ +3. 上传到飞书 Wiki: + python3 脚本/upload_json_to_feishu_doc.py /path/to/文章.feishu.json --parent --title "标题" + ↓ +4. 验证:打开飞书链接检查格式 +``` + +### SOP-B:Markdown 直传(不经 JSON) + +``` +python3 脚本/feishu_article_unified_publish.py --parent --title "标题" --md /绝对路径/文章.md +``` + +### SOP-C:批量目录上传 + +``` +python3 脚本/batch_upload_json_to_feishu_wiki.py /本地目录 --wiki-parent +``` + +### SOP-D:飞书导出 JSON 按原格式回传 + +``` +python3 脚本/upload_json_to_feishu_doc.py /path/to/导出.json +``` + +### Token 出问题时 + +```bash +python3 脚本/feishu_token_cli.py get-access-token +python3 脚本/feishu_token_cli.py set-march-token <新token> +``` --- ## 一、JSON 文件顶层结构 -每个 `.feishu.json` 文件的最外层结构如下: - ```json { "title": "文档标题.md", "source": "相对来源路径/文档标题.md", - "children": [ - 块1, - 块2, - ... - ] + "children": [ 块1, 块2, ... ] } ``` | 字段 | 说明 | |:---|:---| -| `title` | 上传到飞书后显示的文档标题 | -| `source` | 本地 Markdown 来源路径(可选,追踪用) | -| `children` | 块数组,每项为一个 Block,顺序即文档顺序 | +| `title` | 上传后显示的文档标题 | +| `source` | 本地来源路径(可选,追踪用) | +| `children` | 块数组,顺序即文档顺序 | -**写入 API 时**:只传 `children` 数组,不传 `title`(title 在创建 wiki 节点时单独指定);块内不带 `block_id`(由服务端生成)。 +**写入 API 时**:只传 `children`;块内不带 `block_id`(服务端生成)。 --- -## 二、block_type 完整对照表 +## 二、block_type 完整对照表(v2.0 · 已验证) -| block_type | 类型 | 导出字段名 | 说明 | +### 2.1 已验证可写入的块类型(生产代码验证) + +| block_type | 类型 | JSON 字段名 | 说明 | 验证来源 | +|:---|:---|:---|:---|:---| +| 1 | 页面根节点 | `page` | 根节点,不通过 children 创建 | 导出 | +| 2 | **正文** | `text` | 最常用,支持富文本 | 脚本+导出 | +| 3 | 一级标题 | `heading1` | `#` | md_to_feishu_json.py | +| 4 | 二级标题 | `heading2` | `##` | 脚本+导出 | +| 5 | 三级标题 | `heading3` | `###` | 脚本+导出 | +| 6 | 四级标题 | `heading4` | `####`,日志日期专用 | 脚本+导出 | +| 7 | 五级标题 | `heading5` | `#####` | API 文档 | +| 8 | 六级标题 | `heading6` | `######` | API 文档 | +| 9-11 | 七~九级标题 | `heading7`~`heading9` | 极少用 | API 文档 | +| 14 | **代码块** | `code` | 支持多语言高亮 | 脚本+导出 | +| 17 | **待办** | `todo` | 可勾选任务 | 脚本+导出 | +| 19 | **高亮块/标注** | `callout` | 带颜色背景区块 | 脚本+导出 | +| 22 | **分割线** | `divider` | 水平线 | 脚本+导出 | +| 24 | **分栏** | `grid` | 多列布局容器 | smart_write_wiki.py | +| 25 | **分栏列** | `grid_column` | grid 的子列 | smart_write_wiki.py | +| 30 | 电子表格 | `sheet` | 文档内表格,9×9 上限 | md_to_feishu_json.py | + +### 2.2 图片/文件/媒体相关 + +| block_type | 类型 | JSON 字段名 | 说明 | |:---|:---|:---|:---| -| 1 | 页面根节点 | `page` | 根节点,不通过 children 创建 | -| 2 | 正文 | `text` | 最常用,支持富文本(加粗/颜色/链接) | -| 3 | 一级标题 | `heading1` | `#` | -| 4 | 二级标题 | `heading2` | `##` | -| 5 | 三级标题 | `heading3` | `###` | -| 6 | 四级标题 | `heading4` | `####`,日志日期专用 | -| 12 | 文件/图片(写入) | `file` | 先上传拿 `file_token`,再插入此块 | -| 14 | 代码块 | `code` | 支持语言高亮 | -| 17 | 待办 | `todo` | 可勾选的任务清单 | -| 18 | 画廊 | `gallery` | 图片画廊,单图也可用 | -| 19 | 高亮块/标注 | `callout` | 带颜色背景的高亮区块 | -| 22 | 分割线 | `divider` | 水平分隔线 | -| 27 | 图片(导出) | `image` | 导出时使用;**写入用 block_type 12** | -| 30 | 文档内电子表格 | `spreadsheet` | 飞书统一文章上传脚本自动生成 | -| 31 | 表格 | `table` | 带 cells 时接口常报错 9499,慎用 | -| 43 | 多维表格 | `board`/`bitable` | 独立应用类型,须用 bitable API 创建 | +| 12 | **文件/图片(写入)** | `file` | 先 upload_all 拿 file_token,再插入 | +| 18 | **画廊** | `gallery` | 多图显示,单图也可用 | +| 27 | 图片(导出) | `image` | 导出时出现;**写入用 12 file** | + +### 2.3 复杂/高级块 + +| block_type | 类型 | JSON 字段名 | 说明 | +|:---|:---|:---|:---| +| 31 | 表格 | `table` | ⚠️ 带 cells 接口报 9499,慎用 | +| 43 | 多维表格 | `board`/`bitable` | 须 bitable:app 权限 | +| 26 | 内嵌 | `iframe` | API 不支持写入,导出可见 | +| 29 | 思维笔记 | `mindnote` | API 不支持写入 | +| 34 | 引用容器 | `quote_container` | 引用嵌套容器 | +| 20 | 会话卡片 | `chat_card` | 群聊卡片 | + +### 2.4 列表块(重要说明) + +飞书 DocX API 定义了原生列表块类型,但**当前脚本采用正文块 + 前缀符号的方式实现列表**(更稳定): + +| 方案 | block_type | 实现方式 | 稳定性 | +|:---|:---|:---|:---| +| **当前方案(推荐)** | 2 (text) | 无序用 `• ` 前缀,有序用 `1)2)` 前缀 | ✅ 稳定 | +| 原生无序列表 | 12 (bullet) | `"bullet": {"elements": [...]}` | ⚠️ 未验证 | +| 原生有序列表 | 13 (ordered) | `"ordered": {"elements": [...]}` | ⚠️ 未验证 | + +> **原因**:bullet(12) 和 file(12) 可能存在 API 版本差异。当前生产代码中 block_type 12 = file,用于图片/文件上传,已验证稳定。列表统一用 text(2) + 前缀实现,确保兼容性。 --- ## 三、各 Block 类型详细 JSON 格式 -### 3.1 正文块(block_type: 2) +### 3.1 正文块(block_type: 2)—— 最常用 **最简版**: ```json -{ - "block_type": 2, - "text": { - "elements": [ - {"text_run": {"content": "这是一段正文。"}} - ] - } -} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "这是一段正文。"}}]}} ``` **带样式版(加粗 + 颜色)**: @@ -77,99 +142,68 @@ "block_type": 2, "text": { "elements": [ - { - "text_run": { - "content": "[重要紧急]", - "text_element_style": { - "bold": true, - "text_color": 5 - } - } - }, - { - "text_run": { - "content": " 今日必须完成的核心任务" - } - } + {"text_run": {"content": "[重要紧急]", "text_element_style": {"bold": true, "text_color": 5}}}, + {"text_run": {"content": " 今日必须完成的核心任务"}} ], "style": {"align": 1} } } ``` -**多段混排(加粗 + 普通 + 链接)**: +**超链接**: ```json { "block_type": 2, "text": { "elements": [ {"text_run": {"content": "项目链接:", "text_element_style": {"bold": true}}}, - { - "text_run": { - "content": "点击查看", - "text_element_style": { - "link": {"url": "https://cunkebao.feishu.cn/wiki/xxx"} - } - } - } + {"text_run": {"content": "点击查看", "text_element_style": {"link": {"url": "https://cunkebao.feishu.cn/wiki/xxx"}}}} ] } } ``` -**表格回退版(制表符分隔的正文块,实际项目常用)**: +**无序列表(正文块模拟,推荐)**: +```json +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "• 第一项要点"}}]}} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "• 第二项要点"}}]}} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": " • 子项(两空格缩进)"}}]}} +``` + +**有序列表(正文块模拟,推荐)**: +```json +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "1)第一步:需求分析"}}]}} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "2)第二步:方案设计"}}]}} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "3)第三步:代码实现"}}]}} +``` + +**表格(TSV 正文回退,生产常用)**: ```json { "block_type": 2, "text": { - "elements": [ - { - "text_run": { - "content": "产品\t价格\t分润\n:---\t:---\t:---\n书籍小程序\t9.9元起\t90%\n会员群\t365元起\t平台收入" - } + "elements": [{ + "text_run": { + "content": "产品\t价格\t分润\n:---\t:---\t:---\n书籍小程序\t9.9元起\t90%\n会员群\t365元起\t平台收入" } - ] + }] } } ``` --- -### 3.2 标题块(block_type: 3/4/5/6) +### 3.2 标题块(block_type: 3-11) -**规律**:字段名 = `heading1` / `heading2` / `heading3` / `heading4`,结构相同 +字段名 = `heading1`~`heading9`,结构完全相同: ```json -// 二级标题 (block_type: 4) —— ## 对应 -{ - "block_type": 4, - "heading2": { - "elements": [ - {"text_run": {"content": "📋 商业模式总览"}} - ] - } -} - -// 三级标题 (block_type: 5) —— ### 对应 -{ - "block_type": 5, - "heading3": { - "elements": [ - {"text_run": {"content": "一、市场痛点"}} - ] - } -} - -// 四级标题 (block_type: 6) —— #### 对应,日志日期专用 -{ - "block_type": 6, - "heading4": { - "elements": [ - {"text_run": {"content": "3月12日 "}} - ], - "style": {"align": 1} - } -} +{"block_type": 3, "heading1": {"elements": [{"text_run": {"content": "一级大标题"}}]}} +{"block_type": 4, "heading2": {"elements": [{"text_run": {"content": "📋 二级标题"}}]}} +{"block_type": 5, "heading3": {"elements": [{"text_run": {"content": "三级标题"}}]}} +{"block_type": 6, "heading4": {"elements": [{"text_run": {"content": "3月12日 "}}], "style": {"align": 1}}} +{"block_type": 7, "heading5": {"elements": [{"text_run": {"content": "五级标题"}}]}} +{"block_type": 8, "heading6": {"elements": [{"text_run": {"content": "六级标题"}}]}} ``` --- @@ -180,65 +214,41 @@ { "block_type": 14, "code": { - "elements": [ - { - "text_run": { - "content": "SOUL派对(流量入口)\n ↓\n触客宝自动接待\n ↓\n存客宝AI分层\n ↓\nABCD用户匹配" - } - } - ], - "style": { - "language": 1 - } + "elements": [{"text_run": {"content": "SOUL派对(流量入口)\n ↓\n触客宝自动接待\n ↓\n存客宝AI分层"}}], + "style": {"language": 1} } } ``` -**language 枚举值**(常用): +**language 枚举值**: -| 值 | 语言 | -|:---|:---| -| 1 | PlainText(纯文本,流程图/ASCII艺术用此) | -| 2 | Python | -| 3 | JavaScript | -| 4 | Java | -| 5 | Go | -| 6 | Shell/Bash | -| 7 | TypeScript | -| 8 | SQL | +| 值 | 语言 | 值 | 语言 | +|:---|:---|:---|:---| +| 1 | PlainText(流程图/ASCII 用此) | 2 | Python | +| 3 | JavaScript | 4 | Java | +| 5 | Go | 6 | Shell/Bash | +| 7 | TypeScript | 8 | SQL | +| 9 | C++ | 10 | C | +| 11 | Ruby | 12 | Rust | +| 13 | Swift | 14 | Kotlin | +| 15 | PHP | 16 | CSS | +| 17 | HTML | 18 | Markdown | +| 19 | JSON | 20 | YAML | --- ### 3.4 待办块(block_type: 17) ```json -// 未完成 -{ - "block_type": 17, - "todo": { - "elements": [ - {"text_run": {"content": "卡若(今日复盘、本月目标、核心任务)"}} - ], - "style": { - "done": false, - "align": 1 - } - } -} +{"block_type": 17, "todo": { + "elements": [{"text_run": {"content": "Soul 派对→本月突破500在线 🎬 (0%)"}}], + "style": {"done": false, "align": 1} +}} -// 已完成 -{ - "block_type": 17, - "todo": { - "elements": [ - {"text_run": {"content": "Soul 107 场运营报表已写入飞书"}} - ], - "style": { - "done": true, - "align": 1 - } - } -} +{"block_type": 17, "todo": { + "elements": [{"text_run": {"content": "运营报表已写入飞书"}}], + "style": {"done": true, "align": 1} +}} ``` --- @@ -246,79 +256,51 @@ ### 3.5 高亮块/标注(block_type: 19) ```json -// 蓝色背景 [执行] 标注 -{ - "block_type": 19, - "callout": { - "emoji_id": "sunrise", - "background_color": 2, - "border_color": 2, - "elements": [ - { - "text_run": { - "content": "[执行]", - "text_element_style": {"bold": true, "text_color": 7} - } - }, - { - "text_run": { - "content": " 本月核心任务:Soul 派对日活突破 500" - } - } - ] - } -} +// 蓝色 [执行] +{"block_type": 19, "callout": { + "emoji_id": "sunrise", "background_color": 2, "border_color": 2, + "elements": [{"text_run": {"content": "[执行]", "text_element_style": {"bold": true, "text_color": 7}}}] +}} -// 橙色背景 [警告] 标注 -{ - "block_type": 19, - "callout": { - "emoji_id": "warning", - "background_color": 4, - "border_color": 4, - "elements": [ - {"text_run": {"content": "注意:Token 过期时间不超过 2 小时"}} - ] - } -} +// 橙色 [警告] +{"block_type": 19, "callout": { + "emoji_id": "warning", "background_color": 4, "border_color": 4, + "elements": [{"text_run": {"content": "注意:Token 2小时过期"}}] +}} -// 绿色背景 [完成] 标注 -{ - "block_type": 19, - "callout": { - "emoji_id": "white_check_mark", - "background_color": 3, - "border_color": 3, - "elements": [ - {"text_run": {"content": "已完成:飞书运营报表已写入"}} - ] - } -} +// 绿色 [完成] +{"block_type": 19, "callout": { + "emoji_id": "white_check_mark", "background_color": 3, "border_color": 3, + "elements": [{"text_run": {"content": "已完成:运营报表写入成功"}}] +}} + +// 红色 [紧急] +{"block_type": 19, "callout": { + "emoji_id": "fire", "background_color": 6, "border_color": 6, + "elements": [{"text_run": {"content": "紧急:服务器宕机需立即处理"}}] +}} ``` **background_color / border_color 枚举**: -| 值 | 颜色 | -|:---|:---| -| 1 | 无背景/白色 | -| 2 | 蓝色 | -| 3 | 绿色 | -| 4 | 橙色 | -| 5 | 黄色 | -| 6 | 红色 | -| 7 | 紫色 | +| 值 | 颜色 | 常用场景 | +|:---|:---|:---| +| 1 | 白色/无 | 普通引用 | +| 2 | 蓝色 | [执行]、信息提示 | +| 3 | 绿色 | [完成]、成功 | +| 4 | 橙色 | [警告]、注意 | +| 5 | 黄色 | 重点提醒 | +| 6 | 红色 | [紧急]、错误 | +| 7 | 紫色 | 思考、创意 | -**常用 emoji_id**:`sunrise`(🌅)、`warning`(⚠️)、`white_check_mark`(✅)、`bulb`(💡)、`fire`(🔥)、`star`(⭐)、`quote`(引用) +**常用 emoji_id**:`sunrise`🌅、`warning`⚠️、`white_check_mark`✅、`bulb`💡、`fire`🔥、`star`⭐、`quote`引用、`rocket`🚀、`dart`🎯、`memo`📝 --- ### 3.6 分割线(block_type: 22) ```json -{ - "block_type": 22, - "divider": {} -} +{"block_type": 22, "divider": {}} ``` --- @@ -326,80 +308,115 @@ ### 3.7 图片/文件块(block_type: 12,写入专用) ```json -// 文件/图片块(file) -{ - "block_type": 12, - "file": { - "file_token": "上传后返回的 file_token", - "view_type": "inline", - "file_name": "进度图表.png" - } -} +{"block_type": 12, "file": { + "file_token": "上传后返回的 file_token", + "view_type": "inline", + "file_name": "进度图表.png" +}} ``` -> 注意:先调用 `drive/v1/medias/upload_all` 上传,拿到 `file_token`,再插入此块。 +> 两步走:① `POST drive/v1/medias/upload_all`(form-data: file_name, parent_type=docx_image, parent_node=obj_token, size, file=binary)→ 拿 file_token ② 插入此块 + +**view_type 枚举**:`preview`(预览)、`card`(卡片)、`inline`(行内) --- ### 3.8 画廊块(block_type: 18) ```json -{ - "block_type": 18, - "gallery": { - "image_list": [ - {"file_token": "xxx_file_token_1"}, - {"file_token": "xxx_file_token_2"} - ], - "gallery_style": {"align": "center"} - } -} +{"block_type": 18, "gallery": { + "image_list": [ + {"file_token": "xxx_file_token_1"}, + {"file_token": "xxx_file_token_2"} + ], + "gallery_style": {"align": "center"} +}} +``` + +> 一行最多 6 张图。`align`: `center`(默认)、`left`、`right` + +--- + +### 3.9 分栏布局(block_type: 24 + 25) + +**分栏容器 grid**: +```json +{"block_type": 24, "grid": {"column_size": 2}} +``` + +**分栏列 grid_column**(须作为 grid 的子块插入): +```json +{"block_type": 25, "grid_column": {"width_ratio": 50}} +``` + +**完整用法(两栏布局)**: +``` +1. 先创建 grid 块 → 拿到 grid_block_id +2. API 自动生成 column_size 个 grid_column 子块 +3. 在每个 grid_column 下插入内容块 +``` + +```python +# 创建分栏(脚本 smart_write_wiki.py 中的实际写法) +grid_block = {"block_type": 24, "grid": {"column_size": 2}} +# 插入后拿到 grid_id,再查询其子块拿到两个 column_id +# 然后在 column_id 下分别插入左右内容 ``` --- -### 3.9 多维表格(block_type: 43) +### 3.10 电子表格(block_type: 30) ```json -// 导出时的格式 -{ - "block_type": 43, - "board": { - "token": "bascnXXXXXXXX" - } -} - -// 写入时(嵌入文档内) -{ - "block_type": 43, - "bitable": { - "token": "bascnXXXXXXXX" - } -} +{"block_type": 30, "sheet": {"row_size": 5, "column_size": 4}} ``` -> ⚠️ 多维表格需要**用户身份权限** `bitable:app`,且须重新授权。 -> 独立多维表格用 Bitable 创建接口(不是 docx 接口),结果链接为 `https://cunkebao.feishu.cn/base/{app_token}`。 +> 创建空表格,最大 9×9。创建后通过电子表格 API 写入单元格内容。 +> **限制**:不能在创建时直接带内容。 --- -### 3.10 表格块(block_type: 31,慎用) +### 3.11 表格块(block_type: 31,⚠️ 限制) ```json -{ - "block_type": 31, - "table": { - "property": { - "row_size": 3, - "column_size": 4 - }, - "cells": [] - } -} +// 创建空表格(可行) +{"block_type": 31, "table": {"property": {"row_size": 3, "column_size": 4}}} + +// 带 cells 创建(⚠️ 返回 9499 报错) +{"block_type": 31, "table": {"property": {"row_size": 3, "column_size": 4}, "cells": [...]}} ``` -> ⚠️ **带 cells 时接口返回 9499 报错**(Invalid parameter type in json: cells),飞书官方暂未公开带内容表格块的创建规范。 -> **推荐回退方案**:用正文块(block_type: 2)+ 制表符分隔的 TSV 格式替代表格。 +**表格处理策略(决策树)**: + +``` +Markdown 表格 +├── 行列 ≤ 9×9 → 优先用 sheet(30) 创建空表格 + 写入单元格 +├── 行列 > 9×9 → 用 text(2) TSV 回退 +└── sheet 失败 → 用 text(2) TSV 回退(保底方案) +``` + +**TSV 回退格式(稳定,推荐兜底)**: +```json +{"block_type": 2, "text": { + "elements": [{"text_run": { + "content": "文档名称\t路径\t核心内容\t状态\n:---\t:---\t:---\t:---\n品牌定位画布\t金/品牌定位.md\t一句话定位\t✅ 完成\n人物画像\t金/人物画像.md\tABCD用户画像\t✅ 完成" + }}] +}} +``` + +--- + +### 3.12 多维表格(block_type: 43) + +```json +// 导出格式 +{"block_type": 43, "board": {"token": "bascnXXXXXXXX"}} + +// 写入格式(嵌入文档内) +{"block_type": 43, "bitable": {"token": "bascnXXXXXXXX"}} +``` + +> ⚠️ 须开通 **bitable:app** 用户身份权限。独立多维表格链接为 `https://cunkebao.feishu.cn/base/{app_token}`。 --- @@ -408,262 +425,177 @@ ```json { "text_element_style": { - "bold": true, // 加粗 - "italic": true, // 斜体 - "strikethrough": true, // 删除线 - "underline": true, // 下划线 - "inline_code": true, // 行内代码 - "text_color": 5, // 文字颜色(见下表) - "background_color": 2, // 背景高亮色(见下表) - "link": { - "url": "https://..." // 超链接 - } + "bold": true, + "italic": true, + "strikethrough": true, + "underline": true, + "inline_code": true, + "text_color": 5, + "background_color": 2, + "link": {"url": "https://..."} } } ``` **text_color 枚举**: -| 值 | 颜色 | 实际显示 | +| 值 | 颜色 | 场景 | |:---|:---|:---| -| 1 | 黑色(默认) | | -| 2 | 深灰 | | +| 1 | 黑色(默认) | 正文 | +| 2 | 深灰 | 次要信息 | | 3 | 深橙 | | -| 4 | 橙色 | | -| 5 | 红色 | 重要紧急标注常用 | +| 4 | 橙色 | 不重要紧急 | +| 5 | **红色** | **重要紧急标注** | | 6 | 玫红 | | -| 7 | 紫色 | | +| 7 | 紫色 | 执行标注 | | 8 | 浅蓝 | | | 9 | 深蓝 | | -| 10 | 绿色 | 重要不紧急标注常用 | - -**background_color(行内高亮)枚举**:同 text_color,1=黄色,2=浅绿,3=橙,4=红,以此类推(实测与 callout 一致) +| 10 | **绿色** | **重要不紧急标注** | --- ## 五、style 对齐参数 ```json -"style": { - "align": 1 // 1=左对齐,2=居中,3=右对齐 -} +"style": {"align": 1} ``` +| 值 | 对齐方式 | +|:---|:---| +| 1 | 左对齐(默认) | +| 2 | 居中 | +| 3 | 右对齐 | + 适用于:`text.style`、`heading*.style`、`todo.style` --- -## 六、实际项目中的完整文档示例 +## 六、Markdown → 飞书 Block 转换规则(完整版) -以下是一个完整的飞书 JSON 文档结构(基于项目中 `材料/01_商业模式总览.feishu.json` 的模式): - -```json -{ - "title": "商业模式总览.md", - "source": "材料/商业模式总览.md", - "children": [ - { - "block_type": 4, - "heading2": { - "elements": [{"text_run": {"content": "一、项目背景"}}] - } - }, - { - "block_type": 5, - "heading3": { - "elements": [{"text_run": {"content": "市场痛点"}}] - } - }, - { - "block_type": 2, - "text": { - "elements": [ - { - "text_run": { - "content": "痛点\t描述\n:---\t:---\n资源分散\t80%创业者缺乏有效资源对接渠道\n匹配低效\t平均每人加入5+社群,有效链接率<5%" - } - } - ] - } - }, - { - "block_type": 22, - "divider": {} - }, - { - "block_type": 4, - "heading2": { - "elements": [{"text_run": {"content": "二、商业模式"}}] - } - }, - { - "block_type": 14, - "code": { - "elements": [ - { - "text_run": { - "content": "SOUL派对(流量入口)\n ↓\n触客宝自动接待\n ↓\n存客宝AI分层(ABCD)\n ↓\n精准变现" - } - } - ], - "style": {"language": 1} - } - }, - { - "block_type": 19, - "callout": { - "emoji_id": "bulb", - "background_color": 2, - "border_color": 2, - "elements": [ - {"text_run": {"content": "核心模式:云阿米巴——不占股、分现钱、稳流量"}} - ] - } - }, - { - "block_type": 17, - "todo": { - "elements": [ - {"text_run": {"content": "完成产品矩阵报价表"}} - ], - "style": {"done": false, "align": 1} - } - } - ] -} -``` +| Markdown 写法 | 飞书 block_type | 字段名 | 备注 | +|:---|:---|:---|:---| +| `# 标题` | 3 | heading1 | | +| `## 标题` | 4 | heading2 | | +| `### 标题` | 5 | heading3 | | +| `#### 标题` | 6 | heading4 | | +| `##### 标题` | 7 | heading5 | | +| `###### 标题` | 8 | heading6 | | +| 普通段落 | 2 | text | | +| `**加粗**` | 2 | text + bold=true | elements 拆分 | +| `*斜体*` | 2 | text + italic=true | | +| `~~删除线~~` | 2 | text + strikethrough=true | | +| `` `行内代码` `` | 2 | text + inline_code=true | | +| `[链接](url)` | 2 | text + link.url | | +| `> 引用` | 19 | callout(蓝色) | | +| `---` | 22 | divider | | +| ` ```代码``` ` | 14 | code | language 自动识别 | +| `![图](路径)` | 12 | file(先 upload_all) | 失败保底为文字 | +| `- 无序列表` | 2 | text(`• ` 前缀) | 正文块模拟 | +| `1. 有序列表` | 2 | text(`1)` 前缀) | 正文块模拟 | +| `- [ ]` 未完成 | 17 | todo + done=false | | +| `- [x]` 已完成 | 17 | todo + done=true | | +| Markdown 表格 | 30 或 2 | sheet 或 TSV 回退 | ≤9×9 用 sheet | --- -## 七、飞书 API 接口速查 - -### 7.1 文档(DocX)相关 - -| 用途 | 方法 | 路径 | -|:---|:---|:---| -| 获取 Wiki 节点(拿 obj_token) | GET | `wiki/v2/spaces/get_node?token={wiki_token}` | -| 获取文档块列表 | GET | `docx/v1/documents/{document_id}/blocks` | -| 在指定块下追加子块 | POST | `docx/v1/documents/{document_id}/blocks/{block_id}/children` | -| 批量删除块 | POST | `docx/v1/documents/{document_id}/blocks/batch_delete` | -| 创建 Wiki 子文档节点 | POST | `wiki/v2/spaces/{space_id}/nodes` | - -**追加子块请求体**: -```json -{ - "children": [块1, 块2, ...], - "index": 0 -} -``` - -> `index: 0` 表示插入到父块最前面;不传或 `-1` 表示追加到末尾。单次最多 50 个块,超出分批调用。 - -### 7.2 图片/文件上传 - -**接口**:`POST https://open.feishu.cn/open-apis/drive/v1/medias/upload_all` - -**form-data 字段**: - -| 字段 | 类型 | 说明 | -|:---|:---|:---| -| `file_name` | string | 文件名,如 `chart.png` | -| `parent_type` | string | 固定 `docx_image` | -| `parent_node` | string | 文档的 `obj_token` | -| `size` | string | 文件大小字节数(字符串) | -| `file` | binary | 图片二进制内容 | - -**返回**:`data.file_token`,用于插入 block_type 12 或 18 - -**常见错误**: -- `1770001`:请求体字段名/格式不符 -- `1770013`:file_token 与文档关联错误,需先上传再使用 - -### 7.3 多维表格 - -| 用途 | 方法 | 路径 | -|:---|:---|:---| -| 创建多维表格 | POST | `bitable/v1/apps` | -| 列出数据表 | GET | `bitable/v1/apps/{app_token}/tables` | -| 新建数据表 | POST | `bitable/v1/apps/{app_token}/tables` | - -> 须开通 **bitable:app** 用户身份权限,并重新授权。 - ---- - -## 八、Markdown → 飞书 Block 转换规则 - -| Markdown 写法 | 对应飞书 Block | -|:---|:---| -| `# 标题` | heading1(block_type: 3) | -| `## 标题` | heading2(block_type: 4) | -| `### 标题` | heading3(block_type: 5) | -| `#### 标题` | heading4(block_type: 6) | -| 普通段落 | text(block_type: 2) | -| `> 引用` | callout(block_type: 19) | -| `---` | divider(block_type: 22) | -| ` ```代码``` ` | code(block_type: 14) | -| `**加粗**` | text_element_style.bold = true | -| `![图](路径)` | 先上传图片 → file(block_type: 12)或 gallery(18) | -| Markdown 表格 | 优先 spreadsheet(30),失败回退为 TSV 正文块(2) | -| `- [ ]` / `- [x]` | todo(block_type: 17),done=false/true | - ---- - -## 九、日志 TNTWF 格式对应 Block 结构 +## 七、日志 TNTWF 格式对应 Block 结构 ```json [ - // 日期标题 {"block_type": 6, "heading4": {"elements": [{"text_run": {"content": "3月12日 "}}], "style": {"align": 1}}}, - - // 高亮块:[执行] 标注 {"block_type": 19, "callout": {"emoji_id": "sunrise", "background_color": 2, "border_color": 2, "elements": [{"text_run": {"content": "[执行]", "text_element_style": {"bold": true, "text_color": 7}}}]}}, - - // 象限分类:[重要紧急] 红色 {"block_type": 2, "text": { "elements": [{"text_run": {"content": "[重要紧急]", "text_element_style": {"bold": true, "text_color": 5}}}], "style": {"align": 1}}}, - - // 待办任务 {"block_type": 17, "todo": { "elements": [{"text_run": {"content": "Soul 派对→本月突破500在线 🎬 (0%)"}}], "style": {"done": false, "align": 1}}}, - - // 象限分类:[重要不紧急] 绿色 {"block_type": 2, "text": { "elements": [{"text_run": {"content": "[重要不紧急]", "text_element_style": {"bold": true, "text_color": 10}}}], "style": {"align": 1}}}, - - // 分割线 {"block_type": 22, "divider": {}} ] ``` --- -## 十、批量上传脚本速查 +## 八、完整文档示例 + +```json +{ + "title": "商业模式总览.md", + "source": "材料/商业模式总览.md", + "children": [ + {"block_type": 4, "heading2": {"elements": [{"text_run": {"content": "一、项目背景"}}]}}, + {"block_type": 5, "heading3": {"elements": [{"text_run": {"content": "市场痛点"}}]}}, + {"block_type": 2, "text": {"elements": [{"text_run": { + "content": "痛点\t描述\n:---\t:---\n资源分散\t80%创业者缺乏有效渠道\n匹配低效\t有效链接率<5%"}}]}}, + {"block_type": 22, "divider": {}}, + {"block_type": 4, "heading2": {"elements": [{"text_run": {"content": "二、商业模式"}}]}}, + {"block_type": 14, "code": {"elements": [{"text_run": { + "content": "SOUL派对(流量入口)\n ↓\n触客宝自动接待\n ↓\n存客宝AI分层(ABCD)\n ↓\n精准变现"}}], + "style": {"language": 1}}}, + {"block_type": 19, "callout": {"emoji_id": "bulb", "background_color": 2, "border_color": 2, + "elements": [{"text_run": {"content": "核心模式:云阿米巴——不占股、分现钱、稳流量"}}]}}, + {"block_type": 2, "text": {"elements": [{"text_run": {"content": "• 产品一:书籍小程序 9.9元起"}}]}}, + {"block_type": 2, "text": {"elements": [{"text_run": {"content": "• 产品二:会员群 365元起"}}]}}, + {"block_type": 17, "todo": {"elements": [{"text_run": {"content": "完成产品矩阵报价表"}}], + "style": {"done": false, "align": 1}}} + ] +} +``` + +--- + +## 九、API 接口速查 + +| 用途 | 方法 | 路径 | +|:---|:---|:---| +| 获取 Wiki 节点 | GET | `wiki/v2/spaces/get_node?token={wiki_token}` | +| 获取文档块列表 | GET | `docx/v1/documents/{doc_id}/blocks` | +| **追加子块(写入)** | POST | `docx/v1/documents/{doc_id}/blocks/{block_id}/children` | +| 批量删除块 | POST | `docx/v1/documents/{doc_id}/blocks/batch_delete` | +| 创建 Wiki 子节点 | POST | `wiki/v2/spaces/{space_id}/nodes` | +| **上传图片/文件** | POST | `drive/v1/medias/upload_all` | +| 创建多维表格 | POST | `bitable/v1/apps` | +| 写入电子表格单元格 | PUT | `sheets/v2/spreadsheets/{token}/values` | + +**追加子块请求体**: +```json +{"children": [块1, 块2, ...], "index": 0} +``` +> `index: 0` = 最前;不传 = 末尾。**单次 ≤ 50 块**,超出分批。 + +--- + +## 十、脚本速查 | 脚本 | 用途 | 命令 | |:---|:---|:---| -| `upload_json_to_feishu_doc.py` | 单个 JSON 按格式上传(自动判断文档/多维表格) | `python3 脚本/upload_json_to_feishu_doc.py /path/xxx.json` | -| `batch_upload_json_to_feishu_wiki.py` | 目录下全部 JSON 按目录结构批量上传 | `python3 脚本/batch_upload_json_to_feishu_wiki.py /本地目录 --wiki-parent ` | -| `feishu_wiki_create_doc.py` | 在指定 Wiki 下创建子文档 | `python3 脚本/feishu_wiki_create_doc.py --parent --title "标题" --json blocks.json` | -| `feishu_article_unified_publish.py` | Markdown → 飞书 Wiki 文档(统一发布) | `python3 脚本/feishu_article_unified_publish.py --parent --title "标题" --md /绝对路径/文章.md` | +| `md_to_feishu_json.py` | Markdown → .feishu.json | `python3 脚本/md_to_feishu_json.py /path/xxx.md` | +| `upload_json_to_feishu_doc.py` | JSON 按格式上传 | `python3 脚本/upload_json_to_feishu_doc.py /path/xxx.json` | +| `batch_upload_json_to_feishu_wiki.py` | 批量目录上传 | `python3 脚本/batch_upload_json_to_feishu_wiki.py /目录 --wiki-parent ` | +| `feishu_article_unified_publish.py` | Markdown 直传 | `python3 脚本/feishu_article_unified_publish.py --parent --title "标题" --md /路径.md` | +| `feishu_wiki_create_doc.py` | 创建 Wiki 子文档 | `python3 脚本/feishu_wiki_create_doc.py --parent --title "标题"` | +| `smart_write_wiki.py` | 智能写入(含分栏) | 脚本内调用 | --- -## 十一、常见问题排查 +## 十一、错误排查 | 问题 | 原因 | 解决 | |:---|:---|:---| -| 9499 `Invalid parameter type in json: cells` | 带 cells 的 block_type 31 暂不支持 | 改用正文块 TSV 回退 | -| 1770001 `invalid param` | 字段名/格式错误(snake_case vs camelCase) | 以实际 API 文档为准;图片先上传再插入 | -| 1770013 | file_token 与文档关联错误 | 确认 upload_all 时 parent_node 是正确的 obj_token | -| token 无效/过期 | access_token 有效期 2 小时 | `python3 脚本/feishu_token_cli.py get-access-token` | -| 多维表格权限不足 | 未开通 bitable:app 用户身份权限 | 后台开通后 `python3 脚本/feishu_force_reauth.py` 重新授权 | -| 写入串月 | wiki_token 未按月路由 | 写前用 `wiki/v2/spaces/get_node` 校验文档标题含目标月份 | +| 9499 `Invalid parameter: cells` | table(31) 带 cells 不支持 | 改用 TSV 正文(2) 或 sheet(30) | +| 1770001 `invalid param` | 字段名/格式错误 | 确认字段名正确;图片先上传再用 token | +| 1770013 | file_token 关联错误 | upload_all 时 parent_node 用正确 obj_token | +| token 过期 | access_token 有效期 2 小时 | `python3 脚本/feishu_token_cli.py get-access-token` | +| 多维表格权限不足 | 未开通 bitable:app | `python3 脚本/feishu_force_reauth.py` | +| 块数 > 50 写入失败 | 单次限制 50 块 | 分批写入,每批 ≤ 50 | +| sheet 超 9×9 报错 | 电子表格创建上限 | 改用 TSV 正文(2) 回退 | +| 写入串月 | wiki_token 路由错误 | 写前校验文档标题含目标月份 | --- -**版本**:1.0 | **整理**:卡若AI 水桥 | **更新**:2026-03-12 -**数据来源**:项目 `/1、金:项目` 下 52 个 `.feishu.json` 文件 + 飞书管理脚本参考资料 +**版本**:2.0 | **整理**:卡若AI 水桥 | **更新**:2026-03-12 +**数据来源**:52 个 `.feishu.json` + 6 个脚本 + 飞书开放平台 API 文档 diff --git a/02_卡人(水)/水桥_平台对接/飞书管理/飞书JSON格式_SKILL.md b/02_卡人(水)/水桥_平台对接/飞书管理/飞书JSON格式_SKILL.md index ffd260b4..7d25ecf3 100644 --- a/02_卡人(水)/水桥_平台对接/飞书管理/飞书JSON格式_SKILL.md +++ b/02_卡人(水)/水桥_平台对接/飞书管理/飞书JSON格式_SKILL.md @@ -1,10 +1,10 @@ --- name: 飞书JSON格式 -description: 飞书文档 JSON 格式速查、编写、上传与翻译;各 block_type 格式写法、Markdown 转换对照、API 路径一站式参考 -triggers: 飞书json、飞书json格式、飞书block、飞书块格式、飞书文档格式、json上传飞书、飞书格式怎么写、block_type、飞书块类型、飞书写入格式、飞书上传json、飞书文档block、飞书高亮块、飞书代码块、飞书待办块、飞书标题块、飞书分割线、飞书callout、飞书多维表格json +description: 飞书文档 JSON 格式速查、编写、上传与翻译;各 block_type 格式写法、Markdown 转换对照、标准操作流程一站式参考 +triggers: 飞书json、飞书json格式、飞书block、飞书块格式、飞书文档格式、json上传飞书、飞书格式怎么写、block_type、飞书块类型、飞书写入格式、飞书上传json、飞书文档block、飞书高亮块、飞书代码块、飞书待办块、飞书标题块、飞书分割线、飞书callout、飞书多维表格json、飞书列表、飞书表格、飞书分栏、更新飞书JSON格式 owner: 水桥 group: 水 -version: "1.0" +version: "2.0" updated: "2026-03-12" --- @@ -20,13 +20,63 @@ updated: "2026-03-12" - **Markdown 翻译**:把任意 Markdown 内容转成飞书 blocks 数组 - **上传文档**:利用现有脚本将 JSON 或 Markdown 上传到飞书 Wiki - **格式排版**:对文档内容进行飞书风格的结构化整理 +- **表格策略**:根据行列数自动选择 sheet/TSV 回退方案 - **API 对照**:提供飞书 Docx API 路径、参数、错误排查 --- ## 怎么用(Usage) -触发词:飞书json、飞书block、block_type、飞书格式怎么写、飞书文档格式、json上传飞书、飞书callout、飞书高亮块、飞书待办、飞书代码块、飞书多维表格 +触发词:飞书json、飞书block、block_type、飞书格式怎么写、飞书文档格式、json上传飞书、飞书callout、飞书高亮块、飞书待办、飞书代码块、飞书多维表格、飞书列表、飞书表格、飞书分栏 + +--- + +## 强制操作流程(SOP · 以后所有飞书文档按此执行) + +### 流程 A:写文档 → 转 JSON → 上传 + +``` +1. 本地写 Markdown + ↓ +2. 转 .feishu.json: + python3 脚本/md_to_feishu_json.py /path/to/文章.md + ↓ +3. 上传飞书 Wiki: + python3 脚本/upload_json_to_feishu_doc.py /path/to/文章.feishu.json --parent --title "标题" + ↓ +4. 打开飞书链接验证格式 +``` + +### 流程 B:Markdown 直传(不经 JSON) + +```bash +python3 /Users/karuo/Documents/个人/卡若AI/02_卡人(水)/水桥_平台对接/飞书管理/脚本/feishu_article_unified_publish.py \ + --parent --title "标题" --md /绝对路径/文章.md +``` + +### 流程 C:批量目录上传 + +```bash +python3 /Users/karuo/Documents/个人/卡若AI/02_卡人(水)/水桥_平台对接/飞书管理/脚本/batch_upload_json_to_feishu_wiki.py \ + /本地目录 --wiki-parent +``` + +### 流程 D:飞书导出 JSON 回传 + +```bash +python3 /Users/karuo/Documents/个人/卡若AI/02_卡人(水)/水桥_平台对接/飞书管理/脚本/upload_json_to_feishu_doc.py \ + /path/to/导出.json --parent --title "标题" +``` + +### 流程 E:AI 直接生成 blocks 写入 + +``` +1. 用户描述文档内容 + ↓ +2. AI 按下方「格式速查卡」生成 children 数组 + ↓ +3. 调用 feishu_wiki_create_doc.py 或 API 写入 +``` --- @@ -34,75 +84,71 @@ updated: "2026-03-12" ### 场景 A:生成飞书 JSON blocks -1. 理解用户要写的内容(标题层级、正文、表格、代码、高亮块等) -2. 查本 SKILL 的「格式速查卡」对应条目 -3. 输出完整 `children` 数组,可直接传给写入 API +1. 理解用户内容需求 +2. 按「格式速查卡」选择对应块类型 +3. 输出完整 `children` 数组,可直接写入 ### 场景 B:Markdown → 飞书 blocks -1. 解析 Markdown 标题层级(`#`→3,`##`→4,`###`→5,`####`→6) -2. 按下方「转换规则表」逐段转换 -3. 输出 `.feishu.json` 格式(`title + source + children`) +1. 解析标题层级(`#`→3,`##`→4,`###`→5,`####`→6) +2. 按「转换规则表」逐段转换 +3. 输出 `.feishu.json`(`title + source + children`) -### 场景 C:上传到飞书 +### 场景 C:内容涉及表格时的决策 -```bash -# 上传单个 JSON(自动判断文档/多维表格) -python3 /Users/karuo/Documents/个人/卡若AI/02_卡人(水)/水桥_平台对接/飞书管理/脚本/upload_json_to_feishu_doc.py /path/to/xxx.json - -# 指定父节点和标题 -python3 .../upload_json_to_feishu_doc.py /path/xxx.json --parent --title "文档标题" - -# Markdown 直接上传 -python3 .../feishu_article_unified_publish.py --parent --title "标题" --md /绝对路径/文章.md - -# 批量目录上传 -python3 .../batch_upload_json_to_feishu_wiki.py /本地目录 --wiki-parent +``` +Markdown 表格 +├── 行列 ≤ 9×9 → 优先 sheet(30) 空表格 + 写入单元格 +├── 行列 > 9×9 → 用 text(2) TSV 回退 +└── API 失败 → 用 text(2) TSV 回退(保底) ``` --- -## 格式速查卡(核心块类型) +## 格式速查卡(完整块类型) -### 1. 正文块(最常用) +### 1. 正文(block_type: 2) ```json // 普通正文 {"block_type": 2, "text": {"elements": [{"text_run": {"content": "文字内容"}}]}} // 加粗 + 红色 -{"block_type": 2, "text": { - "elements": [{"text_run": {"content": "[重要紧急]", "text_element_style": {"bold": true, "text_color": 5}}}], - "style": {"align": 1} -}} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "[重要紧急]", "text_element_style": {"bold": true, "text_color": 5}}}], "style": {"align": 1}}} // 超链接 -{"block_type": 2, "text": { - "elements": [{"text_run": {"content": "点击查看", "text_element_style": {"link": {"url": "https://..."}}}]} -}} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "点击查看", "text_element_style": {"link": {"url": "https://..."}}}}]}} -// 表格回退(TSV 正文,实际项目常用) -{"block_type": 2, "text": { - "elements": [{"text_run": {"content": "产品\t价格\t分润\n:---\t:---\t:---\n书籍小程序\t9.9元起\t90%"}}] -}} +// 无序列表(正文块 + • 前缀,推荐) +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "• 第一项要点"}}]}} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "• 第二项要点"}}]}} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": " • 子项缩进"}}]}} + +// 有序列表(正文块 + 数字前缀,推荐) +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "1)需求分析"}}]}} +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "2)方案设计"}}]}} + +// 表格 TSV 回退(制表符分隔) +{"block_type": 2, "text": {"elements": [{"text_run": {"content": "产品\t价格\t分润\n:---\t:---\t:---\n书籍小程序\t9.9元起\t90%"}}]}} ``` -### 2. 标题块 +### 2. 标题(block_type: 3-11) ```json -{"block_type": 3, "heading1": {"elements": [{"text_run": {"content": "一级标题"}}]}} +{"block_type": 3, "heading1": {"elements": [{"text_run": {"content": "一级大标题"}}]}} {"block_type": 4, "heading2": {"elements": [{"text_run": {"content": "📋 二级标题"}}]}} {"block_type": 5, "heading3": {"elements": [{"text_run": {"content": "三级标题"}}]}} -// 四级标题(日志日期专用) {"block_type": 6, "heading4": {"elements": [{"text_run": {"content": "3月12日 "}}], "style": {"align": 1}}} +{"block_type": 7, "heading5": {"elements": [{"text_run": {"content": "五级标题"}}]}} +{"block_type": 8, "heading6": {"elements": [{"text_run": {"content": "六级标题"}}]}} ``` -### 3. 高亮块 callout +### 3. 高亮块 callout(block_type: 19) ```json // 蓝色 [执行] {"block_type": 19, "callout": {"emoji_id": "sunrise", "background_color": 2, "border_color": 2, - "elements": [{"text_run": {"content": "[执行] 本月目标:日活突破500", "text_element_style": {"bold": true, "text_color": 7}}}]}} + "elements": [{"text_run": {"content": "[执行] 本月目标", "text_element_style": {"bold": true, "text_color": 7}}}]}} // 橙色 [警告] {"block_type": 19, "callout": {"emoji_id": "warning", "background_color": 4, "border_color": 4, @@ -111,11 +157,17 @@ python3 .../batch_upload_json_to_feishu_wiki.py /本地目录 --wiki-parent , size=, file= -# 返回: data.file_token +# 第一步:上传拿 file_token +POST drive/v1/medias/upload_all (form-data: file_name, parent_type=docx_image, parent_node=obj_token, size, file) ``` ```json // 第二步:插入 file 块 {"block_type": 12, "file": {"file_token": "xxx", "view_type": "inline", "file_name": "chart.png"}} -// 或 gallery 块(多图) +// 或画廊块(多图) {"block_type": 18, "gallery": {"image_list": [{"file_token": "xxx"}], "gallery_style": {"align": "center"}}} ``` ---- +### 8. 分栏(block_type: 24 + 25) -## Markdown → 飞书 Block 转换规则 +```json +// 创建两栏容器 +{"block_type": 24, "grid": {"column_size": 2}} +// 子列(API 自动生成,内容插入到各列下) +{"block_type": 25, "grid_column": {"width_ratio": 50}} +``` -| Markdown | 飞书 block_type | 字段名 | -|:---|:---|:---| -| `# 标题` | 3 | heading1 | -| `## 标题` | 4 | heading2 | -| `### 标题` | 5 | heading3 | -| `#### 标题` | 6 | heading4 | -| 普通段落 | 2 | text | -| `> 引用` | 19 | callout(background_color:2) | -| `---` | 22 | divider | -| ` ```代码``` ` | 14 | code(language:1) | -| `**加粗**` | 2 | text_element_style.bold=true | -| `![图](路径)` | 12 | file(先 upload_all) | -| Markdown 表格 | 2 | TSV 正文回退(接口不支持带内容表格块) | -| `- [ ]` 未完成 | 17 | todo.style.done=false | -| `- [x]` 已完成 | 17 | todo.style.done=true | +### 9. 电子表格(block_type: 30) + +```json +{"block_type": 30, "sheet": {"row_size": 5, "column_size": 4}} +``` + +> 最大 9×9,创建后通过 sheets API 写入单元格 + +### 10. 多维表格(block_type: 43) + +```json +{"block_type": 43, "bitable": {"token": "bascnXXX"}} +``` + +> 须 bitable:app 权限 --- -## text_element_style 样式参数 +## Markdown → 飞书 Block 转换规则(完整版) + +| Markdown | block_type | 字段名 | 备注 | +|:---|:---|:---|:---| +| `# 标题` | 3 | heading1 | | +| `## 标题` | 4 | heading2 | | +| `### 标题` | 5 | heading3 | | +| `#### 标题` | 6 | heading4 | | +| `##### 标题` | 7 | heading5 | | +| `###### 标题` | 8 | heading6 | | +| 普通段落 | 2 | text | | +| `**加粗**` | 2 | bold=true | elements 拆分 | +| `*斜体*` | 2 | italic=true | | +| `~~删除线~~` | 2 | strikethrough=true | | +| `` `代码` `` | 2 | inline_code=true | | +| `[链接](url)` | 2 | link.url | | +| `> 引用` | 19 | callout 蓝色 | | +| `---` | 22 | divider | | +| ` ```代码``` ` | 14 | code | 自动识别 language | +| `![图](路径)` | 12 | file | 先 upload_all | +| `- 无序` | 2 | `• ` 前缀 | 正文块模拟 | +| `1. 有序` | 2 | `1)` 前缀 | 正文块模拟 | +| `- [ ]` | 17 | done=false | | +| `- [x]` | 17 | done=true | | +| 表格 ≤9×9 | 30 | sheet | | +| 表格 >9×9 | 2 | TSV 正文 | 保底方案 | + +--- + +## text_element_style 参数 ```json { - "text_element_style": { - "bold": true, - "italic": true, - "strikethrough": true, - "underline": true, - "inline_code": true, - "text_color": 5, // 1黑 2深灰 3深橙 4橙 5红 6玫红 7紫 8浅蓝 9深蓝 10绿 - "background_color": 2, // 行内高亮 - "link": {"url": "https://..."} - } + "bold": true, "italic": true, "strikethrough": true, "underline": true, "inline_code": true, + "text_color": 5, // 1黑 2深灰 3深橙 4橙 5红 6玫红 7紫 8浅蓝 9深蓝 10绿 + "background_color": 2, + "link": {"url": "https://..."} } ``` @@ -207,18 +280,16 @@ form-data: file_name=chart.png, parent_type=docx_image, parent_node=, | 用途 | 方法 | 路径 | |:---|:---|:---| | 获取 Wiki 节点 | GET | `wiki/v2/spaces/get_node?token={wiki_token}` | -| 拉取文档块列表 | GET | `docx/v1/documents/{doc_id}/blocks` | -| 追加子块(写入内容) | POST | `docx/v1/documents/{doc_id}/blocks/{block_id}/children` | +| 获取文档块 | GET | `docx/v1/documents/{doc_id}/blocks` | +| **追加子块** | POST | `docx/v1/documents/{doc_id}/blocks/{block_id}/children` | | 批量删除块 | POST | `docx/v1/documents/{doc_id}/blocks/batch_delete` | -| 上传图片/文件 | POST | `drive/v1/medias/upload_all` | +| **上传图片/文件** | POST | `drive/v1/medias/upload_all` | | 创建 Wiki 子节点 | POST | `wiki/v2/spaces/{space_id}/nodes` | | 创建多维表格 | POST | `bitable/v1/apps` | +| 写入表格单元格 | PUT | `sheets/v2/spreadsheets/{token}/values` | -**追加子块请求体格式**: -```json -{"children": [块1, 块2, ...], "index": 0} -``` -> `index: 0` = 最前,`-1` 或不传 = 末尾,单次 ≤ 50 块 +**追加子块请求体**:`{"children": [块1, 块2, ...], "index": 0}` +> `index: 0` = 最前,不传 = 末尾。**单次 ≤ 50 块** --- @@ -226,23 +297,26 @@ form-data: file_name=chart.png, parent_type=docx_image, parent_node=, | 错误码 | 原因 | 解决 | |:---|:---|:---| -| 9499 | 带 cells 的 table 块不支持 | 改用 TSV 正文回退 | -| 1770001 | 字段名/格式错误 | 确认字段名正确;图片先上传再用 token | -| 1770013 | file_token 文档关联错误 | upload_all 时 parent_node 用正确的 obj_token | -| token 过期 | access_token 2 小时有效期 | `python3 脚本/feishu_token_cli.py get-access-token` | -| 多维表格权限不足 | 未开通 bitable:app | 后台开通后 `python3 脚本/feishu_force_reauth.py` | +| 9499 | table(31) 带 cells 不支持 | TSV 正文(2) 或 sheet(30) | +| 1770001 | 字段名/格式错误 | 确认字段名;图片先上传再插入 | +| 1770013 | file_token 关联错误 | parent_node 用正确的 obj_token | +| token 过期 | 2小时有效期 | `python3 脚本/feishu_token_cli.py get-access-token` | +| 多维表格权限不足 | 未开通 bitable:app | `python3 脚本/feishu_force_reauth.py` | +| 块数 > 50 | 单次写入上限 | 分批,每批 ≤ 50 | +| sheet >9×9 | 电子表格上限 | 改用 TSV 正文(2) 回退 | --- ## 相关文件(Files) -- **全量手册**:`参考资料/飞书JSON格式全手册.md` +- **全量手册**:`参考资料/飞书JSON格式全手册.md`(v2.0,含完整枚举+SOP+决策树) - **API 对照**:`参考资料/飞书日志JSON格式与API对照.md` - **图片 API**:`参考资料/飞书docx插入图片_API说明.md` +- **转换脚本**:`脚本/md_to_feishu_json.py` - **上传脚本**:`脚本/upload_json_to_feishu_doc.py` - **批量上传**:`脚本/batch_upload_json_to_feishu_wiki.py` - **统一发布**:`脚本/feishu_article_unified_publish.py` -- **项目 JSON 样本**:`/Users/karuo/Documents/1、金:项目/3、自营项目/soul创业实验/飞书格式/`(52 个文件) +- **项目样本**:`/Users/karuo/Documents/1、金:项目/3、自营项目/soul创业实验/飞书格式/`(52 个文件) --- diff --git a/SKILL_REGISTRY.md b/SKILL_REGISTRY.md index 36a06431..f70448da 100644 --- a/SKILL_REGISTRY.md +++ b/SKILL_REGISTRY.md @@ -1,7 +1,7 @@ # 卡若AI 技能注册表(Skill Registry) > **一张表查所有技能**。任何 AI 拿到这张表,就能按关键词找到对应技能的 SKILL.md 路径并执行。 -> 70 技能 | 14 成员 | 5 负责人 +> 69 技能 | 14 成员 | 5 负责人 > 版本:5.4 | 更新:2026-03-01 > > **技能配置、安装、删除、掌管人登记** → 见 **`运营中枢/工作台/01_技能控制台.md`**。 @@ -96,7 +96,6 @@ | W14 | **卡猫复盘** | 水桥 | **卡猫复盘、婼瑄复盘、卡猫今日复盘、婼瑄今日、复盘到卡猫、发卡猫群** | `02_卡人(水)/水桥_平台对接/飞书管理/卡猫复盘/SKILL.md` | 婼瑄目录→目标=今年总目标+完成%+人/事/数具体→飞书+卡猫群 | | W15 | **接收短信** | 水桥 | **接收短信、收短信、receivesms、接码、临时号码、获取短信、拿短信、等刷新拿短信** | `02_卡人(水)/水桥_平台对接/接收短信/SKILL.md` | receivesms.co 取英国临时号→命令行抓该号最新一条短信(可 --wait 等刷新);输出号码+短信,含「要获取的网站短信类型」说明 | || W16 | **飞书JSON格式** | 水桥 | **飞书json、飞书json格式、飞书block、飞书块格式、飞书文档格式、json上传飞书、飞书格式怎么写、block_type、飞书块类型、飞书callout、飞书高亮块、飞书代码块** | `02_卡人(水)/水桥_平台对接/飞书管理/飞书JSON格式_SKILL.md` | 飞书文档 JSON 格式速查/编写/上传;block_type 全覆盖、Markdown 转换对照、API 一站式参考 | -| W17 | **复盘总结发飞书群** | 水桥 | **复盘发飞书、飞书复盘、对话总结发群、复盘总结发群** | `02_卡人(水)/水桥_平台对接/飞书管理/复盘总结发飞书群_SKILL.md` | 每次对话完成后将简洁复盘总结发到飞书群(webhook);长对话必发,强制规则 | ## 木组 · 卡木(产品内容创造) @@ -117,7 +116,6 @@ | M07 | PPT制作 | 木果 | **PPT、做PPT、制作PPT、演示文稿、汇报PPT** | `03_卡木(木)/木果_项目模板/PPT制作/SKILL.md` | python-pptx 创建/编辑 .pptx,输出到报告目录 | | M08 | Next AI Draw | 木果 | **next ai draw、AI画图、画图表、架构图、流程图** | `03_卡木(木)/木果_项目模板/Next AI Draw/SKILL.md` | AI 生成 draw.io 风格图、Mermaid 图表,与 PPT 联动 | | M09 | 卡若个人介绍 | 木果 | **卡若介绍、个人介绍、卡若人设、我是谁** | `03_卡木(木)/木果_项目模板/卡若个人介绍/SKILL.md` | 生成卡若个人介绍(PPT/短文/一页纸) | -| M10 | **CLI万能化** | 木识 | **木识、CLI万能化、cli-anything、软件识形、让软件Agent化、任意软件CLI、给软件生成CLI、GUI转CLI、让软件可被AI控制** | `03_卡木(木)/木识_软件识形/CLI万能化/SKILL.md` | 任意软件→Agent可驱动CLI;7阶段全自动流水线;与木根联动 | ## 火组 · 卡火(技术研发优化) diff --git a/运营中枢/scripts/receivesms_find_soul_numbers.py b/运营中枢/scripts/receivesms_find_soul_numbers.py new file mode 100644 index 00000000..a426d9ec --- /dev/null +++ b/运营中枢/scripts/receivesms_find_soul_numbers.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +从 receivesms.co 英国号里筛出「收件箱里出现过 Soul 短信」的号码,作为最可能能注册 Soul 的临时号(最多返回 5 个)。 +注意:该站无中国(+86)号;Soul 若仅支持中国手机则需用国内接码平台。 +""" +import re +import time +import urllib.request + +BASE = "https://www.receivesms.co" +LIST_URL = BASE + "/british-phone-numbers/gb/" + + +def fetch(url): + req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"}) + with urllib.request.urlopen(req, timeout=20) as r: + return r.read().decode("utf-8", errors="replace") + + +def parse_number_list(html): + blocks = re.findall( + r'href="/gb-phone-number/(\d+)/"[^>]*>.*?(\+44[\d\s]+)', + html, + re.DOTALL + ) + return [(mid, num.replace(" ", "").strip()) for mid, num in blocks] + + +def inbox_has_soul(html): + """收件页是否出现过发件人为 Soul 的短信(不区分大小写)。""" + senders = re.findall(r'class="from-link">([^<]+)', html) + return any("soul" in s.lower() for s in senders) + + +def main(): + print("正在获取英国号码列表…", flush=True) + html_list = fetch(LIST_URL) + pairs = parse_number_list(html_list) + if not pairs: + print("未解析到任何号码") + return + print(f"共 {len(pairs)} 个英国号,筛出收件箱曾出现 Soul 的号码(最多 5 个)…", flush=True) + found = [] + for i, (mid, number) in enumerate(pairs): + if len(found) >= 5: + break + url = f"{BASE}/gb-phone-number/{mid}/" + try: + html = fetch(url) + if inbox_has_soul(html): + found.append((number, url)) + print(f" [{len(found)}/5] {number} 收件箱有 Soul 短信", flush=True) + except Exception as e: + pass + time.sleep(0.7) + if not found: + print("未找到收件箱含 Soul 的号码;可改用全部英国号逐一尝试。") + print("前 5 个英国号(可自行试注册 Soul):", flush=True) + for number, url in [(n, f"{BASE}/gb-phone-number/{m}/") for m, n in pairs[:5]]: + print(f" {number} {url}") + return + print("\n--- 最可能能注册 Soul 的 5 个号码(站上曾收到 Soul 验证码)---") + for number, url in found: + print(f"{number}\t{url}") + print("\n说明:receivesms.co 无中国(+86)号;上述为英国号,仅当 Soul 支持国际号时可用。Soul 若仅支持中国大陆手机,需用国内接码平台。") + + +if __name__ == "__main__": + main() diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index e1ed327b..2f1f011f 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -316,3 +316,4 @@ | 2026-03-12 23:10:30 | 🔄 卡若AI 同步 2026-03-12 23:10 | 更新:水桥平台对接、卡木、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-12 23:12:15 | 🔄 卡若AI 同步 2026-03-12 23:12 | 更新:运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-12 23:20:58 | 🔄 卡若AI 同步 2026-03-12 23:20 | 更新:Cursor规则、水桥平台对接、卡木、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-12 23:23:58 | 🔄 卡若AI 同步 2026-03-12 23:23 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index 4ceee3c7..2a8190d3 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -319,3 +319,4 @@ | 2026-03-12 23:10:30 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-12 23:10 | 更新:水桥平台对接、卡木、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-12 23:12:15 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-12 23:12 | 更新:运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-12 23:20:58 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-12 23:20 | 更新:Cursor规则、水桥平台对接、卡木、总索引与入口、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-12 23:23:58 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-12 23:23 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |