news 2026/10/22 0:09:03

ezBookkeeping API Tools 实战指南:用 ebktools 命令行脚本完成记账、查询与汇率获取

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ezBookkeeping API Tools 实战指南:用 ebktools 命令行脚本完成记账、查询与汇率获取
  • 后端
  • 前端
  • 金融科技

【免费下载链接】ezbookkeeping

ezBookkeeping is an open source, powerful, self-hosted personal finance app that is easy to use.

项目地址:https://gitcode.com/gh_mirrors/ez/ezbookkeeping
点击查看免费下载

ezBookkeeping 是开源、可自托管的个人记账应用,其官方 Skills 目录下内置了一套名为ebktools的 API 命令行工具(SKILL.md),允许你无需登录网页端,直接用 Shell 或 PowerShell 调用服务端 REST API 来完成新增交易、查询流水、读取账户/分类/标签以及拉取汇率等操作。阅读本文后,你将掌握 ebktools 的完整用法(list/help/ 直接调用)、全局时区与原始输出选项、12 个内置命令的详细参数,并能理解脚本底层如何与 ezBookkeeping 的/api/v1接口对接,从而把它接入自己的脚本、定时任务或 AI Agent 工作流。

一、认识 ebktools:ezBookkeeping 的 API 命令行封装

ebktools 不是独立的可执行程序,而是随仓库一起分发的两个脚本:

文件运行环境依赖
ebktools.shLinux / macOS(sh兼容 Shell)grep、sed、awk、date、curl、jq
ebktools.ps1Windows(PowerShell 5.1+ / 7+)无需额外依赖(内部使用Invoke-WebRequest)

两个脚本共享同一套"API 配置结构":脚本内部以 JSON(Shell 版)或 PowerShell 哈希表(PS 版)定义了每个命令的名称、HTTP 方法、请求路径、必填/可选参数、参数类型、参数说明、响应结构以及**美化输出(PrettyResponse)**规则。这意味着新增 API 只需扩展这份配置即可,无需改动调用逻辑。

从脚本的main()(ebktools.sh)可以看到,入口在执行前会先做两件事:检查必要依赖是否可用(缺失时报错并返回退出码 127),以及加载环境变量配置。

二、快速上手:配置、验证与三种基本用法

1. 配置服务器地址与 API Token

所有调用都依赖两个环境变量,缺一不可:

变量是否必填含义示例
EBKTOOL_SERVER_BASEURL必填ezBookkeeping 服务器基础地址(不包含/api/v1前缀)http://localhost:8080
EBKTOOL_TOKEN必填ezBookkeeping API Token(在 Web 端"Token 管理"中生成)一段 JWT 字符串

Linux / macOS 下通过export设置:

export EBKTOOL_SERVER_BASEURL="http://localhost:8080" export EBKTOOL_TOKEN="YOUR_TOKEN"

Windows PowerShell 下通过$env:设置:

$env:EBKTOOL_SERVER_BASEURL = 'http://localhost:8080' $env:EBKTOOL_TOKEN = 'YOUR_TOKEN'

关于 Token 的生成:脚本配置中tokens-list返回的tokenType字段约定1: Normal Token(普通登录会话)、5: MCP Token、8: API Token。后端在 pkg/api/tokens.go 中提供TokenGenerateAPIHandler生成 API Token,且只有USER_TOKEN_TYPE_NORMAL类型的当前令牌才有权生成 API Token(见TokenGenerateAPIHandler中对claims.Type != core.USER_TOKEN_TYPE_NORMAL的校验),因此建议在网页端登录后用"API Token"渠道生成专用令牌供脚本使用。

2. 列出所有可用命令

Linux / macOS:

sh scripts/ebktools.sh list

Windows:

scripts\ebktools.ps1 list

输出为按名称对齐的命令清单,例如tokens-list、accounts-list、transactions-add、exchangerates-latest、server-version等,每行附一句功能描述。

3. 查看某个命令的帮助

Linux / macOS:

sh scripts/ebktools.sh help <command>

Windows:

scripts\ebktools.ps1 help <command>

