天天学习,好好向上!

标签 我的支出 下的文章

导出 MIUI13 智能助理我的支出账单数据

前言

本人最近倒腾手机时,发现了钱迹这款记账软件,还有自动记账插件。看到可以导入其他软件的账单数据,就回想起来 2018 年还是 MIUI9 的时候,小米智能助理 app 推出的我的支出自动记账功能,很有意思,看看每个月的钱都花哪去了,从 2020 年 5 月份开始,小米下线了我的支出记账功能,时间长了也慢慢把这个功能忘记了。但是今天想起来了!那么我之前的账单数据还在吗?可以导出吗?带着这个问题,本人搜索了下网上,官方回帖称,数据不会删除,还可以在智能助理 app 设置里查看 (5.4.3 版的里没找到),但是记账功能已经没了。那么我怎么把账单数据导出来呢?

研究一下

研究了下智能助理的数据目录,发现有个 payment.db 文件比较像是记账的数据,但是用手机上的 sqlite 查看软件打不开,用 16 进制编辑软件打开,发现是乱码。估计是加密了,怎么解密呢?上网搜了下,并没有啥文章介绍这个。没办法,只有自己研究了,废了点力气,在我刚装好的 Debain sid 上,尝试反编译了智能助理 app 的 apk 文件,用到了 dex2jarjadx-gui两个项目工具,简单来说就是直接把 apk 文件 dex2jar 成了 jar 文件,然后用 jadx-gui 打开就能看见源码了,通过搜索关键字,找到了数据库加密的部分代码,和用于加密的密钥字符串名称 "payment_keychain",可以看出来这个字符串是根据机器 id 运算生成的,并不是写死的。然后在 app 的数据目录里,找到 "payment_preferences.xml" 文件,里面居然明文记载了这个密钥字符串。有了密码,加密方法呢?通过代码中提到的 sqlcipher 字样,我找到了相关的解密程序 sqlitebrowser,在 linux 平台上,要启用 sqlcipher 支持,必须自己编译,在 windows 和 macos 上有现成的下载。最后解密成功导出了数据。废话不多说,干货步骤在下面:

操作步骤

前提条件:

  • 智能助理 app 没有被清除过数据,继承了老版本的数据;
  • 手机已 root,可以访问 /data 目录(虽然不 root 可以通过手机自带备份导出数据,但是_tmp_bak 文件怎么解密还没研究出来,只能先以 root 为主);
  1. 使用 MT 管理器之类的 app 访问 /data/data/com.miui.personalassistant 目录,从 databases 目录拷贝出来 "payment.db" 文件, 并从 shared_prefs 目录拷贝出 "payment_preferences.xml" 文件到 /sdcard 等可随意访问的目录下;
  2. 通过数据线或者 ftp 远程管理方式将 "payment.db" 和 "payment_preferences.xml" 文件拷贝到计算机上;
  3. 下载 安装 sqlitebrowser 到计算机上,然后通过开始菜单快捷方式打开 "DB Browser (SQLCipher)";
  4. 点击工具栏上的 "打开数据库(O)",选择 "payment.db" 文件。
  5. 在弹出的 "SQlCipher 加密" 窗口中,加密设置选择 "SQLCipher 3 默认",用记事本打开 "payment_preferences.xml", <string name="payment_keychain"></string> 中间的那个字符串就是数据库的加密密码,复制出来,粘贴到密码文本框中,最后点击 OK 即可解密打开。
    2022-08-10 22-56-13 创建的截图.png
  6. 进入浏览数据选项卡,表选择 "transactions" 即可列出所有的账单数据了。这里需要注意的是,所有的时间标签都是用 java 毫秒表示的,为了容易看懂,也为了后期方便导入数据到其他记账软件,这里我们鼠标邮件点击时间的标题栏,如 "tannsaction_time",选择 "编辑显示格式",然后选择 "Java 时间戳(毫秒)到日期",然后将下方的 strftime('%Y-%m-%d %H:%M:%S.', "transaction_time"/1000, 'unixepoch') || ("transaction_time"%1000) 修改为 strftime('%Y-%m-%d %H:%M:%S.', "transaction_time"/1000, 'unixepoch', 'localtime') || ("transaction_time"%1000) 点击确定即可显示正确的时间(不加 localtime 参数,时间会显示为 UTC 时间比北京时间早 8 个小时)。然后依次将所有的时间列都如此修改。
  7. 点击上方工具栏中的 "按当前显示的样子保存表" 按钮(在刚才选择表下拉菜单的右侧),选择 "导出到 CSV",换行符选择 "Windrows 回车 + 换行" 然后确定即可。至此,MIUI13 智能助理我的支出账单数据就全部导出成功了。后续我们可以根据不同的账单软件导入模板修改相关的样子进行导入。

后记

导出的 csv 文件采用了 UTF- 8 编码,直接用 excel 打开,中文会乱码,要避免这个问题,可以用记事本先打开这个 csv 文件,然后保存时选择编码为 "ANSI" 就可以了。