AccountingOnFeishu

Other

帮用户快速记录日常支出和收入到飞书多维表格。支持文字记账和图片小票 OCR 解析。首次使用时会学习用户已有的记账本习惯,或引导新建记账本。

Install

openclaw skills install accountingonfeishu

AccountingOnFeishu

描述

帮用户快速记录日常支出和收入到飞书多维表格。支持文字记账和图片小票 OCR 解析(每个项目单独生成一条记录)。

核心特性

  • 首次使用时,先询问用户是否有现成记账本
  • 如有:读取并学习其字段结构、分类习惯,后续按用户习惯记账
  • 如无:引导用户新建记账本(支持自定义分类体系)
  • 所有配置持久化到本地 config.json

使用场景

用户说以下类似的话时触发:

  • "记账 吃饭 50"
  • "记一笔 200 支出 购物"
  • "收入 5000 工资"
  • 发送图片小票说"记账"
  • "这个月花了多少"
  • "我要记账"(首次使用触发初始化)

Skill 名称

AccountingOnFeishu

配置文件

文件路径:~/.openclaw/workspace/skills/AccountingOnFeishu/config.json

首次使用时如果不存在,进入初始化流程

初始化流程(首次使用)

步骤 1:检查配置

检查 config.json 是否存在。

  • 存在 → 直接读取配置,进入记账流程
  • 不存在 → 进入步骤 2

步骤 2:询问用户

用自然语言问用户:

还没有配置记账本,你有现成的飞书多维表格记账本吗?

  1. → 请提供多维表格链接或 app_token + table_id,我来学习你的记账习惯
  2. 没有 → 我来帮你新建一个记账本

分支 A:用户有现成记账本

A1. 获取用户提供的链接或 token

