← 返回 Skills 市场
afk101

Feishu Card JSON v2

作者 afk101 · GitHub ↗ · v0.2.1 · MIT-0
cross-platform ⚠ suspicious
331
总下载
0
收藏
0
当前安装
3
版本数
在 OpenClaw 中安装
/install feishu-card-v2
功能描述
发送飞书互动卡片(Card JSON 2.0)。当需要让飞书用户填写表单、做选择、确认操作、或查看 结构化数据时,发送交互卡片代替纯文字问答。需要 feishu-cards 插件工具: feishu_send_card / feishu_send_form / feishu_update_card。
使用说明 (SKILL.md)

触发场景

发卡片 而非纯文字的情况:

  • 需要用户做选择(按钮/下拉/人员选择等)
  • 需要用户填写表单(输入框 + 提交按钮)
  • 需要展示结构化数据(表格、图表、多列布局)
  • 需要确认高风险操作(确认/取消双按钮)
  • 需要提供快速操作入口(按钮组)

纯文字:简单回复、解释说明、无需交互时,无需发卡片。


工具说明

工具 用途 主要参数
feishu_send_card 发送卡片消息 chat_id / user_idcard(JSON字符串)
feishu_send_form 发送含表单容器的卡片 同上,card 内须含 form 组件
feishu_update_card 更新已发卡片内容 token(回调中获取),card(新JSON)

卡片顶层结构

{
  "schema": "2.0",
  "config": { ... },
  "card_link": { "url": "..." },
  "header": { ... },
  "body": { "elements": [ ... ] }
}

config 字段速查

字段 默认值 说明
streaming_mode false 流式更新模式
enable_forward true 是否可转发
update_multi true 共享卡片(JSON 2.0 仅支持 true)
width_mode default(600px) compact(400px) / fill(撑满)
enable_forward_interaction false 转发后是否仍可交互
summary.content - 自定义聊天栏预览文案

header 字段速查

字段 说明 枚举/格式
title.tag 标题文本类型 plain_text / lark_md
title.content 主标题内容 字符串,最多4行
subtitle.content 副标题内容 字符串,最多1行
template 标题栏颜色 blue wathet turquoise green yellow orange red carmine violet purple indigo grey default
icon.tag 图标类型 standard_icon / custom_icon
icon.token 图标库token chat_outlined
text_tag_list[].color 后缀标签颜色 neutral blue turquoise lime orange violet indigo wathet green yellow red purple carmine
padding 标题内边距 默认 12px

body 字段速查

字段 默认值 说明
direction vertical vertical / horizontal
padding - 12px 12px
horizontal_spacing - small(4px) medium(8px) large(12px) extra_large(16px) 或 Npx
horizontal_align left left / center / right
vertical_spacing - 同 horizontal_spacing
vertical_align top top / center / bottom
elements [] 组件数组

组件速查

容器组件

column_set(分栏)

tag: column_set,不可内嵌 formtable

{
  "tag": "column_set",
  "flex_mode": "none",
  "horizontal_spacing": "8px",
  "background_style": "default",
  "columns": [
    {
      "tag": "column",
      "width": "weighted",
      "weight": 1,
      "vertical_align": "top",
      "elements": []
    }
  ]
}

关键枚举:

  • flex_mode: none / stretch / flow / bisect / trisect
  • column.width: auto / weighted / Npx([16,600]px)
  • background_style: default 或颜色枚举值

form(表单容器)

tag: form,只可放在卡片根节点,不可嵌套表格/表单

{
  "tag": "form",
  "name": "form_1",
  "elements": [
    { "tag": "input", "name": "reason", "required": true },
    {
      "tag": "button",
      "text": { "tag": "plain_text", "content": "提交" },
      "type": "primary_filled",
      "form_action_type": "submit",
      "name": "btn_submit"
    }
  ]
}
  • 表单内交互组件必须有 name 字段(唯一标识)
  • 按钮 form_action_type: submit(提交)/ reset(重置)

interactive_container(交互容器)

tag: interactive_container,不可内嵌 formtable

