简介

Kevin2li大约 6 分钟

简介

众所周知,微信是目前大多数人最常使用的聊天软件了,随着时间的推移,你的手机上也会积累大量的聊天记录,那么你有没有兴趣去深入挖掘分析一下你的聊天记录,获取到一些有意思的发现呢?比如你每天发送了多少条微信,你最亲密的聊天对象是谁,你每天花了多长时间聊天?......本期教程就教大家如何将微信聊天记录数据导出并进行简单的数据分析,带你探索一个你不知道的世界。

教程

1. 手机聊天记录迁移

思路: 微信的聊天数据是存放在本地的,但是需要root权限才能访问,目前的安卓手机想要获取root权限比较困难也不安全,因此我们选择先将聊天记录迁移到安卓模拟器(雷电、夜神等)中的微信中,拿到root权限后,获取到聊天数据库文件。

下面以雷电模拟器为例介绍具体流程:

  1. 雷电模拟器官网open in new window下载安装最新版模拟器
image.png
image.png
  1. 在模拟器中下载安装微信
image.png
image.png

安装完成后,启动并登录微信,选择“同时在手机和平板上使用”,首次登录需要等待数据加载完成。

  1. 软件设置中打开root权限

打开软件设置

image.png
image.png

开启root权限

image.png
image.png

保存设置后,重启模拟器。

  1. 迁移聊天记录

将手机和电脑都连接到同一wifi网络上,然后手机端选择迁移聊天记录,模拟器微信扫码进行迁移。

  • 手机端设置
    步骤:打开微信>“我”>“设置”>“聊天”>“聊天记录迁移与备份”>“迁移”>“迁移到手机/平板微信”>“选择需要迁移的聊天”

此时手机上应该会出现一个二维码供其他设备扫描。

image.png
image.png
  • 模拟器端设置
    打开微信扫一扫,此时模拟器会提示使用“实时截取屏幕”或“开启摄像头”。
image.png
image.png

a. (选择1) 如果条件允许的话,可以选择“开启摄像头”,然后将手机上的二维码对准扫描,扫描成功后就会开始聊天记录迁移。

b. (选择2) 否则,可以把手机上的二维码截图传到电脑上,然后选择“实时截取屏幕”来扫描二维码。

如图,稍等片刻,聊天记录便可迁移完成。 image.png

2. 聊天记录数据库导出

由于雷电模拟器的文件管理我用的时候存在些问题,为了方便操作,我们再安装一个终端软件Termux。 下载地址为:https://github.com/termux/termux-app/releasesopen in new window

image.png
image.png

下载完成后将其拖入模拟器即可自动安装。

先去文件管理器中的/data/data/com.tencent.mm/MicroMsg目录下找到自己聊天记录数据库文件EnMicroMsg.db ,并记录下其路径,如我这里是/data/data/com.tencent.mm/MicroMsg/8fd34265d5703d242da91e26614da411/EnMicroMsg.db

image.png
image.png

启动Termux,在终端中输入如下命令:

# 获取root权限
su root

# 将聊天数据库文件复制到共享文件夹(参数1就是前面记录的路径)
cp /data/data/com.tencent.mm/MicroMsg/8fd34265d5703d242da91e26614da411/EnMicroMsg.db /storage/emulated/0/Pictures/

# 复制两个配置文件到共享文件夹(破解密码会用到)
cp /data/data/com.tencent.mm/MicroMsg/systemInfo.cfg /storage/emulated/0/Pictures/
cp /data/data/com.tencent.mm/MicroMsg/CompatibleInfo.cfg /storage/emulated/0/Pictures/

打开电脑上的共享文件夹,就可以看到刚刚导出的数据库文件EnMicroMsg.db

image.png
image.png

3. 聊天记录导出

下载这个github仓库的文件:https://github.com/godweiyang/wechat-exploreopen in new window

git clone https://github.com/godweiyang/wechat-explore.git

打开sqlcipher.exe程序,选择打开之前的EnMicroMsg.db文件,会提示输入密码。

image.png
image.png

下面尝试破解密码:
systemInfo.cfgCompatibleInfo.cfg放在上面的仓库目录下,然后在该目录下执行如下命令:
(需要提前安装好java,可以去这里open in new window下载安装)

javac IMEI.java
java IMEI systemInfo.cfg CompatibleInfo.cfg

如图,key后面的字符串就是数据库密码。

image.png
image.png

将解密的密码填写后,就能查看数据库文件。

打开后可以看到很多数据库表,我们的聊天数据记录主要在message表中,按照下图示将message表导出为csv文件。

image.png
image.png
image.png
image.png

比如我这里最终保存的csv文件为message_latest.csv

image.png
image.png

4. 聊天记录数据分析

有了聊天记录的csv文件后,下面我们就可以使用Python等编程语言对其进行简单的数据分析。 下面给出一些示例:

  • 读取和预处理数据