例如sh scripts/ebktools.sh help server-version。帮助页会展示:HTTP 方法、请求路径、是否需要当前时区信息、必填参数(含类型与说明)、可选参数、响应结构以及一条可直接复制的调用示例。由于帮助文本会根据当前系统时区动态生成示例,即使你记不住参数也能照着执行。

4. 直接调用 API

通用调用语法:

# Linux / macOS sh scripts/ebktools.sh [global-options] <command> [command-options] # Windows scripts\ebktools.ps1 [global-options] <command> [command-options]

最小示例——查询服务器版本:

sh scripts/ebktools.sh server-version

脚本会打印Calling API: GET http://localhost:8080/api/v1/systems/version.json,随后输出响应结果(默认格式化为 Markdown 表格,而非原始 JSON)。

三、全局选项:时区与输出格式

调用任何命令前可附加三个全局选项(Shell 版以--开头,PowerShell 版以-开头):

选项说明
--tz-name <name>/-tzName <name>当前时区的 IANA 名称,例如北京时间用Asia/Shanghai
--tz-offset <offset>/-tzOffset <offset>当前时区相对 UTC 的分钟偏移,例如 UTC+8 填480
--raw-response/-rawResponse关闭美化输出,直接显示原始 JSON 响应

时区选项存在如下优先级规则(见 ebktools.sh 的call_api实现):

  1. 若同时设置--tz-name与--tz-offset,--tz-name优先;
  2. 若两者都未设置,脚本自动探测当前系统时区(Linux 下读取/etc/timezone或解析/etc/localtime符号链接;Windows 下通过[System.TimeZoneInfo]::Local获取,并附带一张 Windows 时区 ID → IANA 名称的映射表,例如China Standard Time→Asia/Shanghai);
  3. 若探测失败,示例帮助文本会回退到Asia/Shanghai与偏移480;
  4. 若某个命令标记为RequiresTimezone: true(如transactions-list、transactions-add),而脚本既探测不到系统时区、也未提供上述选项,则会报错退出,提示补全时区信息。

为什么部分命令强制要求时区?因为交易的时间语义依赖"本地时区 + UTC 偏移"才能正确还原为账户所在地的记账时刻。脚本会把时区信息放入请求头X-Timezone-Name或X-Timezone-Offset一并发送给服务端。

--raw-response则适合调试或对接其他程序:此时脚本跳过 Markdown 表格渲染,用jq(Shell 版)对 JSON 做格式化后原样输出。

四、12 个内置命令全景

下面按功能分组列出全部内置命令及其参数。命令名即脚本第二参数,参数以--(Shell)/-(PowerShell)前缀传入。

1. 会话与 Token 查询

tokens-list—GET /tokens/list.json

无参数。返回当前用户的所有会话,字段包括tokenId、tokenType(1普通、5MCP、8API)、userAgent、lastSeen(会话最后刷新的 Unix 时间)、isCurrent(是否为当前会话)。

2. 账户管理

accounts-list—GET /accounts/list.json

无参数。返回当前用户全部账户(含子账户层级),字段:id、name、parentId(0表示一级账户)、category、type、icon、iconType、color(RRGGBB 十六进制)、currency、balance、comment、creditCardStatementDate、displayOrder、isAsset、isLiability、hidden、subAccounts。

其中两个关键枚举:

  • category(账户类别):1现金、2活期/支票账户、3信用卡、4虚拟账户、5债务账户、6应收账户、7投资账户、8储蓄账户、9定期存单;
  • type(账户类型):1单一账户、2多子账户。

accounts-add—POST /accounts/add.json(需要时区)

参数必填类型说明
name是string账户名称
category是integer账户类别(枚举同上)
type是integer账户类型(1/2)
icon是string图标 ID
iconType是integer图标类型,0系统图标、1用户自定义图标
color是string图标颜色 RRGGBB
currency是stringISO 4217 货币代码;父账户传---
balance否string初始余额,支持两位小数;负债账户传负数
balanceTime否integer余额对应的 Unix 时间,设置balance时必填
comment否string账户备注
creditCardStatementDate否integer信用卡账单日

3. 交易分类

transaction-categories-list—GET /transaction/categories/list.json

