利⽤python分析聊天记录
⽂章⽬录
前⾔
谢霆锋和杨幂宣布恋情昨天跟⼥朋友讨论谁给对⽅发的消息⽐较多,两⼈各执⼀词,事实证明是我输了^
⼀、任务分析
统计聊天记录分为三步——数据获取、数据清洗和数据分析。下⾯⼤致说⼀下各部分需要做什么。
三步中最难的就是数据获取。与QQ不同,并不提供导出聊天记录的⼯具,所以得去⾃⼰获取。将聊天记录存在⼀个名为EnMicroMsg.db 的数据库⾥,很不幸是这个数据库是加密的,但幸运的是它的密码是可以计算出来的!因此我们⾸先需要获取这个db⽂件,再对它进⾏解密和导出,这样数据获取部分就⼤功告成啦!(是不是听起来很简单哈哈哈)
后⾯两步就⽐较简单了,⽆⾮就是筛⼀下记录,再⽤python分析。
⼆、⼯具
BlueStack蓝叠
SQLCipher
Python
三、步骤
1.数据获取
怎么获得root权限
由前⾯的分析可知,我们需要获取 EnMicroMsg.db 这个数据库⽂件和它的密码,如果⼿机没有Root过的话,需要借助模拟器,我在这⾥⽤的是BlueStack。
获取DB
- 将⼿机上的聊天记录备份到PC
pc端左下⾓的三条杠->备份与恢复->备份聊天记录⾄电脑
怎样梳好看的发型按照提⽰备份即可
爱贝克思- 将刚备份的聊天记录恢复⾄模拟器
在模拟器上安装,并在PC上依此点击左下⾓的三条杠->备份与恢复->恢复聊天记录⾄⼿机。
依然按照提⽰恢复,这样我们就将原⼿机上的聊天记录迁移到了模拟器上。
-获取数据库⽂件
a. ⾸先获取模拟器的root权限
右上⾓向下的箭头 -> 设置 -> 引擎设置,勾选获取root权限
b.到数据库⽂件存放的路径
在这个路径下有两个数字和字母命名的⽂件夹,其中有⼀个就存放着我们需要的 EnMicroMsg.db 。
为什么何炅不喜欢鹿晗⿏标长按,点击右上⾓复制图标,即可复制
c.将数据库复制到PC
蓝叠上也可以更改pc上的⽂件夹,因此直接将数据库⽂件复制到以上路径中。因为我是复制到了Document这个⽂件夹中,对应我电脑上的⽂档,打开就可以看到我们的数据库⽂件啦!
计算密码
根据前⾯的分析,我们现在还需要计算出数据库的密码,⽽这个密码是将机器的IMEI和auth_uin经过加密⽽来的。
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,''), 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\f',
background_color="white",
max_words=200,
mask=alice_mask,
stopwords=stopwords)
# generate word cloud
# store to file
<_file(path.join(d,"qq_result.jpg"))
# show
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.figure()
plt.imshow(alice_mask, ay, interpolation='bilinear')
plt.axis("off")
plt.show()