黄石的时空回环

黄石的时空回环

Let me fly to the 🌕️

从通知实现钱迹 Tasker 自动化记账

2020-12-03

信息

本文首发于少数派,博客仅作同步。

继上次通过 Tasker 和通知实现机器人之后,决定利用 Tasker 做一些更有效率的事情、解决实际使用手机中的一些痛点。

流程图

流程图

思来想去,我有一个经常重复的操作是每次支付完都会使用钱迹进行记账,具体步骤无非是「回到桌面 > 打开钱迹 / 钱迹微件 > 输入金额 > 选择分类 > 记账完成」。

可是我观察到几乎每次支付之后,支付宝或其他 App 都会生成一个支付成功或者订单生成的通知。那么利用这个通知事件,自动打开钱迹或者其他记账应用来记账是一个很直接和容易实现的想法。另外钱迹刚好实现了 Deeplink(深度链接)的接口 12,能够比较方便地进行自动化记账的操作。

这里把通知分为两类,其中类似支付宝比较良心地在通知文本里面提供了金额,这样我们就可以把通过正则匹配出来,直接通过钱迹的接口,一般来说只需要选择分类再点击就可以记账了;如果没有提供金额的,那么就直接打开记账页面进行手动记账。

另外本文不会像上次一样需要较多的插件和第三方应用来实现效果。

通知触发 Intent

首先我们从简单的开始,我们希望某个通知产生的时候,能够自动打开钱迹「记账」页面,从而减少打开某个应用内界面的操作。这里一是通知事件作为触发,二是发送 Intent 来打开指定页面的操作。

任务触发

任务触发

复习通知事件

如果之前接触过 Tasker 并且阅读了上一篇利用通知自动回复微信的文章,应该对 Tasker 的通知事件比较熟悉了。这里我们稍微复习一下通知事件在 Tasker 里的事件参数(Event Context)。

  • %evtprm1 为发送通知的应用
  • %evtprm2 为通知的标题
  • %evtprm3 为通知的内容文本

当然在第一个例子里面不需要这么复杂,Tasker 自带的通知事件可以针对应用和标题进行过滤,这里已经足够我们使用了。

比如这里我们完整匹配了来自饿了么的标题为「您的订单已接单」的通知。关于 Tasker 的模式匹配,可以参考官方文档 3。可以简单提一下如果没有特殊符号表示完全匹配,*text* 会匹配任意带 text 的文本,/ 表示或,应该能满足大部分的简单的使用场景了。

发送 Intent

设置好触发条件之后,那么就可以执行打开页面的操作。这里使用「发送意图」的动作。

  • 包名:钱迹的包名为 com.mutangtech.qianji
  • 类:记账页面的 Activity 名为 com.mutangtech.qianji.bill.add.AddBillActivity

这里有聪明的小伙伴就会想知道这两个东西怎么得到的。包名比较好找,Activity 名只需要打开相应的页面,手机连接电脑之后执行下面的命令,就可以得到最新打开的 Activity 名称是什么,当然也可以从中知道包名是什么。

1
adb shell dumpsys activity recents | find "Recent #0"

试试把 | 的命令去掉,终端会把最近的 Activty 栈全打印出来。掌握了这个命令,就可以通过 Tasker 启动几乎任何你想要的页面,也不用采用其他插件。当然如果你想用 IntentTask 这类 Tasker 插件来简化这部分操作,也是可以的,它们只是帮你完成了这一步。

接下来我们再稍微加深一点难度,毕竟上面的内容只是帮你节省了打开页面操作的时间,还需要手动输入金额,而输金额很麻烦。当通知里面带有金额的时候,要完成自动记账也不是难事。正好钱迹提供了 Deeplink 供自动化记账使用。

根据官方文档,Deeplink 可以描述如下:

提示

深层链接是指将用户直接转到应用中的特定内容的网址。在 Android 中,您可以通过添加 intent 过滤器以及从传入的 intent 提取数据来设置深层链接,以便将用户吸引到正确的 Activity。

在平时使用过程中,其实我们接触还挺多的,最常见的是「在 App 中打开」之类的按钮,或者各种从一个应用跳转到另一个应用某页面的按钮。简单来说,Deeplink 的 URL 里面带有页面所需要的参数,可以被应用正确处理打开页面的同时传一定的信息进去。

钱迹接口

钱迹的接口文档写得比较完善了,大家可以直接看 [1]。简单提一下,就是需要拼出一个这样的 URL,然后进行访问就能直接执行钱迹提供的功能:

  • 固定前缀为 qianji://publicapi/addbill?
  • 必须参数账单类型 type,比如 &type=0 表示支出;账单金额 money
  • 其他非必须参数比如 catechoose,等于 1 表示弹出选择分类面板

操作逻辑

如图实现这样的逻辑:

  • %BALANCE 变量匹配出通知文本 %evtprm3 中的数字,这里抄了一个金额的正则表达式([0-9]+|[0-9]{1,3}(,[0-9]{3})\*)(.[0-9]{1,2})?,网上有很多,大家自己取舍。
  • 如果匹配到了,即 If %BALANCE1 Set,则通过构建 URL 来传入金额打开钱迹的分类选择面板,URL 为 qianji://publicapi/addbill?&type=0&catechoose=1&money=%BALANCE1
  • 如果没有匹配到,则打开记账的 Activity,正如前面所述一样发送意图。
操作逻辑

操作逻辑

效果展示

因为每次支付的时候都忘记录屏,这里用 Pushbullet 测试了两类文本的通知,效果如动图所示。

高级玩法

用通知触发记账其实非常直观,也很有效,但是有两个缺点:

不少通知里面没有金额,甚至不产生通知(比如淘宝支付之后),那么方法就不起效果了 钱迹提供的很多丰富的参数没有利用,比如备注,分类也需要自己选择 关于无通知触发的问题,可以使用 Log Entry 来解决。Log Entry 是去年末 Tasker 更新推出的被称为 Game Changer 的功能,即可以监听 Logcat 来实现触发。具体可见 官方示例,需要使用 ADB 或 Root 授权。


  1. http://docs.qianjiapp.com/plugin/auto_Tasker.html ↩︎

  2. https://developer.android.com/training/app-links ↩︎

  3. https://tasker.joaoapps.com/userguide/en/matching.html ↩︎

# 本文一共被访问了  次。