无参数。返回按类型组织的层级分类树:1: Income(收入)、2: Expense(支出)、3: Transfer(转账),每个分类含id、name、parentId(0为一级分类)、type、icon、iconType、color、comment、displayOrder、hidden、subCategories。列表接口允许传type过滤(类型枚举同上)。

transaction-categories-add—POST /transaction/categories/add.json

参数必填类型说明
name是string分类名称
type是integer分类类型(1收入 /2支出 /3转账)
icon是string图标 ID
iconType是integer图标类型(0系统 /1自定义)
color是stringRRGGBB 颜色
parentId否string父分类 ID,0表示一级分类
comment否string分类备注

4. 交易标签

transaction-tags-list—GET /transaction/tags/list.json

无参数。返回所有标签,字段:id、name、groupId(所属标签组)、displayOrder、hidden。

transaction-tags-add—POST /transaction/tags/add.json

参数必填类型说明
name是string标签名称
groupId否string标签组 ID,0表示默认组

5. 交易流水(查询)

transactions-list—GET /transactions/list.json(需要时区,分页)

参数必填类型说明
count是integer每页条数,最大 50
type否integer按交易类型过滤:1余额调整、2收入、3支出、4转账
category_ids否string按分类 ID 过滤,逗号分隔
account_ids否string按账户 ID 过滤,逗号分隔
tag_filter否string按标签过滤
amount_filter否string按金额过滤
keyword否string按关键词过滤
must_have_pictures否boolean是否只取带凭证图片的交易
max_time否integer最大时间序列 ID 游标,0表示最新
min_time否integer最小时间序列 ID 游标
page否integer指定页码
with_count否boolean是否返回总条数
with_pictures否boolean是否返回图片 ID
trim_account否boolean是否只返回账户 ID
trim_category否boolean是否只返回分类 ID
trim_tag否boolean是否只返回标签 ID

响应结构:items数组(每项含id、timeSequenceId、type、categoryId、category、time、utcOffset、sourceAccountId、sourceAccount、destinationAccountId、destinationAccount、sourceAmount、destinationAmount、hideAmount、tagIds、tags、pictures、comment、geoLocation、editable),外加nextTimeSequenceId(请求更早数据时作为下一次的max_time游标)与totalCount(开启with_count时返回)。

transactions-list-all—GET /transactions/list/all.json(需要时区,一次性返回全部匹配)

参数与transactions-list大致相同,但分页参数替换为时间区间:

参数必填类型说明
start_time否integer查询起始 Unix 时间
end_time否integer查询结束 Unix 时间

其余可选参数(type、category_ids、account_ids、tag_filter、amount_filter、keyword、must_have_pictures、with_pictures、trim_account、trim_category、trim_tag)语义与transactions-list一致。响应为交易对象数组(无分页元数据),适合一次性导出或全量分析。

6. 新增交易

transactions-add—POST /transactions/add.json(需要时区)

参数必填类型说明
type是integer交易类型:1余额调整、2收入、3支出、4转账
categoryId是string交易分类 ID,支持二级分类
time是integer交易 Unix 时间
utcOffset是integer交易时区偏移(分钟)
sourceAccountId是string来源账户 ID,支持无子账户的账户或子账户
sourceAmount是integer来源金额(两位小数整数表示,见下文"金额单位")
destinationAccountId否string转账目标账户 ID
destinationAmount否integer转账目标金额
hideAmount否boolean是否隐藏金额
tagIds否string标签 ID 列表,逗号分隔,如tagid1,tagid2
pictureIds否string凭证图片 ID 列表,逗号分隔,如picid1,picid2
comment否string交易备注
geoLocation否string地理位置,格式longitude,latitude,如116.33,39.93

典型调用示例(新增一笔支出,金额 12.34):

sh scripts/ebktools.sh --tz-name Asia/Shanghai transactions-add \ --type 3 \ --categoryId <分类ID> \ --time 1735689600 \ --utcOffset 480 \ --sourceAccountId <账户ID> \ --sourceAmount 1234 \ --comment "午餐"

7. 汇率与版本

exchangerates-latest—GET /exchange_rates/latest.json

无参数。返回最新汇率快照:dataSource(数据源名称)、referenceUrl(参考来源)、updateTime(更新时间 Unix 时间戳)、baseCurrency(基准货币)、exchangeRates数组(每项为currency货币代码与rate汇率,含义是"1 单位基准货币 = 多少单位该货币")。

