feishu-doc-writer
飞书文档写入。Markdown 转 Block、创建文档块、处理并发,支持 Mermaid 绘图块。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o feishu-doc-writer.zip https://jpskill.com/download/21600.zip && unzip -o feishu-doc-writer.zip && rm feishu-doc-writer.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/21600.zip -OutFile "$d\feishu-doc-writer.zip"; Expand-Archive "$d\feishu-doc-writer.zip" -DestinationPath $d -Force; ri "$d\feishu-doc-writer.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
feishu-doc-writer.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
feishu-doc-writerフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
飛書ドキュメント書き込み
Docx API を介して飛書クラウドドキュメントにコンテンツを書き込みます。飛書ドキュメントはブロックツリーモデルを使用しており、生の Markdown は受け入れません。
ベース URL: https://open.feishu.cn/open-apis/docx/v1
認証とトークン取得
feishu_skills のルートディレクトリから共有スクリプトを実行します。
TOKEN="$(./scripts/get_feishu_token.sh)"
リクエストヘッダーはすべて Authorization: Bearer ${TOKEN} を使用します。
ビジネスインターフェースがトークン無効、期限切れ、または 401 を返した場合、強制的に更新した後、元のリクエストを一度だけ再試行します。
TOKEN="$(./scripts/get_feishu_token.sh --force-refresh)"
環境変数:
FEISHU_APP_IDFEISHU_APP_SECRET
ローカルキャッシュ: ./.feishu_token_cache.json(期限切れでなければ直接再利用、デフォルトでは 5 分前に更新)
推奨方法:変換 API
飛書は公式の Markdown → Blocks 変換エンドポイントを提供しています。
POST /documents/{document_id}/convert
{
"content": "# 标题\n\n正文\n\n- 列表项",
"content_type": "markdown"
}
✅ 手動で Block JSON を構築する必要がなく、標準 Markdown をサポートしています。 ⚠️ 飛書固有のブロック(Callout など)はサポートしていません — 手動で作成する必要があります。
ブロックタイプ
| block_type | 名称 | JSON Key | 説明 |
|---|---|---|---|
| 1 | ページ | page |
ドキュメントのルートノード |
| 2 | テキスト | text |
段落 |
| 3-11 | 見出し1-9 | heading1-heading9 |
- |
| 12 | 箇条書き | bullet |
各項目は個別のブロック |
| 13 | 番号付きリスト | ordered |
- |
| 14 | コードブロック | code |
style.language を指定する必要があります |
| 15 | 引用 | quote |
- |
| 17 | ToDo | todo |
style.done を持ちます |
| 19 | ハイライトブロック | callout |
飛書固有のコンテナブロック |
| 22 | 区切り線 | divider |
- |
| 27 | 画像 | image |
2ステップ:プレースホルダー作成 + アップロード |
| 31 | テーブル | table |
- |
ブロックの作成
POST /documents/{document_id}/blocks/{block_id}/children?document_revision_id=-1
{
"children": [...],
"index": 0
}
block_id: 親ブロックの ID(ルートノードにはdocument_idを使用)index: 挿入位置(0=先頭、-1=末尾)
ブロックの削除
親ブロックの下にある指定範囲の子ブロックを削除します。
DELETE /documents/{document_id}/blocks/{block_id}/children/batch_delete?document_revision_id=-1
{
"start_index": 3,
"end_index": 4
}
block_id: 操作対象の親ブロック IDstart_index: 開始子ブロックのインデックス(含む)end_index: 終了子ブロックのインデックス(含まない)- ⚠️ このインターフェースは
DELETEであり、POSTではありません。
ブロックの例
テキスト:
{"block_type": 2, "text": {"elements": [{"text_run": {"content": "段落"}}]}}
見出し:
{"block_type": 3, "heading1": {"elements": [{"text_run": {"content": "标题"}}]}}
コードブロック:
{
"block_type": 14,
"code": {
"style": {"language": 1},
"elements": [{"text_run": {"content": "console.log('hello')"}}]
}
}
Mermaid 描画ブロック(プラグインブロック):
{
"block_type": 40,
"add_ons": {
"component_type_id": "blk_631fefbbae02400430b8f9f4",
"record": "{\"data\":\"flowchart TD\\nA-->B\",\"theme\":\"default\",\"view\":\"codeChart\"}"
}
}
block_type = 40はプラグインブロックを表します。component_type_id = blk_631fefbbae02400430b8f9f4は Mermaid 描画に使用できます。recordは文字列化された JSON で、現在検証済みのフィールドは次のとおりです。data: Mermaid ソースコードtheme: 通常はdefaultを使用します。view: 通常はcodeChartを使用します。
- ドキュメントにすでに手動で「本文描画」形式の Mermaid が挿入されている場合、そのブロックを優先的に読み込み、その
component_type_id/theme/viewを再利用します。
ハイライトブロック(Callout):
{
"block_type": 19,
"callout": {
"background_color": 1,
"border_color": 1,
"emoji_id": "bulb"
},
"children": [
{"block_type": 2, "text": {"elements": [{"text_run": {"content": "提示内容"}}]}}
]
}
画像(2ステップ):
- プレースホルダーの作成:
{"block_type": 27, "image": {}} - アップロード:
PUT /documents/{document_id}/blocks/{block_id}/image
テキストスタイル
{
"text_run": {
"content": "样式文本",
"text_element_style": {
"bold": true,
"italic": true,
"strikethrough": true,
"underline": true,
"inline_code": true,
"background_color": 1,
"text_color": 1
}
}
}
並行処理
飛書ドキュメントは複数人での共同作業をサポートしており、並行処理に対応する必要があります。
- 最新のリビジョンを取得:
GET /documents/{document_id} - リビジョン付きで書き込み:
?document_revision_id={revision} - 競合時に再試行(HTTP 409)
Mermaid 推奨フロー
ユーザーが「本文描画形式で Mermaid を統一する」と要求した場合、通常のテキストブロックやコードブロック内の ```mermaid を直接書き込まないでください。
推奨される順序:
- まず、ターゲットドキュメントのすべてのブロックを読み込み、手動で調整された Mermaid 描画ブロックがすでに存在するかどうかを確認します。
- 存在する場合、そのブロックの以下を読み込みます。
block_typeadd_ons.component_type_idadd_ons.record
- 同じ描画ブロック構造を再利用して新しい図を作成し、
codeブロックを書き続けないでください。 - 新しい図の作成が成功した後、古い Mermaid コードブロックを削除し、ドキュメント内に2つのコンテンツセットが同時に残るのを避けます。
適用シナリオ:
- ユーザーが特定の Mermaid 図を手動で理想的なスタイルに変更し、「他の図もこの形式に変更してほしい」と要求した場合。
- 複数のフローチャートを同じ Docx 内で一貫した視覚効果に保つ必要がある場合。
実践的なアドバイス
- 通常の構造にはテキストブロック/見出しブロックを優先的に使用します。
- コード表示には
block_type = 14を使用します。 - フローチャート表示には Mermaid プラグインブロックを優先的に使用し、```mermaid を最終的な表示形式としないでください。
- 古い図を置き換える際は、まず新しいブロックを挿入し、次に古いブロックを削除して、コンテンツの損失を避けます。
- 一括置換に関わる場合、まず親ブロックの
childrenの順序を読み込み、次にindexに従って正確に削除します。
ベストプラクティス
- 変換 API を優先的に使用します(開発を簡素化します)。
- ブロックを一括作成します(API 呼び出しを減らします)。
- 並行処理の競合を処理します(revision パラメータを使用します)。
- 画像を2ステップで処理します(プレースホルダー + アップロード)。
- Mermaid 図は既存のプラグインブロック形式を優先的に再利用します。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
飞书文档写入
通过 Docx API 写入内容到飞书云文档。飞书文档使用 Block 树模型,不接受原始 Markdown。
Base URL: https://open.feishu.cn/open-apis/docx/v1
认证与 Token 获取
从 feishu_skills 根目录执行共享脚本:
TOKEN="$(./scripts/get_feishu_token.sh)"
请求头统一使用 Authorization: Bearer ${TOKEN}。
如果业务接口返回 token 无效、过期或 401,强制刷新后仅重试一次原请求:
TOKEN="$(./scripts/get_feishu_token.sh --force-refresh)"
环境变量:
FEISHU_APP_IDFEISHU_APP_SECRET
本地缓存: ./.feishu_token_cache.json(未过期直接复用,默认提前 5 分钟刷新)
推荐方式:转换 API
飞书提供官方 Markdown → Blocks 转换端点:
POST /documents/{document_id}/convert
{
"content": "# 标题\n\n正文\n\n- 列表项",
"content_type": "markdown"
}
✅ 无需手动构建 Block JSON,支持标准 Markdown ⚠️ 不支持飞书特有块(Callout 等)— 需手动创建
Block 类型
| block_type | 名称 | JSON Key | 说明 |
|---|---|---|---|
| 1 | 页面 | page |
文档根节点 |
| 2 | 文本 | text |
段落 |
| 3-11 | 标题1-9 | heading1-heading9 |
- |
| 12 | 无序列表 | bullet |
每项单独一个 block |
| 13 | 有序列表 | ordered |
- |
| 14 | 代码块 | code |
需指定 style.language |
| 15 | 引用 | quote |
- |
| 17 | 待办 | todo |
带 style.done |
| 19 | 高亮块 | callout |
飞书特有,容器块 |
| 22 | 分割线 | divider |
- |
| 27 | 图片 | image |
两步:创建占位 + 上传 |
| 31 | 表格 | table |
- |
创建 Blocks
POST /documents/{document_id}/blocks/{block_id}/children?document_revision_id=-1
{
"children": [...],
"index": 0
}
block_id: 父块 ID(根节点用document_id)index: 插入位置(0=开头,-1=末尾)
删除 Blocks
删除父块下指定范围的子块:
DELETE /documents/{document_id}/blocks/{block_id}/children/batch_delete?document_revision_id=-1
{
"start_index": 3,
"end_index": 4
}
block_id: 要操作的父块 IDstart_index: 起始子块下标(包含)end_index: 结束子块下标(不包含)- ⚠️ 该接口是
DELETE,不是POST
Block 示例
文本:
{"block_type": 2, "text": {"elements": [{"text_run": {"content": "段落"}}]}}
标题:
{"block_type": 3, "heading1": {"elements": [{"text_run": {"content": "标题"}}]}}
代码块:
{
"block_type": 14,
"code": {
"style": {"language": 1},
"elements": [{"text_run": {"content": "console.log('hello')"}}]
}
}
Mermaid 绘图块(插件块):
{
"block_type": 40,
"add_ons": {
"component_type_id": "blk_631fefbbae02400430b8f9f4",
"record": "{\"data\":\"flowchart TD\\nA-->B\",\"theme\":\"default\",\"view\":\"codeChart\"}"
}
}
block_type = 40表示插件块component_type_id = blk_631fefbbae02400430b8f9f4可用于 Mermaid 绘图record是字符串化 JSON,目前验证过的字段:data: Mermaid 源码theme: 通常用defaultview: 通常用codeChart
- 如果文档里已经有人手动插入过“本文绘图”格式的 Mermaid,优先先读取该块,再复用它的
component_type_id/theme/view
高亮块(Callout):
{
"block_type": 19,
"callout": {
"background_color": 1,
"border_color": 1,
"emoji_id": "bulb"
},
"children": [
{"block_type": 2, "text": {"elements": [{"text_run": {"content": "提示内容"}}]}}
]
}
图片(两步):
- 创建占位:
{"block_type": 27, "image": {}} - 上传:
PUT /documents/{document_id}/blocks/{block_id}/image
文本样式
{
"text_run": {
"content": "样式文本",
"text_element_style": {
"bold": true,
"italic": true,
"strikethrough": true,
"underline": true,
"inline_code": true,
"background_color": 1,
"text_color": 1
}
}
}
并发处理
飞书文档支持多人协作,需处理并发:
- 获取最新 revision:
GET /documents/{document_id} - 带 revision 写入:
?document_revision_id={revision} - 冲突时重试(HTTP 409)
Mermaid 推荐流程
当用户要求“按本文绘图格式统一 Mermaid”时,不要直接写普通文本块或代码块里的 ```mermaid。
推荐顺序:
- 先读取目标文档所有块,确认是否已存在人工调整好的 Mermaid 绘图块
- 如果存在,读取该块的:
block_typeadd_ons.component_type_idadd_ons.record
- 复用同样的绘图块结构创建新图,而不是继续写
code块 - 新图创建成功后,再删除旧的 Mermaid 代码块,避免文档里同时保留两套内容
适用场景:
- 用户已经把某一张 Mermaid 图手动改成了理想样式,要求“其他图也改成这种格式”
- 需要让多张流程图在同一篇 Docx 中保持一致视觉效果
实战建议
- 普通结构优先用文本块/标题块
- 代码展示用
block_type = 14 - 流程图展示优先用 Mermaid 插件块,不要把 ```mermaid 当最终呈现形式
- 替换旧图时,先插入新块,再删除旧块,避免内容丢失
- 涉及批量替换时,先读取父块 children 顺序,再按 index 精确删除
最佳实践
- 优先用转换 API(简化开发)
- 批量创建 blocks(减少 API 调用)
- 处理并发冲突(带 revision 参数)
- 图片分两步(占位 + 上传)
- Mermaid 图优先复用现有插件块格式