{
  "tag": "interactive_container",
  "width": "fill",
  "height": "auto",
  "has_border": true,
  "border_color": "grey",
  "corner_radius": "8px",
  "background_style": "default",
  "behaviors": [{ "type": "callback", "value": { "key": "val" } }],
  "elements": []
}

关键字段:

  • background_style: default / laser / 颜色枚举
  • behaviors.type: callback / open_url

collapsible_panel(折叠面板)

tag: collapsible_panel,不可内嵌 form,仅支持 JSON 代码(不支持搭建工具)

{
  "tag": "collapsible_panel",
  "expanded": false,
  "header": {
    "title": { "tag": "plain_text", "content": "面板标题" },
    "icon": { "tag": "standard_icon", "token": "down-small-ccm_outlined", "size": "16px 16px" },
    "icon_position": "right",
    "icon_expanded_angle": -180
  },
  "border": { "color": "grey", "corner_radius": "5px" },
  "elements": []
}
  • icon_position: left / right / follow_text
  • icon_expanded_angle: -180 / -90 / 90 / 180

内容组件

title(标题组件)

位于 header 字段,非 body elements,每卡只能有一个。见上方 header 速查。

div(普通文本)

tag: div

{
  "tag": "div",
  "text": {
    "tag": "plain_text",
    "content": "文本内容",
    "text_size": "normal",
    "text_color": "default",
    "text_align": "left"
  }
}
  • text.tag: plain_text / lark_md
  • text_size: heading-0(30px) heading-1(24px) heading-2(20px) heading-3(18px) heading-4(16px) heading(16px) normal(14px) notation(12px)
  • text_color: default 或颜色枚举

markdown(富文本)

tag: markdown

{
  "tag": "markdown",
  "content": "**粗体** *斜体* ~~删除线~~\
- 列表\
`code`\
> 引用",
  "text_align": "left",
  "text_size": "normal"
}

支持语法:**粗体***斜体*~~删除线~~[链接](url)\x3Cat id=open_id>\x3C/at>\x3Cat id=all>\x3C/at>\x3Cfont color=red>彩色\x3C/font>\x3Ctext_tag color='blue'>标签\x3C/text_tag># 标题、有序/无序列表、代码块、表格(Markdown表格语法)、\x3Chr>分割线

  • text_size: 同 div 枚举

img(图片)

tag: img,img_key 通过上传图片接口获取

{
  "tag": "img",
  "img_key": "img_v3_xxx",
  "scale_type": "crop_center",
  "size": "200px 150px",
  "corner_radius": "8px",
  "preview": true
}
  • scale_type: crop_center / crop_top / fit_horizontal
  • size: Wpx Hpx 或预设值,通栏用 margin: "0 -12px"

img_combination(多图混排)

tag: img_combination

{
  "tag": "img_combination",
  "combination_mode": "bisect",
  "img_list": [
    { "img_key": "img_v3_aaa" },
    { "img_key": "img_v3_bbb" }
  ]
}
  • combination_mode: double(双图) / triple(三图) / bisect(六宫格) / trisect(九宫格)

person(人员)

tag: person

{
  "tag": "person",
  "user_id": "ou_xxx",
  "size": "medium",
  "show_avatar": true,
  "show_name": true,
  "style": "normal"
}
  • size: extra_small / small / medium / large
  • style: normal / capsule

person_list(人员列表)

tag: person_list

{
  "tag": "person_list",
  "persons": [{ "id": "ou_xxx" }, { "id": "ou_yyy" }],
  "show_avatar": true,
  "show_name": true,
  "size": "medium"
}

chart(图表)

tag: chart,基于 VChart 定义

{
  "tag": "chart",
  "aspect_ratio": "16:9",
  "color_theme": "brand",
  "chart_spec": {
    "type": "bar",
    "data": [{ "id": "data", "values": [{ "x": "A", "y": 10 }] }],
    "xField": "x",
    "yField": "y"
  }
}
  • color_theme: brand / rainbow / complementary / diverging / ordinal

table(表格)

tag: table,只可放在卡片根节点,不支持内嵌其它组件

