天天学习,好好向上!

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

导出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即可解密打开。
  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"就可以了。

添加新评论