前言
? 欢迎来到这篇一步一步指导如何在Mac上导出微信聊天记录,并且进行一些简单有趣数据分析的文章。
在今天快节奏的世界中,我们严重依赖微信与朋友和家人交流。随着我们积累的信息越来越多,这数年的聊天记录不仅让内存吃不消,而且很难进行查询和维护,关键我们还不能删掉这些承载着信息和回忆的聊天记录。因此了解如何导出、存储、备份和查询微信聊天记录非常重要,这样我们就可以在任何时间进行高效查询,还可以在电脑上好好收藏和品味了。
以笔者为例,最近1年多的聊天记录加起来已经达到快达到200G内存了…
既然如此重要,为何腾讯却没有提供好用的聊天记录工具呢?哦?,可能是因为就算不提供你也离不开微信了吧?但我们今天的目的不是吐槽微信,既然改变不了腾讯,那就改变我们自己手中的工具吧。在本文中,我将向大家展示如何轻松完成这一操作!??
聊天记录位置
首先需要找到微信聊天记录的位置。mac上微信的聊天记录都以数据库的形式保存在下面目录:
~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\ Support/com.tencent.xinWeChat/xxx/yyy/Message/*.db
以笔者为例,笔者的微信聊天记录在以下路径目录下。这里需要注意的是,如果电脑登录过多个微信账号,在2.0b4.0.9
文件夹下,可能存在多个文件夹,需要逐个查看哪个是你要导出聊天记录的账号。可以根据修改日期进行排序,一般就是那个最近修改过的文件夹。也可以根据文件大小进行判断,一般占用内存大的文件夹就是我们要找的文件。
/Users/fubo/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\Support/com.tencent.xinWeChat/2.0b4.0.9/dab84473f92fbffd228fa0846b7a84fd/Message
所有的微信聊天记录就保存在这个Message
目录下的db数据库文件,我们只需要拿到这个目录下的所有形如msg_0.db
的数据库文件即可。
但是这些数据库文件都是经过加密的,所以我们要想办法拿到数据库的密码。
破解数据库
- 打开mac上的微信,但是不要登录!
-
打开终端,输入
sudo lldb -p $(pgrep WeChat)
这时候可能会报错:
error: attach failed: cannot attach to process due to System Integrity
问题不大,解决方案如下:
(1)重新启动mac电脑
(2)电脑黑屏后一直按住
Command+R
,直到出现恢复模式界面(3)点击顶部菜单,然后打开终端
(4)在终端中输入
csrutil disable
,以关闭系统完整性保护(SIP)(5)在终端中输入
reboot
,然后等待重启(6)电脑重启后,重新在终端中执行
sudo lldb -p $(pgrep WeChat)
命令即可。 -
进入lldb的子shell后,输入以下命令并回车
br set -n sqlite3_key
- 继续在终端中输入
c
,并回车 -
这时候会弹出微信登录界面,登录即可(需要注意的是,这时候手机会提示微信已经在Mac中登录,但Mac上的微信可能会卡住,进不去微信,这里不用不用理会,继续下面的操作)
-
继续在lldb的子shell中输入以下命令
memory read --size 1 --format x --count 32 $rsi
这时终端中会输出类似如下信息:
0x600000a29720: 0x89 0x79 0xea 0x77 0xc3 0x26 0x47 0x7f 0x600000a29728: 0x9b 0x62 0x51 0xe6 0xd6 0x95 0x27 0xac 0x600000a29730: 0x91 0x59 0x47 0x20 0xae 0xbc 0x43 0x7f 0x600000a29738: 0xbf 0x39 0xdb 0x28 0x27 0xce 0x67 0x3e
- 接着用python脚本来处理这串编码,将上面的输出信息复制到脚本中的
source
变量中:source = """ 0x600000a29720: 0x89 0x79 0xea 0x77 0xc3 0x26 0x47 0x7f 0x600000a29728: 0x9b 0x62 0x51 0xe6 0xd6 0x95 0x27 0xac 0x600000a29730: 0x91 0x59 0x47 0x20 0xae 0xbc 0x43 0x7f 0x600000a29738: 0xbf 0x39 0xdb 0x28 0x27 0xce 0x67 0x3f """ key = '0x' + ''.join(i.partition(':')[2].replace('0x', '').replace(' ', '') for i in source.split('\n')[1:5]) print(key)
运行此python脚本,此时的输出就是你微信聊天记录数据库的密码
raw_key
,将其复制保存下来,后面需要多次用到(以后进行解密也可以继续使用) -
下载一个可以打开db数据库的软件
DB Browser for SQLite
,下载地址如下:https://sqlitebrowser.org/dl/
- 安装并打开软件 → 打开数据库 → 选择前面提到的形如
msg_0.db
的数据库文件 → 这时候会弹出输入密码的窗口,选择raw key
和SQLCipher 3 defaults
选项 → 输入获取到的数据库密码 → 这时候可以看到db文件被正常打开了
导出聊天记录
打开数据库后,可以看到这个msg_0.db
数据库有373张表格,每张表格就是和一个人的单聊记录或者一个群组的聊天记录。
可以在软件中选择文件菜单栏 → 选择导出 → 选择表到json → 在弹出的窗口中用command+A
全选所有的表格 → 这样就可以将这个数据库的所有的聊天记录导出为json文件了
同理,再打开msg_1.db
、msg_2.db
等数据库,全部导出到同一个文件夹下,这样就将已有的微信聊天记录都保存下来了。笔者都保存到了msg_all
文件夹下,有3000多个表格的聊天记录,共占用了4.56G内存。
接着可以用任意IDE打开这个文件夹,笔者这里使用的是VScode,随便打开一个json文件,可以看到如下字典格式的聊天记录:
笔者简单分析了其中各个字段的参数含义
"CompressContent": null, # 转账金额信息,有+与-表示:收到与转出,默认为空
"ConBlob": "chN3eGlkX2dnNWpibzcyZGkyaTEyehN3eGlkX3BlMXMzenh6OThsajIykgF05paw5qKF5Zut57Sg6aOffumhv+m4vyA6IOaLm+eUn+S/oeaBrwrmrKLov47ovazlj5HvvIzlip/lvrfml6Dph4/vvIEK5pS26I635Y6o6Im677yM5pm65oWn5Lq655Sf77yBCiAg44CK5rOo5oSPIDouLi6AAQCYAQCgAQC4AQDIAQDQAQDwAQD4AQA=", #
"IntRes1": 0,
"IntRes2": 0,
"StrRes1": null,
"StrRes2": null,
"mesDes": 1, # 是否为自己发送的消息
"mesLocalID": 2,
"mesSvrID": 1920754171758050414, # 服务端的消息ID
"messageType": 1, # 消息类型,1为文本,3为图片,34为语音,37为好友添加,43为视频,48为位置,49为xml格式消息,10000为系统消息
"msgContent": "招生信息\n欢迎转发,功德无量!", # 消息内容
"msgCreateTime": 1626161450, # 创建时间(Unix时间戳)
"msgImgStatus": 1, # 图片的状态
"msgSeq": 711260330,
"msgSource": "",
"msgStatus": 4, # 消息状态,比如发送失败,成功,正在发送
"msgVoiceText": null
其中各个XML信息的含义可以参考这篇文章:导出微信iOS数据库,以及这个项目:iWeChat 从 0 开始解刨一个 App,以微信为例 ,对学习微信逆向破解很有帮助,这不是本文的重点,此处就不再展开了。
绘制词云图
有了聊天记录文件之后,就可以做一些简单的数据分析了。首先根据你想导出的人的聊天记录中的某条语句,全局搜索它在哪个文件中,笔者这里以某个建站交流群为例:
找到此群的文件后,写一个python脚本将json文件里面的消息内容提取出来(也就"msgContent"
这个字段),并且保存到txt文件中:
import json
fin = open("/Users/fubo/code/WeChatHistroy/msg_all/Chat_52078554724fa4c768858b4209e4c3b8.json", "r")
fout = open("/Users/fubo/code/WeChatHistroy/loyseo.txt", "w")
results = json.load(fin)
for dic in results:
if dic["messageType"] == 1:
content = dic["msgContent"]
if dic["mesDes"] == 1:
msg = content.strip().replace("\n", " ").replace("\r", " ")
else:
msg = content.strip().replace("\n", " ").replace("\r", " ")
fout.write("{}\n".format(msg))
运行此脚本后,可以看到这个群的所有文本信息都被保存到loyseo.txt
这个文件中了:
接着可以使用python来绘制词云图,或者使用这个无需编程的在线词云图工具:微词云(笔者也有这个平台的全部权限,如果需要的话,可以微信联系笔者,免费借用)。很快就可以统计出这个群聊的高频词以及词云图,以供后续做一些简单的分析。
当然,如果是小情侣,你也可以给你的对象搞一个小纪念??
数据库全局查询
词云图的只是额外弄的一个小玩具,笔者对于微信聊天记录最大的需求除了备份外,就是希望聊天记录可以像Mysql数据库一样,通过语句进行定制化的查询,比如查询某一天自己发送的全部信息。这个功能在微信上是无法实现的,但我们现在有了json格式的数据库,用一些简单的python脚本就可以实现这个需求了。
前文已经分析过了,"msgCreateTime"
这个字段就是信息的创建时间,但是这里使用的是Unix时间戳的格式,为了便于查询,我们可以循环遍历每个json文件,将每条消息中的”msgCreateTime”字段转化为真实时间,并且插入到json文件中。比如以下例子就是Unix时间转化后的结果:
"msgCreateTime": 1626161450,
"realTime": 2021-07-13 15:30:50,
笔者写了一个脚本,运行就可以将msg_all
文件下的所有json文件都转化完成。(这里记得增加utf-8的编码参数,不然文件中的中文字符可能会乱码)
import os
import json
import datetime
dir_path = '/Users/fubo/code/WeChatHistroy/msg_all'
for filename in os.listdir(dir_path):
if filename.endswith('.json'):
file_path = os.path.join(dir_path, filename)
try:
with open(file_path, encoding='utf-8') as f:
data = json.load(f)
for item in data:
time_stamp = item['msgCreateTime']
real_time = datetime.datetime.fromtimestamp(
time_stamp).strftime('%Y-%m-%d %H:%M:%S')
item['realTime'] = real_time
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False)
except:
pass
print("success")
由于json在读写的过程中不会自动进行「代码格式化」,这样不利于后续的阅读,如果使用的是VScode这个编译器,可以安装Format Files
这款VScode插件,选中文件夹,右键选择Start Format Files: This Folder
即可一键将多个文件进行代码格式化。
可以看到,经过转化且格式化后,已经成功将时间戳转化为真实时间了
接着就可以通过VScode的在文件夹中查找
这个功能搜索某一天的全部微信消息了。比如,笔者想知道2023-01-20这天的所有微信信息:
如果需要更多的筛选项,只需要通过编写脚本或者正则表达式进行查询即可,非常灵活。
结语
拥有这些知识,就可以轻松又安全地存储聊天记录,并在需要时随时进行查询。当然,除了笔者以上介绍的用途,还可以用导出的文本数据干很多事,比如通过深度学习训练一个聊天机器人,后续笔者也会写一些关于文本分析的文章进行分享,感谢支持~
其实,笔者需要这个全局查询微信聊天记录的功能是为了帮助笔者回答一个问题「一个月一晃就过去了,我这个月到底在干嘛?」。因为一些原因,笔者对于时间的概念很混乱,脑子一直转动不停也梳理不清,每天都感觉很多事情要做,可回过头来却发现自己好像也没做啥事,一日复一日,一周过去了,一个月又过去了,一年也过去了,可自己好像对于时间仍无太多的掌控感,对路在何方也仍然迷茫。从冥想中得到启发,笔者想通过坚持回顾整理和分析复盘自己的时间去哪里了,帮助自己对分心更有警觉性,也能更专注于重要的事情。
笔者2022年初开始记录自己每天在做什么(如下图,用的是腾讯在线文档),虽然睡前几句话记录一下很简单,但要坚持每天记录还是有点困难,中间也一直断断续续…
这不,2023年1月份的前半个月又是没坚持记录,中断了半个月,每天团团转忽略了记录与思考…这两天要补起来??
所以这两天想通过微信聊天记录
和Chrome活动记录
这两个每天都在使用的工具回忆一下新年的第1个月「我到底在做什么」,坚持每月做总结和复盘。有了需求后,就要进行解决,顺便写了这篇博客记录一下解决问题的过程,希望这篇文章可以帮助大家了解如何在Mac上导出、备份和查询微信聊天记录,也希望大家少一些对时间的焦虑感??
你好,我在您获得密钥这一步都完全一样,获得了0x…的密钥,但是将我的密钥输入进去之后,选择的是原始密码,和SQL3,但是这个输入密码界面一直弹出,没有正常进入db文件
我和你一样
你好,按照操作报错了,请问怎么解决?
(lldb) memory read –size 1 –format x –count 32 rsi
error: invalid start address expression.
error: address expression “rsi” evaluation failed
博主你好,br set -n sqlite3_key 这个命令之后,断点设置成功了
Breakpoint 1: where = libsqlite3.dylib`sqlite3_key, address = 0x0000000190b6352c
但是整个过程中没有触发断点,执行
memory read –size 1 –format x –count 32 $rsi
就会变成
error: Process is running. Use ‘process interrupt’ to pause execution.
请问这个方法失效了吗
你好m2 应该换成那个命令同问
终于在全网看到了跟我有同样问题的人!我也是这样子,断点只打到了一个地方,我看到其他示例都是在两处打断点的,所以没有触发。我是Intel的,请问你解决了吗
如果可以的话,请问可以交流一下嘛,我最近也在看Intel芯片的mac的怎么导出聊天记录,好像除了这个之外就没有别的办法了。我的邮箱:2039129107@qq.com
微信改了 这个方法已经失效了 或者只能把微信版本降级
n