server-version—GET /systems/version.json

无参数。返回version(服务端版本号)与commitHash(Git 提交哈希),可用于脚本自检服务连通性与版本兼容性。

五、参数类型、金额单位与校验规则

脚本会根据配置表中声明的ParamTypes对参数做本地校验,类型不合法会直接报错退出,而不是把错误请求发给服务器。共有五种参数类型:

类型校验规则典型参数
string任意字符串name、comment、currency
integer匹配^-?[0-9]+$(含负整数)type、count、time、utcOffset
boolean仅接受true/false/1/0hideAmount、with_count
string_array逗号分隔字符串,拆分为数组后放入请求体tagIds、pictureIds
geo_location匹配longitude,latitude格式geoLocation(POST 时被转换为{"latitude":…,"longitude":…}JSON 对象)

金额单位是一个必须注意的约定:API 中所有金额字段都以"整数 + 隐含两位小数"传输。例如1234表示12.34,-500表示-5.00。这一规则同时适用于账户余额(balance)与交易金额(sourceAmount/destinationAmount),文档与脚本注释中均有明确说明。

此外脚本还校验必填参数完整性:配置表中RequiredParams声明的参数若未传入,会提示Required parameter '--xxx' is missing并退出;--开头参数若缺少值也会报错。

六、响应输出:从 JSON 到 Markdown 表格

为了让人和 LLM 都能直观阅读结果,脚本默认按PrettyResponse配置将响应渲染为 Markdown 表格,共四种渲染策略(对应 ebktools.sh 的print_result分支):

策略适用响应说明
simple_array_to_markdown_table平铺数组直接按Columns列渲染,如tokens-list、transaction-tags-list
hierarchical_array_to_markdown_table含子节点的数组先按ChildKey(如subAccounts)把父子节点展平再渲染,如accounts-list
hierarchical_object_to_markdown_table按类型分组的对象先展平ChildKey(如subCategories)再渲染,如transaction-categories-list
nested_array_to_markdown_table嵌套在对象中的数组按DataPath(如.items、.exchangeRates)取出数组渲染,并在表格上方打印Metadata元信息(如Total Count、Next Time Sequence ID),如transactions-list、exchangerates-latest

当响应没有配置PrettyResponse(如server-version)、数据为空(输出No data to display)或指定了--raw-response时,则回退为格式化 JSON 输出。

七、故障排查指南

脚本在使用中最常见的几类问题及解决办法:

1. 环境变量未设置

错误信息形如Error: Environment variable 'EBKTOOL_SERVER_BASEURL' is not set.或Error: Environment variable 'EBKTOOL_TOKEN' is not set.。解决办法有两种:

  • 在系统中设置环境变量(export/$env:,见上文);

  • 在当前目录、父目录或用户主目录下创建.env文件并写入两个变量。脚本启动时会按"当前目录 → 父目录 → 主目录"的顺序查找并解析.env(Shell 版实现见 ebktools.sh 的load_env_from_paths),支持#注释、空行、键值对以及带引号的值:

    # ~/.env EBKTOOL_SERVER_BASEURL="http://localhost:8080" EBKTOOL_TOKEN="YOUR_TOKEN"

2. 必要依赖缺失(仅 Shell 版)

check_dependency会逐个检查grep sed awk date curl jq,缺失时输出Error: "curl" is required.并返回退出码 127。安装对应工具(如 Ubuntu 下apt install curl jq)即可。

3. 需要时区的命令缺少时区信息

若探测不到系统时区且未传--tz-name/--tz-offset,会提示Command 'transactions-list' requires timezone information.,按提示补传任一参数即可。

4. API 调用失败

  • curl 层失败:提示API call failed (curl exit code: N),通常是服务器地址不可达或网络问题;
  • 业务层失败:脚本解析响应中的success字段,若为false或缺失,则原样打印 JSON 响应,此时应重点检查 Token 是否有效/过期、请求参数是否合法。从源码看,所有/api/v1路由都经过JWTAuthorizationByHeader与APITokenIpLimit两个中间件(cmd/webserver.go),Token 通过Authorization: Bearer <token>请求头传递——如果你的服务器开启了 API Token IP 限制,还需保证脚本所在机器的出口 IP 在允许列表内。

