读取微信聊天记录并制作词云图

今天(2020年10月29日),我终于将微信里面的聊天记录导出成纯文本文件了,至于后面的制作词云图,就相对简单了。

现在对这个过程记录一下,帮助有需要的人。

注意:我的手机是安卓手机,且没有在其他操作系统上尝试过下述方法。

说来也真是讽刺,自己的聊天记录居然要费这么大的力气才能得到!微信官方说不会查看用户的聊天记录,然而如何解释“微信指数”这个东西呢?
总而言之,大数据时代,我们都在“裸奔”。

1、基本思路

和网上说的一样,基本思路就是拿到手机里面存储聊天记录的数据库并解锁,然后导出成文本文件,接下来怎么分析就全凭所好了。

最耗费时间的,就是拿到并破解聊天数据库的过程。

2、获取数据库文件

微信的聊天记录在手机上是以SQLite数据库存储的。

一般情况下,我们是看不到这个数据库文件的,除非获取Root权限。但是,获取Root权限后会降低手机的安全性,所以现在的安卓手机越来越难以被Root。

为此,就需要“曲线救国”:利用安卓模拟器。

下面是具体的步骤:

  1. 将手机上的聊天记录备份至电脑,这个是微信自带的功能,只需要按照微信的操作指引即可。

  2. 安装安卓模拟器,我用的是网易mumu,支持mac和win。

  3. 打开安卓模拟器,注意,此时不要安装微信,先完成以下操作:
    3.1 获取Root权限(右上角菜单栏-->系统设置-->开启ROOT权限):
    《读取微信聊天记录并制作词云图》
    3.2 设置IMEI编码(右上角菜单栏-->系统设置-->属性设置-->自定义型号-->随机):
    《读取微信聊天记录并制作词云图》
    点击保存后,模拟器会提示是否重启,点击重启以生效之前的设置。

tips: 型号不是重点,这个IMEI编码需要复制下来,后面会用到。

  1. 在模拟器中下载微信(通过模拟器的搜索框直接下载)并登录微信。
  2. 在上一步操作过程中,电脑上的微信会因为手机端微信登录状态的变化而自动退出,这时需要重新登录电脑微信。

tips: 在重新登录电脑微信时,需要扫码验证,可以用手机拍下二维码,然后展示给模拟器中的“手机微信”进行验证。

  1. 将备份的电脑端的聊天记录恢复至模拟器中的手机微信。
  2. 下载RE文件管理器(通过模拟器的搜索框直接下载)

注意: 别的文件管理器可能无法找到数据库文件,建议采用RE。

  1. 打开RE,从根目录/下开始,路径为:/data/data/com.tencent.mm/MicroMsg/<xxxx>/EnMicroMsg.db,其中,<xxxx>为一数字字母组成的字符串,因微信号不同而不同;EnMicroMsg.db就是我们的数据库文件了。
  2. 可以将该数据库文件复制到模拟器的共享文件夹中,这样,数据库文件就到了电脑上了。

3、解密

3.1 获取密码

微信对该数据库文件进行了加密,加密规则是:先对IMEIUIN进行拼接,然后利用MD5算法对拼接后的字符串进行转换,转换后的前7位字符为密码。

IMEI上面已经在模拟器中获取到了,接下来获取UIN

UIN是微信的用户信息号,许多地方可以获取到,这里举一个例子。仍需要回到模拟其中,打开RE,进入到如下目录:/data/data/com.tencent.mm/shared_prefs,然后直接用RE打开其中的system_config_prefs.xml,找到其中的namedefault_uin的标签所对应的value的值,就是UIN

拿到两个编号之后,将它们按照IMEI+UIN的顺序拼接(注意,没有+号),然后进行在线MD5转换,转换后,取前7个字符。

3.2 打开数据库