import pandas as pd
import matplotlib.pyplot as plt

path = r"C:\Users\kevin\Documents\leidian9\Pictures\message_latest.csv"
df = pd.read_csv(path, encoding="gbk")
df = df[df['talker']=='<id_of_friend>'] # 更改为你目标好友的微信id
df=df.sort_values("createTime")

roi_df = df[['msgId', "type", "status", "isSend", "createTime", "talker", "content", "imgPath"]]
roi_df['createTime2'] = roi_df['createTime'].apply(lambda x:datetime.fromtimestamp(x/1000).strftime("%Y-%m-%d %H:%M:%S"))
roi_df['day'] = roi_df['createTime'].apply(lambda x: datetime.fromtimestamp(x/1000).strftime('%Y-%m-%d'))
roi_df['hour'] = roi_df['createTime'].apply(lambda x: datetime.fromtimestamp(x/1000).strftime('%H'))

image.png
image.png
  • 提取每次聊天会话信息
delta = list(roi_df['createTime'].diff()/1000)
result = []
start, end, duration = 0, 0, 0
threshold = 10*60
for i, v in enumerate(delta):
    if i==0:
        continue
    if v>threshold:
        end = i-1
        duration = (roi_df['createTime'].to_numpy()[end] - roi_df['createTime'].to_numpy()[start])/1000/60 # 分钟
        isSend = roi_df['isSend'].to_numpy()[start]
        result.append([roi_df['createTime2'].to_list()[start], roi_df['createTime2'].to_list()[end], duration, isSend])
        start = i
isSend = roi_df['isSend'].to_numpy()[start]
duration = (roi_df['createTime'].to_numpy()[-1] - roi_df['createTime'].to_numpy()[start])/1000/60 # 分钟
result.append([roi_df['createTime2'].to_list()[start], roi_df['createTime2'].to_list()[-1], duration, isSend])
chat_df = pd.DataFrame(result, columns=["start", "end", "duration", "isSend"])

chat_df['day'] = chat_df['start'].apply(lambda x: x[:11])
chat_df['hour'] = chat_df['start'].apply(lambda x: x[11:13])
chat_df
image.png
image.png
  • 统计每天聊天次数
data = chat_df.groupby("day")['start'].agg("count")
fig, ax = plt.subplots(figsize=(16,6))
bar = ax.bar(data.index, data)
ax.bar_label(bar, data, padding=2)
ax.set_title("每天聊天次数统计", fontproperties=msyh)
ax.set_ylabel("次数", fontproperties=msyh)
ax.tick_params(axis="x", labelrotation=90, direction="in", length=10.)
image.png
image.png
  • 统计聊天总时长
a, b = divmod(chat_df['duration'].sum(), 60)
print(f"{a:.0f}{b:.2f}分")
  • 统计每天聊天时长
data = chat_df.groupby("day")['duration'].agg("sum")
x = data.index
height = list(map(int, data.to_list()))
fig, ax = plt.subplots(figsize=(16,6))
bar = ax.bar(x, height)
ax.bar_label(bar, height, padding=2)
ax.set_title("每天聊天时长统计", fontproperties=msyh)
ax.set_ylabel("时长(分钟)", fontproperties=msyh)
ax.tick_params(axis="x", labelrotation=90, direction="in", length=10.)
  • 统计每天互发消息数量
out = roi_df.groupby("day").agg("count")
data = out.iloc[:,1]
x = list(range(len(data)))
labels = list(map(lambda x: x[5:], out.index))
fig, ax = plt.subplots(figsize=(14,6))
bar = ax.bar(x=x, height=data)
ax.set_xticks(ticks=list(x),labels=labels)
ax.tick_params(axis="x", labelrotation=90, direction="in", length=10.)
ax.bar_label(bar, data, padding=2)
ax.set_title("每天互发消息数量统计", fontproperties=msyh, fontdict=dict(fontsize=16))
ax.set_xlabel("日期", fontproperties=msyh)
ax.set_ylabel("消息数量", fontproperties=msyh)
  • 统计各小时发起聊天次数
out = chat_df.groupby("hour").agg("count")
data = out.iloc[:,1]
x = data.index
fig, ax = plt.subplots(figsize=(10,6))
bar = ax.bar(x=x, height=data)
ax.set_xticks(data.index)
ax.bar_label(bar, data, padding=2)
ax.set_title("各小时发起聊天次数统计", fontproperties=msyh)
ax.set_xlabel("小时", fontproperties=msyh)
ax.set_ylabel("次数", fontproperties=msyh)

参考资料

[1] 知乎-微信聊天记录报告制作教程(傻瓜版)open in new window
[2] 微信聊天记录导出为电脑txt文件教程open in new window
[3] https://github.com/godweiyang/wechat-exploreopen in new window