用一个真实 Skill 串联飞书 API、OpenClaw Agent 和多维表格。从开放平台配置到日常使用,完整走一遍。
三个角色各司其职:Python 脚本负责与飞书 API 交互,LLM 负责理解和结构化,再由脚本写回多维表格。
用户只需在飞书对话框粘贴妙记链接,Agent 自动识别意图并执行完整三步流程。
一次授权,永久有效。feishu_auth.py 在每次调用时自动用 refresh_token 换取新 access_token。
文字记录和 tasks.json 都保存在 workspace/MeetingNotes/,方便人工检查或重新处理。
整个 Skill 只有一个文件需要修改——config.py。其余文件直接使用即可。
/base/ 后的那段?table= 后的那段https://xxx.feishu.cn/base/SFOHwBdaqipoP8ku9b...?table=tblmvJ01...五步完成配置,Step 4 的 OAuth 授权只需做一次,之后 token 自动续期。
open.feishu.cn → 你的应用 → 权限管理,开通以下两个权限:| 权限名称 | 身份类型 | 用途 |
|---|---|---|
minutes:minutes.transcript:export | 用户身份 | 读取妙记文字记录 |
bitable:app | 应用身份 | 写入多维表格 |
http://localhost:8788/callback,否则 OAuth 授权会失败。scripts/config.py,填入四个配置项(见上方结构说明)。这是唯一需要修改的文件。scripts/ 目录下运行授权脚本:python oauth_init.py
成功!token 已保存到 .user_token.json
access_token 有效期:7200 秒(约 2 小时)
feishu-minutes-to-tasks 文件夹压缩为 .zip,然后:OpenClaw → Settings → Capabilities → Skills → Upload SkillSKILL.md 是 Agent 的工作说明书。看看这个 Skill 的每个设计决策背后的逻辑。
---
name: feishu-minutes-to-tasks
description: 自动将飞书妙记会议录音转化为多维表格待办事项。
当用户发送飞书妙记链接或 token、说"帮我整理会议待办"、
"处理妙记"、"提取会议任务"、"会议记录转待办"时使用。
支持输入完整链接(https://xxx.feishu.cn/minutes/obcnXXX)
或直接输入 token(obcnXXX)。
---
列举具体触发短语: "帮我整理会议待办" "处理妙记" "提取会议任务" 列举输入格式变体: 完整链接 / 纯 token → Claude 能精准识别意图
description: 处理飞书会议相关任务 没有具体短语 没有输入格式说明 没有使用场景举例 → 触发率低,容易误触发
这个 Skill 最关键的设计是明确区分「脚本做什么」和「LLM 做什么」:
只负责 HTTP 调用和文件读写。get_transcript.py 拿到原始文本就保存,不做任何解析。write_bitable.py 只管格式转换和批量写入。
读取 txt 全文,理解会议内容,提取结构化 JSON。所有「智能」工作在这里发生。这意味着改进提取质量只需改 SKILL.md 的 Step 2 规则,不动代码。
deadline 一律留 "",绝不写自然语言描述。
这条规则解决的是一个真实 bug:早期版本没有约束,LLM 会把"下周五"写入 deadline 字段,write_bitable.py 的日期转换函数无法处理,触发 DatetimeFieldConvFail 错误。通过在提示词层面强制约束输出格式,完全避免了这类问题。
[
{"task": "任务描述清晰完整", "owner": "张三", "deadline": "2026-03-20"},
{"task": "无明确负责人的任务", "owner": "", "deadline": ""},
{"task": "模糊时间的任务", "owner": "李四", "deadline": ""} ← 不写"下周"
]
四个脚本各有分工。了解它们的设计逻辑,方便在需要时进行调试或扩展。
这是整个认证体系的核心。每次被调用时,它用本地 .user_token.json 中存储的 refresh_token 向飞书换取新的 access_token,并更新文件。
用户只需授权一次 access_token 自动续期 refresh_token 也会被更新 无需手动管理有效期
如果 refresh_token 也过期 (极少发生,约180天) 需要重新运行 oauth_init.py 报错:刷新 token 失败 (99991679)
在本地启动一个临时 HTTP Server 监听 :8788/callback,打开飞书授权页,捕获授权码,换取 token 后保存到 .user_token.json。
HTTPServer,只处理一次请求(handle_request()),超时 120 秒自动退出。不依赖任何框架,零额外依赖。
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。逻辑极简,拿到内容直接写文件。
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。
配置完成后,日常使用只需在飞书发一条消息。
# 完整链接形式
帮我整理这次会议的待办 https://xxx.feishu.cn/minutes/obcnXXXXXX
# 带标题形式(推荐,写入多维表格时会显示来源)
处理妙记 obcnXXXXXX 会议标题:产品周会
# 简洁形式
提取会议任务 https://xxx.feishu.cn/minutes/obcnXXXXXX
2091005 permission deny。
已完成!从「产品周会」中提取 5 条待办事项,已写入多维表格。
📁 文字记录:MeetingNotes/transcript_obcnXXXXXX.txt
📋 待办清单:MeetingNotes/tasks_obcnXXXXXX.json
| 字段名 | 类型 | 来源 |
|---|---|---|
| 待办事项 | 文本 | LLM 提取的 task 字段 |
| 负责人 | 文本 | LLM 提取的 owner 字段,无则空 |
| 截止时间 | 日期 | deadline 转换为毫秒时间戳,无则不填 |
| 来源会议 | 文本 | 用户消息中的会议标题 |
| 状态 | 文本 | 固定值「未开始」 |
按错误码快速定位问题根源。
| 错误码 / 现象 | 根本原因 | 解决方案 |
|---|---|---|
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