{
  "tag": "table",
  "page_size": 5,
  "row_height": "low",
  "columns": [
    { "name": "col1", "display_name": "名称", "data_type": "text", "width": "auto" },
    { "name": "col2", "display_name": "数量", "data_type": "number" }
  ],
  "rows": [
    { "col1": "项目A", "col2": 100 }
  ]
}
  • data_type: text / lark_md / number / options / persons / date
  • row_height: low / middle / high / auto
  • number.format: { symbol, precision, separator }

audio(音频)

tag: audio,仅支持 JSON 代码,需 enable_forward: false,仅飞书 V7.49+

{ "tag": "audio", "file_key": "file_v3_xxx", "show_time": true }

hr(分割线)

tag: hr

{ "tag": "hr" }

交互组件

input(输入框)

tag: input

{
  "tag": "input",
  "name": "reason",
  "placeholder": { "tag": "plain_text", "content": "请输入" },
  "required": false,
  "max_length": 200,
  "input_type": "text",
  "width": "fill"
}
  • input_type: text / multiline_text / password / number / telephone / email
  • width: default / fill / [100,∞)px
  • 表单外使用时,需配 behaviors 触发回调

button(按钮)

tag: button

{
  "tag": "button",
  "type": "primary_filled",
  "size": "medium",
  "text": { "tag": "plain_text", "content": "确认" },
  "behaviors": [{ "type": "callback", "value": { "action": "confirm" } }]
}
  • type: default primary danger text primary_text danger_text primary_filled danger_filled laser
  • size: tiny / small / medium / large
  • width: default / fill / Npx
  • behaviors.type: callback / open_url

overflow(折叠按钮组)

tag: overflow

{
  "tag": "overflow",
  "options": [
    { "text": { "tag": "plain_text", "content": "选项1" }, "value": "opt1" },
    { "text": { "tag": "plain_text", "content": "跳转" }, "multi_url": { "url": "https://..." } }
  ]
}

select_static(下拉单选)

tag: select_static

{
  "tag": "select_static",
  "name": "priority",
  "placeholder": { "tag": "plain_text", "content": "请选择" },
  "options": [
    { "text": { "tag": "plain_text", "content": "高" }, "value": "high" },
    { "text": { "tag": "plain_text", "content": "低" }, "value": "low" }
  ],
  "behaviors": [{ "type": "callback", "value": { "k": "v" } }]
}
  • type: default / text(边框样式)

multi_select_static(下拉多选)

tag: multi_select_static必须form 容器内

{
  "tag": "multi_select_static",
  "name": "tags",
  "placeholder": { "tag": "plain_text", "content": "请选择" },
  "options": [
    { "text": { "tag": "plain_text", "content": "标签A" }, "value": "a" }
  ]
}

select_person(人员单选)

tag: select_person

{
  "tag": "select_person",
  "name": "assignee",
  "placeholder": { "tag": "plain_text", "content": "选择负责人" },
  "options": [{ "value": "ou_xxx" }],
  "behaviors": [{ "type": "callback", "value": {} }]
}

multi_select_person(人员多选)

tag: multi_select_person必须form 容器内

{
  "tag": "multi_select_person",
  "name": "reviewers",
  "placeholder": { "tag": "plain_text", "content": "选择审核人" },
  "options": [{ "value": "ou_xxx" }, { "value": "ou_yyy" }]
}

date_picker(日期选择器)

tag: date_picker

{
  "tag": "date_picker",
  "name": "due_date",
  "initial_date": "2025-01-01",
  "placeholder": { "tag": "plain_text", "content": "请选择日期" }
}

picker_time(时间选择器)

tag: picker_time

{
  "tag": "picker_time",
  "name": "meeting_time",
  "initial_time": "09:00",
  "placeholder": { "tag": "plain_text", "content": "请选择时间" }
}

picker_datetime(日期时间选择器)

tag: picker_datetime

{
  "tag": "picker_datetime",
  "name": "event_datetime",
  "initial_datetime": "2025-01-01 09:00",
  "placeholder": { "tag": "plain_text", "content": "请选择" }
}

select_img(多图选择)

tag: select_img,仅支持 JSON 代码;不在 form 内时仅单选点击即提交

{
  "tag": "select_img", "name": "choice", "multi_select": false,
  "layout": "bisect", "aspect_ratio": "16:9",
  "options": [{ "img_key": "img_v3_aaa", "value": "pic1" }],
  "behaviors": [{ "type": "callback", "value": {} }]
}
  • layout: bisect / trisect / compact