八、源码级原理:脚本与后端的调用链

理解调用链有助于排查问题与二次开发。一次完整的ebktools调用实际发生以下步骤:

  1. URL 拼接:${EBKTOOL_SERVER_BASEURL}/api/v1/${Path}(ebktools.sh)。配置表中的Path均为相对路径(如transactions/add.json),前缀/api/v1由脚本统一补齐;
  2. 参数处理:GET 命令把参数 URL 编码后拼入查询字符串(key=value&...);POST 命令把参数按类型转换后序列化为 JSON 请求体(integer/boolean转成原生类型、string_array拆数组、geo_location转经纬度对象),并设置Content-Type: application/json;
  3. 请求头:统一携带Authorization: Bearer <token>;需要时区的命令额外携带X-Timezone-Name或X-Timezone-Offset;
  4. 后端路由:服务端在 cmd/webserver.go 中注册了GET /accounts/list.json、POST /accounts/add.json、GET /transactions/list.json、POST /transactions/add.json、GET /transaction/categories/list.json、GET /transaction/tags/list.json等路由,分别绑定到api.Accounts.AccountListHandler、api.Transactions.TransactionListHandler、api.TransactionCategories.CategoryListHandler等处理器(如 pkg/api/accounts.go 的AccountListHandler),与脚本配置表中的Path一一对应;
  5. 结果渲染:脚本读取响应的success字段判断业务成功与否,成功则取result按PrettyResponse渲染成 Markdown 表格。

从这些细节可以推断:ebktools 本质上是 ezBookkeeping/api/v1REST 接口的一个"配置驱动"型客户端——只要维护好命令配置表,就能稳定跟随服务端 API 演进,非常适合作为自托管记账的自动化入口(定时同步账单、AI 助手记账、批量导入等场景)。

延伸阅读:核心文档 SKILL.md、Shell 实现 ebktools.sh、PowerShell 实现 ebktools.ps1、服务端路由注册 cmd/webserver.go、API Token 生成逻辑 pkg/api/tokens.go、请求鉴权中间件 pkg/middlewares/authorization.go。

  • 后端
  • 前端
  • 金融科技

【免费下载链接】ezbookkeeping

ezBookkeeping is an open source, powerful, self-hosted personal finance app that is easy to use.

项目地址:https://gitcode.com/gh_mirrors/ez/ezbookkeeping
点击查看免费下载
上一篇:FanControl终极指南:Windows平台专业风扇控制与散热优化完整教程
下一篇:FanControl:3个方法让你的Windows电脑安静又凉爽

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 22:23:39

2026年薪酬设计服务商排名:哪些机构最值得企业信赖?

随着企业数字化转型的深入与人才竞争的白热化&#xff0c;薪酬设计已从单一的“发工资”工具&#xff0c;演变为关乎企业战略落地的核心管理杠杆。2026年&#xff0c;企业对薪酬设计服务的需求呈现出数据精准性、行业垂直度、解决方案定制化三大核心趋势。本文将基于技术实力、…

作者头像 李华
网站建设 2026/10/18 10:10:48

风光水火储多能系统调峰优化与Matlab实现

1. 项目背景与核心挑战风光水火储多能系统互补协调优化调度是当前能源电力领域的前沿研究方向。随着可再生能源占比的不断提高&#xff0c;电力系统面临着两个突出矛盾&#xff1a;一方面是风电、光伏的随机性和波动性导致的调峰压力&#xff0c;另一方面是传统火电机组调节灵活…

作者头像 李华
网站建设 2026/10/21 16:33:51

厂商内核与驱动定制实战:从源码结构到性能功耗调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/19 3:13:40

两个视频流网络,一个动作识别难题

2014年秋天&#xff0c;如果你去问计算机视觉领域的研究者一个问题&#xff1a;机器能看懂视频里发生了什么动作吗&#xff1f;大多数人会摇头。不是因为没人做&#xff0c;而是因为做的人都撞了南墙。当时最强的视频动作识别方法,不是什么深度神经网络,而是一套叫做密集轨迹的…

作者头像 李华