利用python分析微信聊天记录


前言

昨天跟女朋友讨论谁给对方发的消息比较多,两人各执一词,事实证明是我输了^


一、任务分析

统计微信聊天记录分为三步——数据获取、数据清洗和数据分析。下面大致说一下各部分需要做什么。

三步中最难的就是数据获取。与QQ不同,微信并不提供导出聊天记录的工具,所以得去自己获取。微信将聊天记录存在一个名为 EnMicroMsg.db 的数据库里,很不幸是这个数据库是加密的,但幸运的是它的密码是可以计算出来的!因此我们首先需要获取这个db文件,再对它进行解密和导出,这样数据获取部分就大功告成啦!(是不是听起来很简单哈哈哈)
后面两步就比较简单了,无非就是筛一下记录,再用python分析。

二、工具

BlueStack蓝叠
SQLCipher
Python

三、步骤

1.数据获取

由前面的分析可知,我们需要获取 EnMicroMsg.db 这个数据库文件和它的密码,如果手机没有Root过的话,需要借助模拟器,我在这里用的是BlueStack。

获取DB

- 将手机上的聊天记录备份到PC

pc端微信左下角的三条杠->备份与恢复->备份聊天记录至电脑
按照提示备份即可

- 将刚备份的聊天记录恢复至模拟器

在模拟器上安装微信,并在PC上依此点击左下角的三条杠->备份与恢复->恢复聊天记录至手机。
依然按照提示恢复,这样我们就将原手机上的聊天记录迁移到了模拟器上。

-获取数据库文件

扫描二维码关注公众号,回复: 15359139 查看本文章

a. 首先获取模拟器的root权限

右上角向下的箭头 -> 设置 -> 引擎设置,勾选获取root权限

在这里插入图片描述
勾选

b.找到数据库文件存放的路径

在这里插入图片描述
在这个路径下有两个数字和字母命名的文件夹,其中有一个就存放着我们需要的 EnMicroMsg.db
在这里插入图片描述
在这里插入图片描述
鼠标长按,点击右上角复制图标,即可复制
在这里插入图片描述
c.将数据库复制到PC
在这里插入图片描述

蓝叠上也可以更改pc上的文件夹,因此直接将数据库文件复制到以上路径中。因为我是复制到了Document这个文件夹中,对应我电脑上的文档,打开就可以看到我们的数据库文件啦!
在这里插入图片描述

计算密码

根据前面的分析,我们现在还需要计算出数据库的密码,而这个密码是将机器的IMEI和auth_uin经过md5加密而来的。

a.获取IMEI
在蓝叠上下载一个小工具
在这里插入图片描述
打开后,点击分析器,再点击我的IMEI,就会将IMEI自动填充到输入框里,我们将它记录下来。
在这里插入图片描述
b.获取auth_uin
在这里插入图片描述

打开路径如上,在上面的文件夹中,好多文件里都会有auth_uin,比如上面指出来的那个文件中就有,把它记录下来。
在这里插入图片描述
c.计算密码

这样,我们就获取了计算密码的两大法器——IMEI和auth_id,我们利用MD5在线加密工具,将IMEI和auth_id输到左侧方框,中间不要有字符,加密方式选择32位小。
在这里插入图片描述
加密出来的前7位就是这个数据库的密码了,大功告成!

导出数据库

使用SQLCipher导出数据库,我在网上找了好久都不靠谱,之后会上传一个可以用的(也可以自己找)。
打开 EnMicroMsg.db ,会提示我们输入密码,将刚刚获取到的密码输入,就可以解开啦
在这里插入图片描述
在这里插入图片描述
找到message数据库并导出
在这里插入图片描述
在这里插入图片描述
这样就得到了全部的数据!
在这里插入图片描述

2. 数据清洗(具体方法以后补充)

1.要将时间戳转换为北京时间
2.处理图片和链接等非文字聊天记录

3. 数据分析

目前仅统计了两人的消息数量和做了一个简单的词云:
消息数量(啊,是我输了呜呜):
在这里插入图片描述

词云:
在这里插入图片描述

代码:

from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud, STOPWORDS

# 当前文件路径
d = path.dirname('__file__')
# Read the whole text
file = open(path.join(d, 'message.txt'), encoding='utf-8').read()
# 进行分词
punc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ<>0123456789\/"
temp = []
for c in file:
    if c not in punc:
        temp.append(c)
newText = ''.join(temp)

default_mode =jieba.cut(newText)
text = " ".join(default_mode)
alice_mask = np.array(Image.open(path.join(d, "2.jpg")))
stopwords = set(STOPWORDS)
stopwords.add("said")
wc = WordCloud(  
    #设置字体,不指定就会出现乱码,这个字体文件需要下载
    font_path=r'D:\study\tools\WenQuanWeiMiHei\WenQuanWeiMiHei-1.ttf',  
    background_color="white",   
    max_words=200,   
    mask=alice_mask,  
    stopwords=stopwords)  
# generate word cloud
wc.generate(text)

# store to file
wc.to_file(path.join(d, "qq_result.jpg"))

# show
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.figure()
plt.imshow(alice_mask, cmap=plt.cm.gray, interpolation='bilinear')
plt.axis("off")
plt.show()

参考教程: https://www.jianshu.com/p/3065087ea1b0

猜你喜欢

转载自blog.csdn.net/Kevinxgl/article/details/109992360