checker(勾选器)

tag: checker,仅支持 JSON 代码

{
  "tag": "checker", "name": "task_done", "checked": false,
  "text": { "tag": "plain_text", "content": "任务已完成" },
  "behaviors": [{ "type": "callback", "value": { "task_id": "123" } }]
}

常用模板

1. 确认操作(双按钮)

{
  "schema": "2.0",
  "header": { "title": { "tag": "plain_text", "content": "确认操作" }, "template": "orange" },
  "body": {
    "elements": [
      { "tag": "markdown", "content": "确定要执行此操作吗?此操作**不可撤销**。" },
      {
        "tag": "column_set", "horizontal_spacing": "8px",
        "columns": [
          { "tag": "column", "width": "auto", "elements": [{
            "tag": "button", "type": "primary_filled",
            "text": { "tag": "plain_text", "content": "确认" },
            "behaviors": [{ "type": "callback", "value": { "action": "confirm" } }]
          }]},
          { "tag": "column", "width": "auto", "elements": [{
            "tag": "button", "type": "default",
            "text": { "tag": "plain_text", "content": "取消" },
            "behaviors": [{ "type": "callback", "value": { "action": "cancel" } }]
          }]}
        ]
      }
    ]
  }
}

2. 快捷选择(按钮组)

{
  "schema": "2.0",
  "header": { "title": { "tag": "plain_text", "content": "请选择优先级" }, "template": "blue" },
  "body": {
    "elements": [
      { "tag": "markdown", "content": "请为该任务设置优先级:" },
      {
        "tag": "column_set", "horizontal_spacing": "8px",
        "columns": [
          { "tag": "column", "width": "auto", "elements": [{
            "tag": "button", "type": "danger_filled",
            "text": { "tag": "plain_text", "content": "🔴 紧急" },
            "behaviors": [{ "type": "callback", "value": { "priority": "urgent" } }]
          }]},
          { "tag": "column", "width": "auto", "elements": [{
            "tag": "button", "type": "primary",
            "text": { "tag": "plain_text", "content": "🟡 普通" },
            "behaviors": [{ "type": "callback", "value": { "priority": "normal" } }]
          }]},
          { "tag": "column", "width": "auto", "elements": [{
            "tag": "button", "type": "default",
            "text": { "tag": "plain_text", "content": "🟢 低" },
            "behaviors": [{ "type": "callback", "value": { "priority": "low" } }]
          }]}
        ]
      }
    ]
  }
}

3. 数据展示(table + 操作按钮)

