Mivansaka's Blog

<–– Back

使用 iOS 快捷指令完成自动记账

使用iOS 快捷指令完成自动记账

写在前面

1. 本方法当前仅适用于开通了短信提醒的银行卡账户

2. 根据不同银行的短信提醒模板,快捷指令会有些许变化

3. 本方法依赖于 iCost 的X-Callback-Url集成

因为一直想培养出一个良好的记账习惯来时常审视自己的开销,但是开始了很多次也失败了很多次,大部分是归因于自己的懈怠,沒有坚持几天便败下阵来。鉴于这种情况便在快捷指令的自动化里面设置了一项自动化:当收到短信包含“支出”时便自动打开记账 app。但是我总觉得这样还不够便捷还不够快,因为即使自动打开了记账的 app 我还需要手动输入数字-选择分类-选择账户才完成一次记账流程,想要找到一个能够在 iOS 上更快更无感的快速记账的方式。

直到看到了少数派上 iCost 开发者写的一篇拥抱AI,探索记账软件的未来和来自#UNTAG的 用快捷指令过滤快递短信 得到的灵感。其中在《拥抱AI,探索记账软件的未来》的文章中,我了解到了iCost有一项X-Callback-Url 的功能,只要让系统打开一段设定好的 url 链接即可自动记录,无须手动打开 app 填写参数。而在《用快捷指令过滤快递短信》这篇文章中我了解到在 iOS 上能够使用正则表达式来完成一些提取文字的功能。

翻看 iCost 的[帮助文档](%5BWiki%5D(https://ipqeasjip3.feishu.cn/wiki/wikcnKxNOSTNoP0mjuECjHRyZVh),直接定位到我所需要的 X-Callback-Url 功能说明:

添加收支

支出: iCost://expense?[action parameters]

收入:iCost://income?[action parameters]

同时也给出了所有的控制输入的参数列表和示意如下图:

作者给出的参数说明

但是鉴于我薄弱的编程知识并不知道这些控制参数在实际的 url 中需要怎么来使用,还好下面也给出了一个使用范例:

支出例子 : iCost://expense?amount=3000&currency=CNY&account=微信账户 &category= 宝宝玩具&book:宝宝账本&date2021.01.01&time=12:00&claim=1&remark= 玩具车

把这些参数当成变量就很好理解了,确定了一下我一般所需要记账的变量有:amount (金额)、account(账户)、category(分类)、date(日期)、time(时间)这五个品类,一个我需要的模板就出来了:

iCost://expense?amount=填进总额&currency=CNY&account=填进我发来短信的那个银行 &category= 填进我的分类&date=填进当前日期&time=填进当前时间

知道了自己需要输入什么东西,那接下来就有了一个大致的思路了:

编写的大致流程

先解决最大的问题:提取支出的金额,前文说过我对编程一窍不通,现学正则表达式肯定是来不及了,现在流行遇事不决问 ChatGPT 于是我直接去让AI朋友给我答案。

请写一个正则表达式能够提取出这段话中的支出数额:您尾号87xx卡6月25日13:25快捷支付支出(消费支付宝-中国联合网络通信有限公司浙江)50元,余额xxx.xx元。【工商银行】

可以使用以下正则表达式提取出支出数额:

支出\((.*?)元

在这个正则表达式中,我们使用了两个限定符:

  • \( ... \):用于匹配括号内的内容,这里表示匹配支出数额的括号部分。
  • .*?:用于匹配任意字符,?表示非贪婪匹配,即匹配到第一个满足条件的结果。

既然已经有了能提取出这个数额的正则表达式,直接在快捷指令中使用匹配即可获得所需要的数额,赋予一个变量名。

快捷指令的提取

因为我主要用于付款的卡只有一张工商银行的卡, account 默认就填入工商银行就好。接下来要解决的是分类的问题,在 《拥抱AI,探索记账软件的未来》的文章中使用了OpenAI来进行分类的识别,但是在一些小商小贩进行扫码消费的时候支出人往往只有人名,也不知道是消费在了什么地方,因此我还是使用手动选择的方式,在快捷指令中列出一个 List 进行选择:

快捷指令的列表

这些就大致能够囊括我平时的消费分类,如果有需要可以再列出子表进行更细致的分类。

之后获取日期和时间,则使用快捷指令中自带的获取功能,需要注意的是因为在 url 的控制中 date 和 time 是两个不同的变量,因此快捷指令中的Current Time 要执行两次分别赋予 date 和 time 两个变量。

既然我们已经有了所有的控制一次记账所需要的变量参数,直接在快捷指令中使用替换功能替换掉模板中的参数再自动执行即可:

快捷指令的替换与 url 的执行

再在自动化中设置一下收到短信既触发即可:

自动化的短信触发

以下是实现的效果:

实现的效果

到此为止,就完成了一个自动化(Almost)的记账流程,由于iOS系统的限制,收到短信触发的时候要再点一次确认才能执行快捷指令(在我升级了 iOS 17 beta 的版本以后发现短信自动触发已无须二次确认,但是经过实验选择立即执行后似乎还有 bug,希望 Apple 的工程师们能再给力一点)。

希望我的一点点小小实验能够对你的自动化生活有所帮助,我的快捷方式的链接放在下方:

快捷指令