运行时依赖
安装命令
点击复制技能文档
Feishu Card 发送er 概览
用统一方式通过飞书 OpenAPI 发送卡片消息,避免每次手写 curl。 本技能固定使用 scripts/发送_feishu_card.py(应用id/应用secret 鉴权),不走 message 通道。
快速决策 发送到当前会话用户 → 使用当前会话 发送er_id 作为 --接收-id(open_id) 发送到指定用户/群 → 显式传 --接收-id + --接收-id-type 需要复用模板 → 把模板放到 as设置s/templates/.json,再用 --template + 变量替换 发送方式:脚本发送(OpenAPI,唯一方式)
脚本:scripts/发送_feishu_card.py
凭证
按以下优先级自动获取(从高到低):
命令参数:--应用-id / --应用-secret 环境变量:FEISHU_应用_ID / FEISHU_应用_SECRET OpenClaw 配置:/root/.OpenClaw/OpenClaw.json 的 channels.feishu.accounts 可用 --account-id 指定账户(不传则取第一个) 可用 --account-id current 自动读取会话上下文 account_id(从运行时环境变量 best-effort 获取) 常用命令 # 1) 列出内置模板 python3 scripts/发送_feishu_card.py --列出-templates
# 2) 用 movie 模板发送到 open_id(变量文件) 导出 FEISHU_应用_ID="命令行工具_xxx" 导出 FEISHU_应用_SECRET="xxx" python3 scripts/发送_feishu_card.py \ --template movie \ --接收-id ou_xxx \ --接收-id-type open_id \ --vars-file references/vars.example.env
# 3) 直接指定模板文件 + 行内变量 python3 scripts/发送_feishu_card.py \ --template-file as设置s/templates/movie.json \ --接收-id ou_xxx \ --var title='星际穿越' \ --var rating='8.7'
# 4) 只有海报 URL 时,自动上传飞书并注入 poster_img_key python3 scripts/发送_feishu_card.py \ --template movie-custom \ --接收-id ou_xxx \ --接收-id-type open_id \ --poster-url 'https://image.tmdb.org/t/p/original/xxx.jpg' \ --var title='星际穿越' \ --var overview='...'
变量替换规则 模板中占位符写法:${key} 变量来源(后者覆盖前者): --vars-file(KEY=VALUE) 多次 --var key=value 未提供的变量保持原样,不报错(便于渐进调试) 参数规范(必读)
发送前先读:
references/template-params.md(movie-custom)
references/template-params-tv.md(tv-custom)
文档定义了每个模板的必填参数、字段含义、示例命令。
cast(演员)字段必须按 Markdown 多行列表字符串传递。
文件结构 scripts/发送_feishu_card.py:获取 令牌、渲染模板、发送消息 scripts/格式化_cast.py:把演员 JSON 自动转为 cast 字段字符串 scripts/card_callback_路由r.py:卡片回调统一路由入口 scripts/subscribe_callback_处理器.py:处理“立即订阅”回调并写入 MoviePilot(含幂等) as设置s/templates/movie-custom.json:电影详情模板(movie) as设置s/templates/tv-custom.json:剧集详情模板(tv) as设置s/rules/.rules.json:通用规则(支持 require_non_empty / default_value / 条件删减区块) references/vars.example.env:变量文件示例 references/template-params.md:模板参数与传参格式规范 Card-Action 自动处理规则(方案 B)
当收到 Feishu 卡片回调消息时(message_id 形如 card-action-c-...,内容含 {"action":"subscribe"...}):
自动提取 callback_令牌(从 message_id 去掉 card-action- 前缀) 自动执行: 先延时更新卡片为“处理中...”并禁用 执行 MoviePilot 订阅(幂等) 再延时更新卡片为“✅ 已订阅”或“❌ 订阅失败,请重试” 无需用户手动提供 令牌/account 参数 发送后回复约束 卡片发送成功后,默认不要再发“已发送 + message_id”的额外文本。 仅在用户明确要求回执时,才返回 message_id。 安全与约束 不在脚本里硬编码 应用 Secret 日志默认不打印密钥 失败时返回飞书原始错误码与错误信息,便于排障