{
  "schema": "2.0",
  "header": { "title": { "tag": "plain_text", "content": "待处理工单" }, "template": "blue" },
  "body": {
    "elements": [
      {
        "tag": "table", "page_size": 5, "row_height": "low",
        "columns": [
          { "name": "id", "display_name": "工单号", "data_type": "text", "width": "80px" },
          { "name": "title", "display_name": "标题", "data_type": "text" },
          { "name": "status", "display_name": "状态", "data_type": "options" },
          { "name": "assignee", "display_name": "负责人", "data_type": "persons" }
        ],
        "rows": [
          { "id": "T001", "title": "登录异常", "status": [{ "name": "处理中", "color": "orange" }], "assignee": [{ "id": "ou_xxx" }] }
        ]
      },
      { "tag": "hr" },
      {
        "tag": "column_set", "horizontal_align": "right",
        "columns": [{ "tag": "column", "width": "auto", "elements": [{
          "tag": "button", "type": "primary_filled",
          "text": { "tag": "plain_text", "content": "查看全部" },
          "behaviors": [{ "type": "open_url", "default_url": "https://your-app.com/tickets" }]
        }]}]
      }
    ]
  }
}
安全使用建议
This plugin is coherent with its stated purpose (sending Feishu interactive cards), but before installing you should: 1) Confirm where Feishu credentials (appId and appSecret) must be stored — the code expects them in api.config.channels.feishu.accounts (not in env vars) but the plugin metadata/SKILL.md do not document this. 2) Understand that those credentials will be used to request tenant_access_tokens and to send/patch messages on your Feishu tenant (i.e., the plugin can act as the configured Feishu app). Only install if you trust the package source and are comfortable keeping app secrets in the agent configuration. 3) Verify that the built-in feishu callback handler/plugin is installed and that callbacks are routed securely. 4) Note the codebase contains two different implementations (one file does direct fetch calls; another imports plugin-sdk helpers) and the plugin's openclaw config schema does not reflect the actual credential shape — ask the publisher to clarify and update documentation/metadata before proceeding.
功能分析
Type: OpenClaw Skill Name: feishu-card-v2 Version: 0.2.1 The skill bundle provides legitimate tools for sending and updating Feishu (Lark) interactive cards and forms. The implementation in index.ts and src/send-card.ts uses official Feishu API endpoints (open.feishu.cn) for authentication and message delivery, and correctly retrieves credentials from the agent's configuration. The SKILL.md file contains standard documentation and usage guidelines for the AI agent without any evidence of prompt injection or malicious instructions.
能力评估
Purpose & Capability
Name/description match the code: the skill builds and sends Feishu Card JSON (schema 2.0). However, the code expects Feishu credentials (appId/appSecret) in api.config.channels.feishu.accounts, but the plugin metadata (openclaw.plugin.json and SKILL.md) do not declare or document these required credentials or config paths. That config requirement is not made explicit to the user and is therefore disproportionate to the stated 'no env vars / no creds' registry metadata.
Instruction Scope
SKILL.md instructs the agent to install the feishu-cards plugin and use the provided tools (feishu_send_card / feishu_send_form / feishu_update_card). It correctly limits network calls to Feishu APIs for sending/updating cards. However, SKILL.md does not clearly document that the agent must have Feishu account credentials configured (appId/appSecret) or where to place them; it does mention the built-in feishu plugin for callbacks but lacks configuration guidance.
Install Mechanism
Install spec is an npm plugin (@openclaw/feishu-cards). This is a standard registry install mechanism (no arbitrary URL downloads or archive extraction). package.json lists the plugin and a peer dependency on @openclaw/feishu, which is expected.
Credentials
Registry metadata reports no required environment variables or primary credential, but the code clearly requires Feishu appId/appSecret stored in agent config (cfg.channels.feishu.accounts). Requesting secret credentials without declaring them in requires.env/config schema is a mismatch and a security concern: users may not realize where secrets are stored or that the plugin will use them to obtain tenant_access_tokens and send messages on their behalf.
Persistence & Privilege
The skill is user-invocable and not force-included (always:false). It registers tools for explicit use and does not request global modifications or permanent elevation. Autonomous invocation is allowed by default but is not combined with other high-risk flags here.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install feishu-card-v2
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /feishu-card-v2 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v0.2.1
修复 src/send-card.ts 中 form_action_type 错误值:action_type:form_submit/form_reset → form_action_type:submit/reset(JSON 2.0 正确字段)
v0.2.0
SKILL.md 重写:基于官方文档真实内容,覆盖全部 26 组件,枚举值准确,含 3 个常用模板
v0.1.0
飞书互动卡片完整工具包:feishu_send_form(表单)、feishu_send_card(任意卡片)、feishu_update_card(更新卡片)。支持 Card JSON 2.0 全部组件。
元数据
Slug feishu-card-v2
版本 0.2.1
许可证 MIT-0
累计安装 0
当前安装数 0
历史版本数 3
常见问题

Feishu Card JSON v2 是什么?

发送飞书互动卡片(Card JSON 2.0)。当需要让飞书用户填写表单、做选择、确认操作、或查看 结构化数据时,发送交互卡片代替纯文字问答。需要 feishu-cards 插件工具: feishu_send_card / feishu_send_form / feishu_update_card。 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 331 次。

如何安装 Feishu Card JSON v2?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install feishu-card-v2」即可一键安装,无需额外配置。

Feishu Card JSON v2 是免费的吗?

是的,Feishu Card JSON v2 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。

Feishu Card JSON v2 支持哪些平台?

Feishu Card JSON v2 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 Feishu Card JSON v2?

由 afk101(@afk101)开发并维护,当前版本 v0.2.1。

💬 留言讨论