绿皮书——iOS导出微信聊天记录,并用python制作词云

引言

某天突发奇想,想把微信聊天里的美好记录下来,作为给某人的一份小礼物。酝酿了一周,最终花了一下午加一晚上才算有点小成果。写下来主要是分享一下流程,希望后面有这种想法的朋友节约时间少踩点坑,最后感叹下自己一点一点解决问题到最终成功的感觉很好。嗯,最重要的是某人甚喜~
PS:安卓手机需先root,下载Root Explorer,请移步这里

目录

1.提取微信聊天记录

工具:

1. iTunes
2. 楼月免费iTunes备份管理器
3. sqlcipher

相关工具下载:百度云
提取码:3dxp

1.1 iTunes备份

先把iPhone备份到电脑中,不加密
本电脑,不加密
备份文件在如下路径,C:\Users\用户名\AppData\Roaming\Apple Computer\MobileSync\Backup
备份目录

1.2 解密备份文件

打开“楼月免费iTunes备份管理器”,自动刚显示备份的文件
在这里插入图片描述
导出Documents文件夹
在这里插入图片描述
观察刚刚导出的Documents文件,这个一长串编码的文件表示一个微信账号的聊天记录
在这里插入图片描述

1.3 找到指定好友

用sqlcipher.exe打开在该文件夹的DB里的MM.sqlite
在这里插入图片描述
打开之后长这样,一个table代表一个聊天,以Chat_开头,一串数字字母(其由微信ID经过MD5加密而成)结尾代表和某个人的聊天记录,我这里特意用旧手机只备份一个人的聊天记录,所以要找的就是Chat_2d51723…
倘若你有很多Chat_文件,只需要找到你要的微信好友ID,经过MD5在线加密即可得到这一长串密文
在这里插入图片描述
列如某人的ID是这个,经过MD5加密可得上述密文

在这里插入图片描述
在这里插入图片描述

1.4 导出为xlsx

相关模块请用pip安装

import sqlite3
import pandas as pd

with sqlite3.connect(r'你的路径\DB\MM.sqlite') as con: # 你的MM.sqlite的全部路径
    df1 = pd.read_sql_query("select * from Chat_2d51723beec***************", con) # 上面的Chat_文件名

# 保存为excel
writer = pd.ExcelWriter('小红.xlsx')
df1.to_excel(writer, 'Sheet1')
writer.save()

至此,第一步从iOS导出微信聊天记录完成,如果你仅仅想保存下你们美好的回忆以便于以后翻阅的话,推荐下载wxbackup,软件由hangcom大神开发,导出后可直接浏览,聊天内容为HTML网页文件,文字内容以js格式保存,名为‘message’的JavaScript文件。编写词云还可参考这里python 将微信聊天记录生成词云

2.python读取分析画图

python包:
1. jieba
2. wordcloud
3. scipy

wordcloud的安装直接使用pip install wordcloud貌似会有问题,所以请直接下载.whl文件,链接https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud,下载对应32位或64系统,对应python版本的.whl文件,具体安装方法自行百度谷歌。
在这里插入图片描述

2.1 数据筛选

打开得到的小红.xlsx,将message那一列复制粘贴到新的xlsx中,并另存为.txt格式
在这里插入图片描述

2.2 分析词频

以下代码从contr4l的github下载

import jieba.analyse
import string

filename = r'小红.txt的路径,注意不包括.txt'# 读取txt文件路径
# 此模块用于分析文件中的字频,输出结果形如 词语 --- 权重频次
def AnalyzeData():
    f = open(filename + '.txt', 'r', encoding='gb18030')
    fcontent = f.read()
    alpha = 'qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM'# 去除非中文部分
    tags = jieba.analyse.extract_tags(fcontent, topK=250, withWeight=True)
    new_tags = {}
    for k in range(len(tags)):
        uchar = tags[k][0][0]
        if uchar not in alpha:
            new_tags[tags[k][0]] = int(tags[k][1] * 10000)

    # 将词频-词语保存为文件,注意格式化对齐的方式
    with open(filename + '_Word.txt', 'w') as f: # 生成小红_Word.txt
        for i, j in tags:
            if i[0] not in alpha:
                f.write('{:15}\t{:15}'.format(i, int(j * 10000)) + '\n')
            # print('{:8}\t{:10}'.format(i,int(j*10000)))
        f.close()

    # 返回字典为wordcloud提供依据
    return new_tags

2.3 生成词云

from wordcloud import WordCloud
from scipy.misc import imread
import wordcloud
def cloudplot():
    # 设置模板图像的路径
    target_coloring = imread(r'需要找一个背景图\welove.jpg')
    # 以词频和背景模板为依据生成词云对象
    word_cloud = WordCloud(font_path=r'C:\Windows\Fonts\simhei.ttf',
                           background_color="white", max_words=2000, mask=target_coloring).generate_from_frequencies(
        AnalyzeData())
    # 生成颜色分布
    image_color = wordcloud.ImageColorGenerator(target_coloring)
    # image_color =

    import matplotlib.pyplot as plt
    # 仅按照词频、边界、默认颜色生成词云图像
    plt.imshow(word_cloud)
    plt.axis("off")
    plt.figure()

    # 重新上色,按照图像色彩分布生成
    plt.imshow(word_cloud.recolor(color_func=image_color))
    plt.axis("off")
    plt.figure()

    # 绘制原始图像
    plt.imshow(target_coloring, cmap=plt.cm.gray)
    plt.axis("off")
    plt.show()

    word_cloud.to_file(filename + '.png')


cloudplot()

3.成果展示

version1.0——3月18日
在这里插入图片描述

在这里插入图片描述
version2.0——5月12日
在这里插入图片描述
在这里插入图片描述

最后

算是第一篇真正意义上的博客,心中蓦地松了一口气,好像做了一件很久以前就该做的事,好在某人开心,什么都值得~

参考:
[1]: https://github.com/contr4l/MicromsgHistory
[2]: https://github.com/h1997l1997/Analysis-of-Wechat-history-
[3]: https://zhuanlan.zhihu.com/p/40814102
[4]: https://zhuanlan.zhihu.com/p/32511173
[5]: https://blog.csdn.net/contr4l_/article/details/80531222

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值