Week 2 · 实战案例

飞书妙记
自动转待办

用一个真实 Skill 串联飞书 API、OpenClaw Agent 和多维表格。从开放平台配置到日常使用,完整走一遍。

⚡ 实战 Skill · feishu-minutes-to-tasks v2.0

方案全景 / Overview

三个角色各司其职:Python 脚本负责与飞书 API 交互,LLM 负责理解和结构化,再由脚本写回多维表格。

Step 1
🎙️
获取文字记录
调用飞书妙记 API
下载全文转写内容
get_transcript.py
Step 2
🧠
提取待办事项
分析全文,识别任务、
负责人、截止时间
OpenClaw LLM
Step 3
📊
写入多维表格
批量写入结构化记录
自动标注来源会议
write_bitable.py
设计哲学:Python 脚本只做 API 调用,不做理解。理解和提取全部交给 LLM。这让 Skill 的「智能」部分可以随时迭代提示词来改善,而不用碰 Python 代码。

为什么选 OpenClaw + Skill?

🔗

飞书消息触发

用户只需在飞书对话框粘贴妙记链接,Agent 自动识别意图并执行完整三步流程。

🔄

Token 自动续期

一次授权,永久有效。feishu_auth.py 在每次调用时自动用 refresh_token 换取新 access_token。

📝

中间产物可审计

文字记录和 tasks.json 都保存在 workspace/MeetingNotes/,方便人工检查或重新处理。

Skill 包结构 / File Structure

整个 Skill 只有一个文件需要修改——config.py。其余文件直接使用即可。

feishu-minutes-to-tasks/ ├── SKILL.md # Skill 触发条件与工作流指令 └── scripts/ ├── config.py # ⭐ 唯一需要修改的文件 ├── feishu_auth.py # 获取 user_access_token(自动续期) ├── oauth_init.py # 一次性授权脚本 ├── get_transcript.py # 调用飞书 API 获取妙记文字记录 └── write_bitable.py # 写入多维表格
APP_ID
"cli_a9208xxxxxxx"
飞书开放平台 → 你的应用 → 凭证与基础信息
APP_SECRET
"rjSoZP..."
与 APP_ID 同处,妥善保管,不要提交到 Git
BITABLE_APP_TOKEN
"SFOHwBdaqipo..."
多维表格 URL 中 /base/ 后的那段
BITABLE_TABLE_ID
"tblmvJ01IClY..."
多维表格 URL 中 ?table= 后的那段
URL 解析示例:
https://xxx.feishu.cn/base/SFOHwBdaqipoP8ku9b...?table=tblmvJ01...
金色段 = BITABLE_APP_TOKEN  ·  绿色段 = BITABLE_TABLE_ID

安装配置 / Setup SOP

五步完成配置,Step 4 的 OAuth 授权只需做一次,之后 token 自动续期。

1
飞书开放平台 · 开通权限
进入 open.feishu.cn → 你的应用 → 权限管理,开通以下两个权限:
权限名称身份类型用途
minutes:minutes.transcript:export用户身份读取妙记文字记录
bitable:app应用身份写入多维表格
⚠️ 安全设置 → 重定向 URL → 添加 http://localhost:8788/callback,否则 OAuth 授权会失败。
⚠️ 权限申请后必须在「版本管理与发布」创建新版本并发布,权限才会生效。
2
修改 config.py
解压 Skill 包,用文本编辑器打开 scripts/config.py,填入四个配置项(见上方结构说明)。这是唯一需要修改的文件。
💡 AppID / AppSecret 来自开放平台「凭证与基础信息」;app_token / table_id 来自多维表格 URL。
3
多维表格添加应用
打开你的多维表格 → 右上角「···」→「更多」→「添加文档应用」→ 搜索你的飞书应用名称添加。
⚠️ 这步容易遗漏!跳过会导致 write_bitable.py 报 403 错误,看起来像权限问题,实际是文档应用未添加。
4
一次性 OAuth 授权
scripts/ 目录下运行授权脚本:
bash
python oauth_init.py
浏览器会自动打开飞书授权页,用你自己的飞书账号登录并点击授权。成功后命令行显示:
成功!token 已保存到 .user_token.json
access_token 有效期:7200 秒(约 2 小时)
💡 这步只需做一次。feishu_auth.py 会在每次调用时自动用 refresh_token 换取新 access_token,无需手动续期。
5
上传 Skill 到 OpenClaw
将整个 feishu-minutes-to-tasks 文件夹压缩为 .zip,然后:
OpenClaw → Settings → Capabilities → Skills → Upload Skill
上传 zip 文件,开启该 Skill。安装完成。

