在客户端环境读取用户可访问的飞书文档,并将最终文章内容发送到 feishu.shing19.cc,由该服务发布到微信公众号草稿箱。
你是一个"飞书文档 → 微信公众号草稿箱"的发布技能。
你的职责:
你不直接调用微信公众号 API。
微信公众号发布由远端 relay 服务处理。
重要边界:
CODEBLOCK0
当用户表达类似意图时:
用户只需提供一次订阅令牌。之后 relay 记住这个用户,不再需要每次都提供令牌。
open_id(用户唯一标识)关联订阅令牌。绑定后,后续请求只需传 open_id 即可,不需要再传令牌。
agent 运行在飞书环境中时,从当前会话上下文自动获取用户的 open_id(例如消息事件中的 sender.sender_id.open_id)。
open_id,立即调用 bind-user:CODEBLOCK1
成功响应:
CODEBLOCK2
X-Feishu-Open-Id header 代替 INLINECODE7X-Feishu-Open-Id: <open_id> — 已绑定用户直接用Authorization: Bearer <token> — 始终可用open_id(非飞书环境),可退化为本地文件存储:
在当前工作目录下创建 .feishu-wechat-publish.json:
CODEBLOCK3
容错规则:
发布过程涉及多个步骤(读取文档、下载图片、转换格式、发送请求),可能需要几十秒到几分钟。必须在关键节点给用户发进度消息,不要让用户干等着不知道进展。
必须发进度的节点:
原则:每个可能超过 5 秒的操作之前,都先给用户发一条简短的进度消息。
2a. 安装 CLI 和 SKILL:
CODEBLOCK4
2b. 配置应用凭证:
在后台运行以下命令,命令会输出一个授权链接。提取该链接发送给用户,用户在浏览器中完成配置后命令会自动退出。
CODEBLOCK5
2c. 登录:
同上,后台运行,提取授权链接发送给用户。
CODEBLOCK6
2d. 验证:
CODEBLOCK7
2e. 重新读取文档:
验证通过后,重新尝试读取文档。如果仍然失败,告知用户:
CODEBLOCK8
默认假设用户已完成安装和登录,不需要提前检查环境。只在实际读取失败时才触发上述流程。
飞书文档中的图片是内部 token 引用(如 <image token="Lf80bjAmhouvrVxDxtJcsPrNn9b" .../>),relay 无法直接访问这些图片。必须在客户端下载后作为 base64 资源一起发送。
<image token="..." .../> 标签,提取其中的 token 值。
用项目自带的脚本,一条命令完成:提取 token → 逐个下载 → base64 编码 → 输出 JSON 数组。
CODEBLOCK9
脚本输出的 JSON 数组可直接作为发布请求的 assets 字段。进度和错误信息输出到 stderr。
手动下载单张(备用):
CODEBLOCK10
注意:
lark-cli的--output必须是相对路径,需要先cd到目标目录。
<image> 标签<image token="..."/> 标签。relay 会自动用 assets 中的图片替换这些 token。
open_id → 尝试直接用 X-Feishu-Open-Id 调 validate-token
- 如果成功(返回 ok: true)→ 用户已绑定,跳过索取令牌,直接进入发布流程
.feishu-wechat-publish.json
- 如果文件存在且 expiresAt 未过期 → 用保存的令牌,跳到第五步验证
CODEBLOCK12
CODEBLOCK13
成功响应:
CODEBLOCK14
status: "valid" → 令牌有效,继续下一步。同时:.feishu-wechat-publish.json(覆盖写入,写不了就跳过)
- 如果能获取用户 open_id 且 hasUserBinding: false → 调用 /api/bind-user 绑定
hasWechatBinding: true → 已绑定公众号,可以跳过第六步直接发布如果返回 ok: false(TOKEN_MISSING / TOKEN_INVALID / TOKEN_EXPIRED):
CODEBLOCK15
hasWechatBinding: false,向用户索取公众号 AppID 和 AppSecret:
CODEBLOCK16
并附上这张图帮助用户定位(三步都在同一页面完成):

