年底了,弄个图片版个人和群聊的微信年度报告

微信年度报告图片版

之前在网上看到能将微信的聊天导出,我就想可以生成一下年度报告,图片版本的,发给群友或者好友乐呵乐呵,但是电脑版的微信聊天记录根本不全,通过聊天迁移的也没有,特别是我这种两个电脑以上办公的,还是手机端的全

代码地址:https://github.com/799034552/wechat_year_report

先展示结果

在这里插入图片描述
在这里插入图片描述

详细代码和生成步骤可以移步github:https://github.com/799034552/wechat_year_report

过程

微信电脑版记录不全,但是手机端安卓没有root权限的话根本拿不到微信的文件,好在部分手机提供了备份功能,能将应用程序的文件通过备份功能导出(比如小米,华为好像能通过华为手机助手导出,苹果好像也能通过itunes导出),这样就能在电脑处理了

网上有的我就不再多赘述,我讲讲网上讲的少的:

解密数据库

微信的数据库使用的是sqlite,但是是使用sqlcipher加密的,密码是1234567890ABCDEF+每个人的uid,但是在window上编译sqlcipher可能有些麻烦,使用https://github.com/CovenantEyes/sqlcipher-windows的release中编译好的sqlcipher就行了,解密完成后,主要是得到EnMicroMsg.db数据集,这个数据集中包含了大多数的信息。

主要用到的各个表

  • rcontact主要记录每个人的备注和真实微信名
  • message中包含了所有的聊天记录
  • chatroom中包含了所有群聊的消息,其中roomdata中是群聊成员详情
  • EmjoiInfo中包含了所有表情包的下载链接

message中各个type对应的类型

● 1: 普通文字消息
● 3: 普通图片
● 34: 语音消息
● 35:qq邮箱
● 42:名片
● 43: 普通视频
● 47: 表情包
● 48: 定位消息
● 49: 公众号或小程序分享
● 50: 微信通话,通过解码lvbuffer中的信息来判断时间
● 64: 群语音通话,判断content是否有发起/结束,通话和结束都有,通过时间差来判断时间
● 10000: 撤回消息和系统消息(判断content内是否为撤回)
● 1048625: 图片
● 268445456:撤回
● 285212721:公众号推送
● 318767153:消息提示,如京东消费,店内小程序支付成功
● 486539313: 转发公众号内的视频
● 570425393:加入群聊提示
● 419430449:微信转账,通过paysubtype查看是发起还是接收,paysubtype=3是接收
● 436207665: 微信红包和群收款
● 805306417:接龙
● 822083633: 引用回复消息(是文字内容,包含在中)
● 922746929:拍一拍
● 1090519089:文件
● -1879048186:位置共享

拍一拍解密

拍一拍的规则很诡异,他的格式并不固定,而且有可能使用群昵称与群备注,而且会出现“我”这样的称呼,导致判断很麻烦,最后还是用两条正则搞定的

'<template>(?!.*<template>.*)<\!\[CDATA\[(?P<pat_from>我|"\$\{(?P<pat_from_wxid>.*?)\})(\$\{fromusername@textstatusicon\})?"?\s?拍了拍\s?(?P<pat_to>"(?P<pat_to_name_or_wxid>.*?)\$\{pattedusername@textstatusicon\}|我|自己).*?</template>'

这条正则能匹配大部分的情况,但是有可能被拍者没有${pattedusername@textstatusicon},导致用这个匹配不到,如果后面加入?可以匹配但是昵称无法进入正确的匹配组,所以补充了下面这条正则

'<template>(?!.*<template>.*)<\!\[CDATA\[(?P<pat_from>我|"\$\{(?P<pat_from_wxid>.*?)\})(\$\{fromusername@textstatusicon\})?"?\s?拍了拍\s?(?P<pat_to>"(?P<pat_to_name_or_wxid>.*?")|我|自己).*?</template>'

这样就能正确拿到对应的拍人者与被拍人者了

群昵称解密

根据这个,群昵称在chatroom 表中的的roomdata字段,而且是一个Protocol Buffers的二进制文本,就是存储了key-value而已,了解到这个东西还要编译,直接用这个里的文件就好了

性别解密

网上找了一圈没找到与性别有关的,但是自己看数据库发现,性别应该是rcontact表中的lvbuff字段中二进制的第9位,0表示无性别、1表示男生、2表示女生

视频/语音通话时长

通过lvbuffer中utf-8解码就能得到,只需要一点正则表达式

画图

下辈子,我一定不用PIL进行画图,是真的坑,不如qt的

  • 没有对齐选项,自己通过getsize函数手撸了一个左右居中对齐,还有垂直对齐
  • 没有超过长度换行选项,自己手撸了一个,而且多行文本居中是有点麻烦,而且有一个bug,就是有可能多个unicode编码构成的emoji的话可能被打断,这个bug我无法处理,除非正确识别出多个unicode编码构成的emoji
  • 插入图片要自己放大图片在大图上画从而抗锯齿
  • 不支持emoji渲染,只能通过pilmoji去支持
  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值