尽管获取了密码,但并不能向其他数据库一样用密码登录即可(你可以尝试一下用Navicat进行登录看看是否成功),这是由于微信使用了SQLCipher对其进行了加密。如果熟悉SQLCipher的使用,可以下载源码,依据3.1得到的密码,用命令行进行解密。

我不熟悉,所以,可以用到别人的工具进行解密。

下载地址为:链接: https://pan.baidu.com/s/1Im3n02yseo-4IxeDY9srqQ 提取码: ka4z

该工具是一个.exe文件,因此,必须在windows操作系统中运行。软件打开之后使用起来应该没什么难度,选择File-->Open database-->选择数据库文件,然后弹窗就让你输入密码了,输入7个字符的密码即可打开数据库。

注意: 这个软件并不完善,无法将整个数据库导出成SQL文件,只能选择单个表导出成csv文件。至于能否写SQL语句进行导出,我没有尝试。因此,如果熟悉SQLCipher命令,应该可以将整个数据库另存为一个非加密库,这样就可以为所欲为了。

打开之后,里面的表有很多,主要用到的是一张名为message的表,从名字就知道了它存储的是聊天记录。

4、制作词云

其实导出成csv文件之后,想基于这个文件做什么操作反而就比较简单了,这里只是记录一下。

4.1 文件转码

导出成的csv文件的编码需要转换成utf-8,这一点要记住。

4.2 python代码

python版本:3.7

代码不作解释了,都是很基础的,有问题欢迎评论。

import pandas as pd
import jieba
import codecs
from imageio import imread
import matplotlib.pyplot as plt
from wordcloud import ImageColorGenerator
from wordcloud import WordCloud


def load_file_and_seg(file_path):
    """导入文件并分词"""
    f = codecs.open(file_path)
    content = f.read()
    f.close()
    segment = []
    segs = jieba.cut(content)
    for seg in segs:
        if len(seg) > 1 and seg != '\r\n':
            segment.append(seg)
    return segment


def get_words_count(file_path, stopwords_file=None):
    """统计词频"""
    segment = load_file_and_seg(file_path)
    df = pd.DataFrame({ 'segment': segment})
    if stopwords_file:
        stopwords = pd.read_csv(stopwords_file, index_col=False, quoting=3, sep="\t",
                                names=['stopword'], encoding="utf-8")
        df = df[~df.segment.isin(stopwords.stopword)]
    words_count = df['segment'].value_counts()
    return words_count.to_dict()


def has_chinese(string):
    """字符串中是否含有中文"""
    for char in string:
        if u'\u4e00' <= char <= u'\u9fa5':
            return True
    return False


def preprocessing(file_path):
    """数据的预处理"""
    df = pd.read_csv(file_path, sep=",")
    keep_indexes = []
    for i in range(df.shape[0]):
        txt = df.loc[i, 'content']
        if txt.startswith('<msg>'):
            continue
        if txt.startswith("欢迎你再次回到微信"):
            continue
        if has_chinese(txt):
            keep_indexes.append(i)

    df2 = df.iloc[keep_indexes, :]
    df2.sort_values(by='createTime', inplace=True)
    df2 = df2.content

    file = open('raw_msg.txt', 'w+', encoding='utf-8')
    for i in df2:
        file.write(i + '\n')
    file.close()


if __name__ == '__main__':
    file = 'msg2.csv'
    preprocessing(file)
    words_count = get_words_count('./raw_msg.txt')
    bimg = imread('./ai.jpeg')  # 使用一张图片为模板
    wordcloud = WordCloud(background_color='white', mask=bimg, font_path='AquaKana.ttc')  # 注意字体
    wordcloud = wordcloud.fit_words(words_count)
    bimgColors = ImageColorGenerator(bimg)
    plt.axis("off")
    plt.imshow(wordcloud.recolor(color_func=bimgColors))
    plt.show()

5、参考

    原文作者:芳樽里的歌
    原文地址: https://blog.csdn.net/SunJW_2017/article/details/109369139
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