最近快毕业了,所以想把微信聊天记录全部导出、做成词云、然后寄给好友,想想都很浪漫,哈哈。先上词云结果图(结果图拿《三国演义》做的,想啥呢,我才不会把我的聊天记录发到网上,哈哈),然后教大家如何不花钱(也不要C币)做出高清的聊天记录词云。(想花钱做的请下载“卓师兄”得到聊天记录,使用微词云得到高清词云图,大概200元就可以搞定)

我是个小白,在制作过程中遇到了很多坑,所以我会说很多,也许比较啰嗦,也算是希望大家别踩我的坑,哈哈。

步骤分为以下几个部分:1、微信应用数据备份。2、微信数据库解密。3、微信聊天记录提取和处理。4、词云制作。

1、微信应用数据备份。

微信数据备份网上教程很多(点我进入知乎的备份教程),我的手机型号是华为畅享8 Plus(FLA-AL10),因此只要你是华为手机,直接跟着我的教程走就完全没有问题。华为手机助手这个坑我踩过,别用,哈哈,还是自带的老版本备份软件最好!

(1)卸载本机的华为备份软件。新版本的备份软件不能备份微信应用数据,所以要卸载。如果你找不到“备份”图标,那就可以这样卸载:设置->应用和管理->应用管理->备份->卸载。

(2)下载并安装8.0版的华为备份软件。点我下载华为备份8.0。

(3)备份微信应用数据。照着下面图片的步骤就行,步骤6后面会提示设置密码,需要点击跳过。我的最终备份文件路径为“内部存储\Huawei\Backup\backupFiles\2020-05-29_10-54-12\com.tencent.mm.db"。

         

         

2、微信数据库解密。

看雪论坛的newx大神详细讲解过手机版和电脑版解密的方法(点我进入newx大神的主页),我几乎照搬他的教程,自己琢磨出了一套我的方法。

(1)微信备份数据库转为文件夹格式。使用楼月安卓手机备份文件提取器来把com.tencent.mm.db变为文件夹格式。(点我下载楼月软件)。为了方便借鉴我的教程,本教程所有文件全部放到D:\weiXinCiYun中。如下图,把第一节中的数据库文件放到D:\weiXinCiYun\com.tencent.mm.db,然后提取为D:\weiXinCiYun\data。

对了,楼月其实还有微信聊天记录导出恢复助手,但是收费100元,而且效果一般。

(2)获取IMEI。IMEI(International Mobile Equipment Identity)就是国际移动设备识别码,即通常所说的手机序列号,用来区分每部手机。如下图可以从华为手机的设置中得到IMEI,双卡的IMEI有两个,你需要看看自己用的是哪张。也可以通过记事本打开D:\weiXinCiYun\data\data\com.tencent.mm\MicroMsg\compatibleinfo.cfg,里面的乱码里有一串15位的数字,就是IMEI。如果上面俩办法还是不行,那您进入2-(3)来获取IMEI。

        

(3)获取UIN,计算出最终密码。UIN(User INformation)就是用户信息识别码,每个人的UIN不同。之前可以通过抓取网页版微信的数据得到,现在个人不能登录网页版微信了(反正我登陆不了,哈哈)。首先呢,数据库破解密码计算公式如下。如果你问我谁破解出了这个密码公式,我只能说:有内鬼,终止交易(ΩДΩ)

密码=前7位(MD5((IMEI+KEY)))

下面我们来破解吧!下载一个Java的集成开发环境,比如我下载了IntelliJ IDEA(其实我不会java,但是我会照着百度新建工程、运行代码,哈哈)。将D:\weiXinCiYun\data\data\com.tencent.mm\MicroMsg下的两个文件“compatibleinfo.cfg”(存着IMEI信息)和“systeminfo.cfg”(存着UIN信息)放到java工程D:\weiXinCiYun\JavaPrj下。然后用Java的Hashmap解码,获取信息,MD5处理,取其前7位即可。java代码和操作流程如下:

package com.company;
import java.io.FileInputStream;             // 文件输入流
import java.io.FileNotFoundException;       // 文件未找到的异常处理
import java.io.IOException;                 // 输入输出异常处理
import java.io.ObjectInputStream;           // 输入流
import java.security.MessageDigest;         // 支持MD5算法
import java.util.HashMap;                   // 支持哈希算法
public class Main {// main函数public static void main(String[] args) {try {// 取手机的IMEI// 读入CompatibleInfo.cfg文件ObjectInputStream in = new ObjectInputStream(new FileInputStream("CompatibleInfo.cfg"));Object DL = in.readObject();// java的哈希转换HashMap hashWithOutFormat = (HashMap) DL;String s = String.valueOf(hashWithOutFormat.get(Integer.valueOf(258)));System.out.println("IMEI:"+s);// 获取微信UIN,与IMEI获取类似ObjectInputStream in1 = new ObjectInputStream(new FileInputStream("systemInfo.cfg"));Object DJ = in1.readObject();HashMap hashWithOutFormat1 = (HashMap) DJ;String t = String.valueOf(hashWithOutFormat1.get(Integer.valueOf(1)));System.out.println("uin:"+t);//合并到一个字符串,然后使用MD5算法,取其前6位s = s + t;s = encode(s); // MD5System.out.println("密码是 : " + s.substring(0, 7));in.close();in1.close();} catch (Exception e) {e.printStackTrace();}}// MD5计算public static String encode(String content){try {MessageDigest digest = MessageDigest.getInstance("MD5");digest.update(content.getBytes());return getEncode32(digest);}catch (Exception e){e.printStackTrace();}return null;}// 十进制转十六进制private static String getEncode32(MessageDigest digest){StringBuilder builder = new StringBuilder();for (byte b : digest.digest()){builder.append(Integer.toHexString((b >> 4) & 0xf));builder.append(Integer.toHexString(b & 0xf));}return builder.toString();}
}

(4)取出聊天记录。2-(3)里最后一张图的调试界面已经显示出了密码,我们下载一个数据库软件,用密码对数据库解密就行。一定要下载sqlcipher2版本,其它数据库软件不行,我试过,哈哈,点我下载sqlcipher2。D:\weiXinCiYun\data\data\com.tencent.mm\MicroMsg\c2f9b29c3178c858d04e3ac3382b7c33\enmicromsg.db这个数据库存放着微信的聊天记录,最后两级路径可能不同,但enmicromsg.db名称是固定的。用sqlcipher打开enmicromsg.db,将其中的message表输出为csv即可,最后把message.csv转为message.xlsx。具体操作如下图:

3、微信聊天记录提取和处理

将上节的message.xlsx放到D:\weiXinCiYun下面。然后打开,我来讲解一下该excel每列内容的含义。我这里复制了很多简书“唐九十九藏”大神的内容(点我看唐九十九藏的内容)。

1、msgId:Message Identity,消息标识,取值2,3,4,5...,用来区分每条消息,相当于消息的身份证。

2、msgSvrId:不知道啥意思,哈哈。

3、type:消息类型,1-文本,3-图片,34-语音,43-视频,47-微信外部成系列开发的表情包,49-做成微信格式的外部网页链接。10000-撤回消息,1048625-微信外部单独开发的表情包,285212721-微信公众号推送的自动消息,419430449-微信红包(未更新时会有类似提示)。

4、status:不知道啥意思,o(╥﹏╥)o

5、isSend:0-收到消息,1-发送消息。

6、isShowTimer:不知道啥意思,我的16万条消息里面,它都是空。

7、createTime:消息发送/收到的时间。这里用的是UNIX时间戳。

8、talker:WXID,即微信号码。

9、content:聊天记录。

10、imgPath:Image Path,微信图像、语音、视频等大文件的存储路径。

11、reserved:不知道啥意思,(ΩДΩ)