用户可能提供:

  • 飞书多维表格链接(如 https://xxx.feishu.cn/base/APP_TOKEN
  • 或直接说 app_token 和 table_id

从链接中提取 app_token

A2. 学习记账本结构

获取表结构:

feishu_bitable_app_table_field > list
- app_token: <用户提供>
- table_id: <用户提供>

获取记录样本(学习分类习惯):

feishu_bitable_app_table_record > list
- app_token: <用户提供>
- table_id: <用户提供>
- page_size: 20

A3. 分析并保存配置

从表结构中提取关键信息:

学习项说明
fields所有字段名和类型
amount_field金额字段名(通常是"金额"或"钱数")
note_field备注字段名(通常是"备注"、"说明"、"描述")
type_field收支类型字段名(通常是"收支"、"类型"、"收入/支出")
date_field日期字段名(如果有)
category_field一级分类字段名(如果有)
sub_category_field二级分类字段名(如果有)
category_options一级分类的所有选项值(单选/多选字段的 options)
sub_category_options二级分类的所有选项值
income_value收入类型的选项值(如"收入"、"进账")
expense_value支出类型的选项值(如"支出"、"出账")

保存到 config.json:

{
  "app_token": "xxx",
  "table_id": "xxx",
  "table_name": "用户记账本",
  "fields": {
    "amount": "金额",
    "note": "备注",
    "type": "收支",
    "date": "日期",
    "category": "分类",
    "sub_category": "二级分类"
  },
  "type_options": {
    "income": "收入",
    "expense": "支出"
  },
  "category_options": ["餐饮", "交通", "购物", ...],
  "sub_category_options": ["早餐", "午餐", "晚餐", ...]
}

A4. 向用户确认

告诉用户已学习到的结构:

已学习你的记账习惯!

  • 金额字段:「金额」
  • 备注字段:「备注」
  • 分类字段:「分类」(有 15 个选项)
  • 收支字段:「收支」

以后直接说"记账 吃饭 50"就能按你的习惯记录了 ✅

分支 B:用户没有记账本(新建)

B1. 询问分类需求

我来帮你新建一个记账本,需要几个分类字段?

  1. 简单版:备注、金额、收支、日期(4个字段)
  2. 标准版:+ 一级分类(餐饮/交通/购物等)
  3. 完整版:+ 一级分类 + 二级分类

根据用户选择,调用建表流程。

B2. 创建多维表格

feishu_bitable_app > create
- name: "个人记账本"

返回 app_token

B3. 创建数据表(带字段)

feishu_bitable_app_table > create
- app_token: <上一步返回的>
- name: "记账明细"
- fields: [
    {"field_name": "备注", "type": 1},
    {"field_name": "金额", "type": 2, "property": {"formatter": "0.00"}},
    {"field_name": "收支", "type": 3, "property": {"options": [
      {"name": "收入", "color": 0},
      {"name": "支出", "color": 1}
    ]}},
    {"field_name": "日期", "type": 5, "property": {"auto_fill": true, "date_formatter": "yyyy-MM-dd"}},
    {"field_name": "分类", "type": 3, "property": {"options": [
      {"name": "餐饮", "color": 0},
      {"name": "交通", "color": 1},
      {"name": "购物", "color": 2},
      {"name": "娱乐", "color": 3},
      {"name": "住房", "color": 4},
      {"name": "医疗", "color": 5},
      {"name": "教育", "color": 6},
      {"name": "通讯", "color": 7},
      {"name": "服装", "color": 8},
      {"name": "社交", "color": 9},
      {"name": "旅行", "color": 10},
      {"name": "数码", "color": 11},
      {"name": "日用", "color": 12},
      {"name": "其他", "color": 13}
    ]}}
  ]

注意

  • 如果用户选择"完整版",再添加 二级分类 字段
  • 二级分类可以选项根据~/.openclaw/workspace/skills/AccountingOnFeishu/config.json.example来预设,或者也可以先留空让用户自己添加
  • 日期 字段设置 auto_fill: true,自动填充创建日期

B4. 保存配置

将新建的信息写入 config.json,格式同分支 A。

B5. 返回确认

记账本已创建!✅

📋 查看记账表格

以后直接说"记账 吃饭 50"就能记了

工作流程

流程 1:文字记账

前提config.json 已存在。

  1. 解析用户输入

    • 提取备注描述
    • 提取金额(数字或数学表达式)
      • 如果金额是表达式(如 50-41.83100*0.860+30),先计算结果
      • 支持 + - * / 和括号
      • 计算后取绝对值(避免负数)
    • 判断收支类型:
      • 有"收入"/"进账"/"到账"等关键词 → 收支 = config.type_options.income
      • 其他情况 → 收支 = config.type_options.expense
    • 备注 = 用户描述中的消费内容
  2. 智能分类(可选)

    • 如果配置中有 category_field,尝试根据备注关键词匹配分类:
      • 关键词包含 "饭"/"餐"/"吃"/"外卖" → 餐饮
      • 关键词包含 "车"/"地铁"/"公交"/"打车"/"油" → 交通
      • 关键词包含 "买"/"购"/"淘宝"/"京东" → 购物
      • 关键词包含 "电影"/"游戏"/"唱" → 娱乐
      • ...(其他关键词匹配)
    • 如果无法匹配,分类字段留空
  3. 写入多维表格 使用 config.json 中学习到的字段名:

    feishu_bitable_app_table_record > create
    - app_token: <config.app_token>
    - table_id: <config.table_id>
    - fields:
        <config.fields.note>: <备注>
        <config.fields.amount>: <金额>
        <config.fields.type>: <收入/支出>
        <config.fields.category>: <智能分类结果>(如果有)
    
    • 日期字段如果设置了 auto_fill,无需手动写入
  4. 返回确认

    • 简要告诉用户已记录
    • 附上多维表格链接:https://my.feishu.cn/base/<config.app_token>

流程 2:图片小票记账

  1. 下载并分析图片

    • 如果图片在消息中,先用 feishu_im_bot_imagefeishu_im_user_fetch_resource 下载
    • image 工具(Kimi vision)分析图片内容
  2. OCR 解析每个项目

    • 提示词应要求:列出小票上每个商品/项目,单独一行
    • 格式:<价格> <项目描述>
    • 忽略店名、总计、找零等无关信息
  3. 批量写入多维表格 使用 config.json 中学习到的字段名:

    feishu_bitable_app_table_record > batch_create
    - app_token: <config.app_token>
    - table_id: <config.table_id>
    - records: [
        { fields: { <note_field>: "项目描述1", <amount_field>: <价格>, <type_field>: <expense_value> } },
        { fields: { <note_field>: "项目描述2", <amount_field>: <价格>, <type_field>: <expense_value> } },
        ...
      ]
    
  4. 返回确认

    • 告诉用户共解析出 N 个项目
    • 总金额是多少
    • 附上多维表格链接

字段格式参考

字段名类型格式示例
备注/描述文本 (type=1)字符串"吃饭"、"小票-咖啡"
金额数字 (type=2)数字,不带货币符号50 或 128.5
收支/类型单选 (type=3)字符串,值从 config 读取"支出" 或 "收入"
日期日期 (type=5)毫秒时间戳自动填充时可不写
分类单选 (type=3)字符串,值从 config 读取"餐饮"
二级分类单选 (type=3)字符串,值从 config 读取"午餐"

重要

  • 所有字段名都从 config.json 中读取,不要假设固定名称
  • 金额只写数字,不带 ¥
  • 日期字段如设置了 auto_fill,无需手动写入

智能分类关键词映射

如果用户记账本有分类字段,可尝试按关键词匹配:

关键词分类
饭、餐、吃、外卖、食堂、火锅、烧烤餐饮
车、地铁、公交、打车、滴滴、油费、停车、高速交通
买、购、淘宝、京东、拼多多、天猫、商场购物
电影、游戏、唱K、酒吧、剧本杀、游乐场娱乐
房租、水电、物业、燃气、宽带住房
药、医院、诊所、体检、医保医疗
书、课、培训、考试、学费教育
话费、流量、宽带、电话通讯
衣服、鞋、包、化妆品、护肤品服装
朋友、聚会、送礼、红包社交
酒店、机票、火车票、景点、签证旅行
手机、电脑、耳机、键盘、鼠标数码
纸巾、洗发水、洗衣液、牙膏日用

匹配失败时分类留空,不强制填写。

财务建议生成(可选)

记录完成后,可以根据以下情况给出简短建议:

情况建议类型
单笔 > 500 元"这笔开支不小哦,考虑一下是否真的必要?"
同一类别当天多笔"今天在[X分类]花了[N]次,要不要合并一下?"
图片识别出多个项目"小票解析出[N]项,总共[X]元,平均每项[Y]元"
金额异常(过大或过小)"这个金额有点奇怪,确定没记错吗?"
无特别情况直接确认即可

原则:建议要简短、自然、不啰嗦,可以偶尔调皮一下。

注意事项

  • config.json 是核心配置文件,所有字段映射和 token 都在这里
  • 金额需要是数字类型,不是字符串
  • 单次批量创建最多 500 条(图片小票一般不会超)
  • 图片下载后保存在 /tmp/openclaw/
  • 解析图片时,prompt 要明确要求输出每个项目的价格和描述
  • 学习现有记账本时,如果字段类型不匹配(如金额字段是文本而非数字),向用户说明并询问是否需要调整