Files
John Qiu 712063071c refactor: 通用技能按类别拆分为独立目录
skills/ → skills-dev(9), skills-req(10), skills-ops(4),
skills-integration(8), skills-biz(4), skills-workflow(7)

generate-marketplace.py 改为自动扫描所有 skills-* 目录。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 11:31:58 +10:30

4.1 KiB
Raw Permalink Blame History

name, description
name description
feishu-docx 飞书云文档操作。用于创建、编辑云文档,插入内容块,会议纪要生成。当需要操作飞书云文档时使用。

飞书云文档 (Docx)

URL 结构

https://xxx.feishu.cn/docx/DoxcXXXXXX
                           └── document_id

创建文档

def create_document(title, folder_token=None):
    url = "https://open.feishu.cn/open-apis/docx/v1/documents"
    payload = {"title": title}
    if folder_token:
        payload["folder_token"] = folder_token
    response = requests.post(url, headers=headers, json=payload)
    doc = response.json()["data"]["document"]
    return {"document_id": doc["document_id"], "url": f"https://feishu.cn/docx/{doc['document_id']}"}

设置权限

def set_permission(document_id, editable=True):
    """设置文档为组织内可编辑/只读"""
    url = f"https://open.feishu.cn/open-apis/drive/v1/permissions/{document_id}/public"
    payload = {
        "external_access_entity": "open",
        "link_share_entity": "tenant_editable" if editable else "tenant_readable"
    }
    requests.patch(url, headers=headers, params={"type": "docx"}, json=payload)

内容块类型

类型 block_type 示例
段落 2 普通文本
一级标题 3 # 标题
二级标题 4 ## 标题
三级标题 5 ### 标题
无序列表 13 - 列表项
有序列表 14 1. 列表项
代码块 16 code
引用 18 > 引用
分割线 22 ---
图片 27 需先上传

创建内容块

def create_block(document_id, block_id, block_type, content):
    url = f"https://open.feishu.cn/open-apis/docx/v1/documents/{document_id}/blocks/{block_id}/children"

    if block_type in [3, 4, 5]:  # 标题
        block = {"block_type": block_type, "heading": {"elements": [{"text_run": {"content": content}}]}}
    elif block_type == 2:  # 段落
        block = {"block_type": 2, "text": {"elements": [{"text_run": {"content": content}}]}}
    elif block_type in [13, 14]:  # 列表
        block = {"block_type": block_type, "bullet/ordered": {"elements": [{"text_run": {"content": content}}]}}

    requests.post(url, headers=headers, json={"children": [block], "index": -1})

图片上传

# 1. 上传图片到素材库
def upload_image(file_path, parent_node):
    url = "https://open.feishu.cn/open-apis/drive/v1/medias/upload_all"
    with open(file_path, 'rb') as f:
        files = {'file': f}
        data = {'file_name': os.path.basename(file_path), 'parent_type': 'docx_image', 'parent_node': parent_node}
        response = requests.post(url, headers={"Authorization": f"Bearer {token}"}, files=files, data=data)
    return response.json()["data"]["file_token"]

# 2. 插入图片块
def insert_image(document_id, block_id, file_token):
    block = {"block_type": 27, "image": {"token": file_token}}
    # ... 同 create_block

会议纪要模板

def create_meeting_notes(title, date, attendees, agenda, decisions, action_items):
    doc = create_document(f"{title} - {date}")
    doc_id = doc["document_id"]

    # 获取根块
    root = requests.get(f".../documents/{doc_id}/blocks/{doc_id}").json()
    root_id = root["data"]["block"]["block_id"]

    # 添加内容
    create_block(doc_id, root_id, 3, f"会议纪要:{title}")
    create_block(doc_id, root_id, 2, f"日期:{date}")
    create_block(doc_id, root_id, 2, f"参会人:{', '.join(attendees)}")
    create_block(doc_id, root_id, 4, "议程")
    for item in agenda:
        create_block(doc_id, root_id, 13, item)
    create_block(doc_id, root_id, 4, "决议")
    for item in decisions:
        create_block(doc_id, root_id, 13, item)
    create_block(doc_id, root_id, 4, "待办事项")
    for item in action_items:
        create_block(doc_id, root_id, 14, item)

    return doc

完整工具类

~/.claude/skills/feishu/feishu_docx.py

注意事项

  • 创建文档必须指定 folder_token,否则会出现在「与我共享」
  • 默认存储到 C80gfkRnzlonQ5d4AhOcOACDnNg01运营文件夹
  • 图片必须先上传到素材库,再插入文档