12、lvbuffer:几乎全是“{”,感觉没啥用。

13、transContent:不知道啥意思,我的16万条消息里面,它都是空。

14、transBrandWording:不知道啥意思,我的16万条消息里面,它都是空。

15、talkerId:微信好友的唯一号码,它相当于微信里的身份证号。

16、bizClientMsgId:如果变量非空,那么type就是285212721,status就是3,isSend就是3,content就是~SEMI_XML~,所以我猜应该是微信号推送消息的某种号码。

17、bizChatId:大部分值都是-1,微信运动相关行其值为空。估计没啥意义。

18、bizChatUserId:不知道啥意思,我的16万条消息里面,它都是空。

19、msgSeq:与msgId差一个常数,感觉很鸡肋,有时候还是空。

20、flag:msgSeq有值,则flag=0,msgSeq为空,则flag也为空。

将下面的Matlab代码放到D:\weiXinCiYun下运行,将代码第13行的yourID改为你想要微信联系人的talkerId就行。代码运行结果中user.contentText矩阵里的content那一列就是对应talkerId的用户的所有文字聊天记录(图片和网页之类的东西我剔除了),把content那一列复制下来,放到'李某某.txt'中。把具体代码和matlab界面如下:

% 选择是否从初始化,excel里导入数据
if(1)close all; clear; clc;fileName = 'message.xlsx';range = 'A1:T2';[num, txt, raw] = xlsread(fileName);
end% message为数据库聊天记录message表
yourName = '李某某';
myName = '王某某'
message = raw;
yourID = 193;% user为your的单个结构体,下面的...Id存储某列值在message里的列数
ans = ['开始新建', yourName, '的user数据...']
yourFullName = yourName;                % 你的名字
myFullName = myName;                     % 我的名字
user.talkerId = yourID;                         % 用户编码:咱只需要本用户的数据,其余数据丢弃
user.typeIndex = 3;                              % 聊天记录类型的列数:1文字消息,其余全不要
user.isSendIndex = 5;                           % 发送类型的列数:0接收,1发送
user.creatTimeIndex = 7;                     % 发送时间的列数
user.contentIndex = 9;                         % 发送内容的列数
user.imgPathIndex = 10;                       % 图像路径的列数
user.talkerIdIndex = 15;                        % 对方的微信ID的列数
user.contentLengthIndex = 21;            % 内容发送内容长度的列数% 选取某个人的聊天记录:将talkerId与对方相同的message留下,其余的抛弃
user.message = [];
sizeMessage = size(message);
for i = 1:sizeMessage(1)iif cell2mat(message(i, user.talkerIdIndex)) == user.talkerIduser.message = [user.message; message(i, :)];end
end% 删去聊天记录中的非文本信息
sizeUserMessage = size(user.message);
user.contentText = [];                   % 聊天记录里的文本
user.contentOther = [];                 % 聊天记录除了文本图片的其它
for i = 1:sizeUserMessage(1)iswitch cell2mat(user.message(i, user.typeIndex))case 1          % 文本聊天记录% 尝试将聊天记录转为字符串类型trycharTmp = char(user.message(i, user.contentIndex));catchState = 0;catchcatchState = 1;endif ~catchState              % 聊天记录可以转为字符串% 正则表达式,提取出charTmp里的汉字,赋给hanZihanZi = char(regexp(charTmp,'[^\x00-\xff]{1,}','match'));lengthHanZi = length(hanZi);lengthCharTmp = length(charTmp);% 如果单个聊天记录长度大于10,并且汉字数量少于总数量的一半,那么认为是系统的红包、语音、链接等无用信息,放入other里if (lengthCharTmp > 10) && (lengthHanZi < (lengthCharTmp / 2))user.contentOther = [user.contentOther; user.message(i, :)];else% 将有用数据保存,开辟新的最后一列,保存消息长度,以便后续查找最多消息的一天、查找最多消息等操作。user.contentText = [user.contentText; user.message(i, :) lengthCharTmp];% 将Unix时间改为Matlab时间unixTime = user.contentText(end, user.creatTimeIndex); unixTime = unixTime{1};matlabTime = datestr(UnixTime2MatlabTime(unixTime), 'yyyy-mm-dd HH:MM:SS');user.contentText(end, user.creatTimeIndex) = cellstr(matlabTime);endelse                               % 聊天记录不可以转为字符串user.contentOther = [user.contentOther; user.message(i, :)];end otherwise     % type非1,则不是文本消息,放入other里user.contentOther = [user.contentOther; user.message(i, :)];end
endans = '运行结束'

4、词云制作

词云就是把一大篇文章里的词语摘出来,根据词语使用频率的高低,在图片里根据不同的大小来显示,非常直观,而且很浪漫。词云制作我几乎照搬bilibili up主同济子豪兄的内容, 如果你有兴趣了解词云制作的细节,可以去看他的b站词云制作讲解视频(点我进入同济子豪兄的b站视频)

(1)安装相应的词云库和中文分词组件库。windows在PowerShell里运行下面的pip代码就行。跟词云关系最大的两个模块就是WordCloud和jieba。WordCloud是制作词云的库,小巧精悍,功能强大,1小时就可以了解完它的所有接口函数(点我进入WordCloud官网)。jieba是分析中文词语的库,接口函数很多,可以分析各种词性、短语等(点我进入jieba的github网站)。

pip install numpy matplotlib pillow wordcloud imageio jieba snownlp itchat -i https://pypi.tuna.tsinghua.edu.cn/simple

(2)下面到了激动人心的词云制作环节!上一节中,我们已经把某人的聊天记录全部放到“李某某.txt”里了,我已经把python代码给你弄好啦,你直接放到D:\weiXinCiYun跑就行,生成词云图片是5657×4000的,超级高清,刚好是A4纸的打印尺寸,可以彩印出来给同学看,哈哈,代码大约得运行2分钟。代码和结果如下(当然还是三国演义啦,我才不贴我的聊天记录):

# 导入词云制作库wordcloud和中文分词库jieba
import jieba
import wordcloud# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio# 构建并配置词云对象w,注意要加scale参数,提高清晰度
w = wordcloud.WordCloud(width= 5657,height=4000,background_color='white',font_path='msyh.ttc',)# 对来自外部文件的文本进行中文分词,得到string
f = open('李某某.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)# 将词云图片导出到当前文件夹
w.to_file('李某某的词云.png')

5、作者的私货

其实微信聊天记录导出、python生成词云等东西在google里、百度里已经是玩烂的东西了,但google和百度里面竟然没有一篇完整的、详尽的教程,所以我才想做一篇,而且制作过程中自己也提高了很多,很有趣,哈哈。大家要遵纪守法、做一个好公民,微信聊天记录只许查看自己的呦~

本文的所有代码和步骤已经说得很明白了,上文也全部给出了。鉴于也许有些C币大佬愿意打赏我,或者懒得挨个下载,我把我的关于微信做词云的所有代码、工程、安装包等做成了一个压缩包,里面包含了所有东西,还夹带了一点点的matlab微信聊天记录处理函数(Unix时间、matlab时间、中文时间互相转换函数),如果你想一股脑地全部下载,想看看我的私货matlab代码的话,可以下载我的私货压缩包呦——(点我下载全部代码和资源和私货的压缩包!)。

我写完这篇文章是2020年6月1号,儿童节,希望大家保持童心,保持好奇。昨天ellon musk的spaceX公司发射了载人航天器"龙"号,它的二级火箭和载人航天器都可以回收,太牛逼了。“龙”号和国际空间站对接了,还送了2个NASA的航天员,厉害啊。真的希望我国的航天事业赶紧发展,有生之年看见我国翱翔于星辰大海。

微信聊天记录做成词云~相关推荐

  1. 微信聊天记录的词云制作

    微信聊天记录的词云制作 需求 导出微信聊天记录 提取文字聊天记录 生成词云 需求 想把跟朋友的微信聊天记录做个词云 导出微信聊天记录 我的手机是iphone,用旧版的itunes备份手机全部信息 it ...

  2. 【代码】QQ群最近聊天记录做成词云

    有这个想法是因为看到了itchat包,做了微信签名词云,微信好友热图,然后就想着那么QQ不是也可以做吗,像QQ群成员地图热图腾讯已经有了,好吧我就把QQ聊天记录做一下,主要也是导出.txt很方便 只是 ...

  3. 【微信聊天记录制作词云】超详细保姆级教学!!!(详细步骤+代码)

    简介 还在因各种情侣节日不知道送对方什么礼物而感到苦恼吗?不如试试这个超浪漫的微信聊天词云! 整体思路主要为: 1. 利用模拟器找到备份文件 2. 解密文件并导出文本文件 3. 代码制作词云 前期准备 ...

  4. python豆瓣爬虫爬取评论做成词云

    前言 前一段时间学校有个project,做一个电影购票系统,当时就用springboot做了系统,用python抓了一些电影的基本信息.后来发现如果把评论做成词云那展示起来不是很酷炫么.于是乎把这个过 ...

  5. 爬取钉钉在B站卑微道歉视频弹幕,做成词云

    爬取钉钉在B站卑微道歉视频弹幕,做成词云|钉~ 听这美妙的声音 先看用户老爷们给出得评价 B弹幕爬取的方法 打开钉钉下跪视频 B站链接 然后进入控制台如图查看,打开控制台刷新下页面. 你就会在控制台看 ...

  6. 用Python爬取B站弹幕并做成词云

    用Python爬取B站弹幕并做成词云 一.获取视频的cid号 1.进入想爬的视频,打开浏览器设置里的"开发者工具": 进入NetWork后等待requests刷出,数据够了后可随意 ...

  7. 用Python采集《雪中悍刀行》弹幕做成词云实例

    大家好,本篇文章主要讲的是用Python采集<雪中悍刀行>弹幕做成词云实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下.编程学习资料点击免费领取 目录 前言 知识点介绍 环境介 ...

  8. 情人节礼物------用她的照片和我们的聊天记录生成词云~

    用到的知识点 python读写文件 python正则表达式过滤无用信息 jieba分词与自定义字典 停用词筛选.统计词频 调用wordcloud绘制词云 第一步 从电脑版蛐蛐导出聊天记录.(手机一般不 ...

  9. 微信小程序-词云图片

    最近上线了一款词云小工具,词云图片,服务端主要用了python的wordcloud库生成的词云, 关于wordcloud的详细介绍大家可以去官网学习 http://amueller.github.io ...

  10. Python提取岛上书店书中所有书名后做成词云

    通过笔者Python提取<岛上书店>书名这一文章内容中的算法二,我们成功地把<岛上书店>中所有书名提取出来,并保存到同目录下的output.txt文件中.如果单单将这个发到朋友 ...

最新文章

  1. 华盛顿多家博物馆因美政府停摆“闭门谢客”
  2. Win服务器2008和2012哪个更好?
  3. VTK:可视化算法之OfficeTube
  4. neo4j 连接java
  5. java应用系统正确的连接DM主备集群
  6. 网易有道押注教育智能硬件,蓝海市场还能维持多久?
  7. 我怀疑全国最会吹牛的人,都在这8个公众号上了
  8. JVM优化系列-详解JDK1.8 Metaspace 参数配置
  9. leetcode 1184 python
  10. iphonex如何关机_iPhoneX怎么关机 iPhoneX如何强制重启【详细步骤】
  11. L1-065 嫑废话上代码 (5 分)-PAT 团体程序设计天梯赛 GPLT
  12. 打印机共享到网络访问不了计算机名,共享打印机XP访问Win7/Win10提示指定的网络名不再可用解决方法...
  13. 三种模型验证方法:holdout, K-fold, leave one out cross validation(LOOCV)
  14. 使用 WebSocket 实现一个网页版的聊天室(摸鱼更隐蔽)
  15. obd协议 混动车_OBD协议介绍
  16. Code Clinic: Clojure 代码诊所:Clojure Lynda课程中文字幕
  17. TQ2440(ARM)和SIM300(GPRS模块)串口通信
  18. 那些有趣的国界线:这中国字谁写的?
  19. 系统架构师笔记——计算机网络
  20. 手撕Promise源码

热门文章

  1. Python如何用几行代码实现在线翻译
  2. 尝试docker1.12内置swarm
  3. SDD-FIQA基于人脸相似度分布距离的无监督质量评估方法
  4. 010Editor查看PE文件
  5. JS实现继承的几种方式
  6. 最全SSH命令 - 11种用法
  7. CHROME插件开发之·web页面与插件后台通信(chrome.runtime.sendMessage => chrome.runtime.onMessageExternal.addListener)
  8. Mac将Wps本地文件备份到云端
  9. Linux nanomsg tcp sub pub
  10. Fuji-ImageJ分割中央凹无血管区