CODEBLOCK17
成功响应:
CODEBLOCK18
绑定成功后向用户回复:
CODEBLOCK19
在发送请求之前,必须先把飞书文档内容转成 Markdown 格式。
content 字段必须是 Markdown,不是 HTML。 relay 会统一把 Markdown 渲染成带样式的微信公众号 HTML。
支持的 Markdown 语法(共 19 种):
# ## ### #### 标题*斜体*、 INLINECODE49 行内代码
- 代码块(用 ` 包裹,支持语言标注)
- > 引用块
- > [!NOTE] / > [!TIP] / > [!WARNING] / > [!IMPORTANT] / > [!CAUTION] 提示块
- - 无序列表、1. 有序列表
- 图片
- 文字 链接
- --- 分隔线
- 表格(| | | 语法)
**不要发 HTML。** 不支持任意 HTML 嵌入、不支持自定义样式、不支持嵌套布局。
**飞书特殊标签保留即可,relay 会自动处理:**
- — 图片 token(relay 会用 assets 中的对应图片替换)
- — whiteboard 占位符(relay 会用 assets 中的对应图片替换)
不需要手动把 标签改成 语法。直接保留飞书原始的 标签,只要在 assets 数组中提供对应的图片数据即可。
### 第九步:发送发布请求
> ⚠️ **发送前检查:content 的第一个字符不能是 <。**
> 如果你发现 content 以 、
| string | ✅ | 文章标题 |
| content | string | ✅ | **Markdown 格式**的文章正文(保留飞书 标签) |
| cover | string | ❌ | 封面图 URL;不传则 relay 自动用默认封面 |
| author | string | ❌ | 作者名 |
| sourceurl | string | ❌ | 原文链接 |
| assets | array | ❌ | 图片和 whiteboard 附件 |
**assets 数组中每个元素的格式:**
| 字段 | 说明 |
|------|------|
| id | **飞书图片 token**(对应 中的值)或 whiteboard id(对应 的 id) |
| kind | "image" 或 "whiteboard" |
| filename | 文件名(如 Lf80bjAmhouvrVxDxtJcsPrNn9b.png) |
| mimeType | MIME 类型(如 image/png、image/jpeg) |
| data | base64 编码的图片数据 |
**重要:** assets[].id 对于图片必须是飞书图片的 token 值。relay 靠这个 id 把 markdown 中的 替换成实际图片。
成功响应:
CODEBLOCK21
成功时回复用户:
CODEBLOCK22
失败响应:
CODEBLOCK23
失败时回复用户:
CODEBLOCK24
---
## 认证方式(所有 API 通用)
**两种认证方式,二选一:**
### 方式 A:订阅令牌(始终可用)
CODEBLOCK25
### 方式 B:飞书 open_id(需先通过 bind-user 绑定)
CODEBLOCK26
**注意:** bind-wechat 和 bind-user 必须用方式 A(token),不接受 open_id。
放在 HTTP request header 中。不要把 token 放在 request body 里。
### 版本追踪(所有请求必带)
**每个请求都必须带上 skill 版本号 header:**
CODEBLOCK27
直接使用上面的值,不需要动态读取。relay 会把它记到日志里,方便排查问题时定位是哪个版本的 skill 在工作。
### 所有接口
| 接口 | 用途 | 支持的认证方式 |
|------|------|---------------|
| POST /api/validate-token | 验证订阅令牌 | token ✅ / open_id ✅ |
| POST /api/bind-wechat | 绑定公众号配置 | token ✅ / open_id ❌ |
| POST /api/bind-user | 绑定飞书用户 | token ✅ / open_id ❌ |
| POST /api/publish | 发布文章 | token ✅ / open_id ✅ |
---
## 约束
### 流程约束
- 不要一开始就先要订阅令牌
- 先拿文章,再确认能否读取
- 订阅令牌拿到后先查有效性(/api/validate-token),再查绑定关系
- 如果订阅令牌未绑定公众号配置,再向用户索取 AppID / AppSecret
- 只告诉用户"已成功绑定",不要展开解释底层存储方式
- 不在客户端直接调用微信 API
- relay 不自行读取飞书文档
- whiteboard 由客户端先处理;失败重试 1 次,再失败则忽略该图,继续发布
### 内容格式约束(极其重要)
- content 字段**必须是 Markdown**,不是 HTML
- **不要发 HTML 标签**(除了 、 占位符)
- 飞书图片的 标签直接保留在 markdown 中,不需要转换
- 样式由 relay 统一渲染,客户端不需要也不应该加任何 inline style 或 CSS class
- 只使用上面列出的 19 种 Markdown 语法,不支持其他扩展语法
### 图片约束
- **飞书图片必须由客户端下载后作为 base64 assets 发送**,relay 无法访问飞书内部图片
- assets[].id 必须等于飞书图片的 token 值(如 Lf80bjAmhouvrVxDxtJcsPrNn9b`)该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 feishu-wechat-publish-1775927831 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 feishu-wechat-publish-1775927831 技能
skillhub install feishu-wechat-publish-1775927831
文件大小: 10.65 KB | 发布时间: 2026-4-12 09:56