协作办公
把本地 Markdown 转成飞书文档并自动上传图片时,用…
需要把本地 Markdown(含本地图片或 Mermaid 图)发布为飞书/Lark 文档时,按环境选择 uvx 或 feishu-docx 完成转换并上报结果。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
把本地 Markdown 转成飞书文档并特定
解决思路
- 用户只需提供 Markdown 文件路径;标题可选,若未提供则自动提取。
- 确定标题:读取 Markdown 文件,查找第一个 `# heading`,将其作为标题。
- 若 Markdown 中没有 `# heading`,扫描内容并根据主题生成一个简洁、描述性的标题。
- 若用户显式提供了标题,则优先使用用户提供的标题。
- 按顺序检查运行环境,使用第一个可用方案。
- 方案 A(优先)uvx:执行 `which uvx`;若 `uvx` 可用,运行 `uvx feishu-docx create "<TITLE>" -f <MARKDOWN_FILE_PATH>`。
- 若 `uvx` 运行在 Python < 3.11,追加 `--python 3.11`:运行 `uvx --python 3.11 feishu-docx create "<TITLE>" -f <MARKDOWN_FILE_PATH>`。
- 方案 B 已安装 feishu-docx:执行 `which feishu-docx`;若找到,检查 Python 版本:`python3 --version`;若 Python >= 3.11,运行 `feishu-docx create "<TITLE>" -f <MARKDOWN_FILE_PATH>`。
- 方案 C 两者都不可用:告知用户 `feishu-docx` 需要 Python >= 3.11,安装方式为:推荐安装 uv 后直接运行 `curl -LsSf https://astral.sh/uv/install.sh | sh`,再运行 `uvx feishu-docx create "Title" -f file.md`;或用 pip 全局安装 `pip install feishu-docx`。
- 方案 C 继续:告知用户必须先配置飞书凭证:`feishu-docx config set --app-id <APP_ID> --app-secret <APP_SECRET>`;然后停止并等待用户配置好环境。
- 预处理 Mermaid 块:`feishu-docx` 无法处理 Mermaid 代码块,上传前检查 Markdown 是否包含 ```mermaid 块,并先转换为图片。
- 扫描 Mermaid 块:读取 Markdown 文件,检查是否包含 ```mermaid 围栏代码块;若没有找到,跳到 Step 4。
- 创建临时副本:把原 Markdown 文件复制到同目录临时文件 `<original-name>.feishu-tmp.md`,例如 `blog_post.md` → `blog_post.feishu-tmp.md`;后续修改都在临时副本上进行,原文件绝不修改。
- 渲染 Mermaid 为 PNG:对临时文件中的每个 ```mermaid ... ``` 块,使用 mermaid.ink API 渲染为 PNG,可执行函数如下: ```python import base64, urllib.request def render_mermaid(code: str, output_path: str): """Render a Mermaid diagram to PNG via mermaid.ink API.""" encoded = base64.urlsafe_b64encode(code.encode()).decode() url = f"https://mermaid.ink/img/{encoded}?bgColor=white" req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) resp = urllib.request.urlopen(req, timeout=30) with open(output_path, "wb") as f: f.write(resp.read()) ```
- 渲染时注意:必须带 `User-Agent` 请求头,否则 mermaid.ink 返回 403。
- 保存渲染图片:将图片保存到 Markdown 文件同目录,并使用基于图表内容的描述性文件名,例如 `mermaid-architecture-overview.png`、`mermaid-data-flow.png`;不要用 `mermaid-1.png`、`diagram.png` 这类名字。
- 替换 Mermaid 块:在临时副本中,把每个 ```mermaid ... ``` 块替换为 Markdown 图片引用,例如 ``;使用从临时文件到渲染图片的相对路径。
- 使用临时文件上传:从这一步起,将临时文件作为 Step 4 中的 `<MARKDOWN_FILE_PATH>`。
- 运行命令:在 Markdown 文件所在目录(或其相对图片路径能被正确解析的目录)运行命令,以便本地图片引用可用;工具会把 Markdown 块转换为飞书格式、自动上传 Markdown 中引用的本地图片,并在上传图片前等待约 10s 以确保块一致性。
- 清理:若 Step 3 创建了临时文件,删除临时 Markdown 文件 `*.feishu-tmp.md`,并删除 Step 3c 创建的所有 Mermaid PNG 渲染文件(它们只在本次上传时需要)。
- 报告结果:向用户显示转换的块数、上传的图片数、创建的文档 ID、成功或失败状态。
- 若因认证错误失败,提醒用户配置凭证:`feishu-docx config set --app-id <APP_ID> --app-secret <APP_SECRET>`。
适用边界 · 注意事项
- 目标不是飞书/Lark 文档,或没有飞书应用凭证(app-id/app-secret)时。
- 无法使用 `uvx` 或全局安装 `feishu-docx`,或 Python 版本 < 3.11 且不能升级时。
- 文档中的 Mermaid 图包含敏感信息且不能发送到外部 mermaid.ink API 渲染时。