← Back to Skills Marketplace
afk101

Feishu Card JSON v2

by afk101 · GitHub ↗ · v0.2.1 · MIT-0
cross-platform ⚠ suspicious
331
Downloads
0
Stars
0
Active Installs
3
Versions
Install in OpenClaw
/install feishu-card-v2
Description
发送飞书互动卡片(Card JSON 2.0)。当需要让飞书用户填写表单、做选择、确认操作、或查看 结构化数据时,发送交互卡片代替纯文字问答。需要 feishu-cards 插件工具: feishu_send_card / feishu_send_form / feishu_update_card。
README (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" }]
        }]}]
      }
    ]
  }
}
Usage Guidance
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.
Capability Analysis
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.
Capability Assessment
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.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install feishu-card-v2
  3. After installation, invoke the skill by name or use /feishu-card-v2
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
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 全部组件。
Metadata
Slug feishu-card-v2
Version 0.2.1
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 3
Frequently Asked Questions

What is Feishu Card JSON v2?

发送飞书互动卡片(Card JSON 2.0)。当需要让飞书用户填写表单、做选择、确认操作、或查看 结构化数据时,发送交互卡片代替纯文字问答。需要 feishu-cards 插件工具: feishu_send_card / feishu_send_form / feishu_update_card。 It is an AI Agent Skill for Claude Code / OpenClaw, with 331 downloads so far.

How do I install Feishu Card JSON v2?

Run "/install feishu-card-v2" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Feishu Card JSON v2 free?

Yes, Feishu Card JSON v2 is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Feishu Card JSON v2 support?

Feishu Card JSON v2 is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Feishu Card JSON v2?

It is built and maintained by afk101 (@afk101); the current version is v0.2.1.

💬 Comments