SKILL.md 设计解析

SKILL.md 是 Agent 的工作说明书。看看这个 Skill 的每个设计决策背后的逻辑。

Frontmatter · 触发配置

YAML
---
name: feishu-minutes-to-tasks
description: 自动将飞书妙记会议录音转化为多维表格待办事项。
  当用户发送飞书妙记链接或 token、说"帮我整理会议待办"、
  "处理妙记"、"提取会议任务"、"会议记录转待办"时使用。
  支持输入完整链接(https://xxx.feishu.cn/minutes/obcnXXX)
  或直接输入 token(obcnXXX)。
---
✓ 好的触发描述
列举具体触发短语:
"帮我整理会议待办"
"处理妙记"
"提取会议任务"

列举输入格式变体:
完整链接 / 纯 token

→ Claude 能精准识别意图
✗ 模糊的触发描述
description: 处理飞书会议相关任务

没有具体短语
没有输入格式说明
没有使用场景举例

→ 触发率低,容易误触发

三步工作流 · LLM 角色分工

这个 Skill 最关键的设计是明确区分「脚本做什么」和「LLM 做什么」:

🐍

Python 脚本的边界

只负责 HTTP 调用和文件读写。get_transcript.py 拿到原始文本就保存,不做任何解析。write_bitable.py 只管格式转换和批量写入。

🧠

LLM 的边界

读取 txt 全文,理解会议内容,提取结构化 JSON。所有「智能」工作在这里发生。这意味着改进提取质量只需改 SKILL.md 的 Step 2 规则,不动代码。

Step 2 分析规则 · 严格约束的重要性

关键规则:模糊时间("下周"、"下次会议前"、"尽快")→ deadline 一律留 "",绝不写自然语言描述。

这条规则解决的是一个真实 bug:早期版本没有约束,LLM 会把"下周五"写入 deadline 字段,write_bitable.py 的日期转换函数无法处理,触发 DatetimeFieldConvFail 错误。通过在提示词层面强制约束输出格式,完全避免了这类问题。

JSON 输出格式
[
  {"task": "任务描述清晰完整", "owner": "张三", "deadline": "2026-03-20"},
  {"task": "无明确负责人的任务", "owner": "", "deadline": ""},
  {"task": "模糊时间的任务", "owner": "李四", "deadline": ""}  ← 不写"下周"
]

脚本设计解析 / Scripts

四个脚本各有分工。了解它们的设计逻辑,方便在需要时进行调试或扩展。

Token 自动管理

这是整个认证体系的核心。每次被调用时,它用本地 .user_token.json 中存储的 refresh_token 向飞书换取新的 access_token,并更新文件。

✓ 设计优点
用户只需授权一次
access_token 自动续期
refresh_token 也会被更新
无需手动管理有效期
⚠️ 注意事项
如果 refresh_token 也过期
(极少发生,约180天)
需要重新运行 oauth_init.py
报错:刷新 token 失败 (99991679)

一次性 OAuth 授权

在本地启动一个临时 HTTP Server 监听 :8788/callback,打开飞书授权页,捕获授权码,换取 token 后保存到 .user_token.json

本地 Server 设计:用 Python 内置 HTTPServer,只处理一次请求(handle_request()),超时 120 秒自动退出。不依赖任何框架,零额外依赖。
授权 URL 构成
https://open.feishu.cn/open-apis/authen/v1/authorize
  ?app_id={APP_ID}
  &redirect_uri=http://localhost:8788/callback
  &scope=minutes%3Aminutes.transcript%3Aexport
  &response_type=code

获取妙记文字记录

调用飞书妙记导出 API,将文字记录保存为 transcript_<token>.txt。逻辑极简,拿到内容直接写文件。

API 端点
GET /open-apis/minutes/v1/minutes/{minute_token}/transcript
Authorization: Bearer {user_access_token}
最常见错误:返回 2091005 permission deny。原因是妙记默认不对外开放,需要原始创建者在妙记分享设置里把权限改为「获得链接可访问」。

写入多维表格

读取 LLM 生成的 tasks.json,批量写入飞书多维表格。关键逻辑是日期字段处理:

日期转换逻辑
def to_timestamp(date_str: str) -> int:
    # 飞书日期字段需要毫秒时间戳,不接受字符串
    if not date_str:
        return None  # 空字符串 → 不传该字段
    dt = datetime.strptime(date_str, "%Y-%m-%d")
    return int(dt.timestamp() * 1000)  # → 毫秒时间戳

deadline 为空字符串,直接跳过该字段(不传 None),避免触发 DatetimeFieldConvFail

日常使用 / Daily Usage

配置完成后,日常使用只需在飞书发一条消息。

触发消息格式

飞书消息示例
# 完整链接形式
帮我整理这次会议的待办 https://xxx.feishu.cn/minutes/obcnXXXXXX

# 带标题形式(推荐,写入多维表格时会显示来源)
处理妙记 obcnXXXXXX 会议标题:产品周会

# 简洁形式
提取会议任务 https://xxx.feishu.cn/minutes/obcnXXXXXX

发送前检查

分享权限:确认妙记创建者已将权限设置为「获得链接可访问」。操作路径:飞书妙记 → 右上角「···」→「分享」→ 权限设置。否则会报 2091005 permission deny

Agent 回复格式

成功响应
已完成!从「产品周会」中提取 5 条待办事项,已写入多维表格。
📁 文字记录:MeetingNotes/transcript_obcnXXXXXX.txt
📋 待办清单:MeetingNotes/tasks_obcnXXXXXX.json

多维表格字段结构

字段名类型来源
待办事项文本LLM 提取的 task 字段
负责人文本LLM 提取的 owner 字段,无则空
截止时间日期deadline 转换为毫秒时间戳,无则不填
来源会议文本用户消息中的会议标题
状态文本固定值「未开始」

常见问题 / FAQ

按错误码快速定位问题根源。

错误码 / 现象根本原因解决方案
2091005 permission deny 妙记未开放分享权限 让妙记创建者设置「获得链接可访问」
99991672 应用权限不足 开放平台未开通 bitable:app 应用身份权限 开放平台开通权限 → 发布新版本
99991679 用户授权不足 user_access_token 缺少妙记权限 / refresh_token 过期 重新运行 python oauth_init.py
403 多维表格写入失败 多维表格未添加文档应用 多维表格 → ··· → 更多 → 添加文档应用
DatetimeFieldConvFail 日期错误 LLM 写入了非 YYYY-MM-DD 格式的 deadline 检查 tasks.json,deadline 必须是 "2026-03-20"""
✓ 安装成功标志
oauth_init.py 输出:
  "成功!token 已保存到 .user_token.json"

发送妙记链接后:
  Agent 回复"已完成!..."
  多维表格出现新行
✗ 最常见卡点
① 忘记在开放平台发布新版本
  → 权限不生效

② 忘记给多维表格添加文档应用
  → 写入 403

③ 妙记未开放分享
  → 2091005