Loading...
墨滴

筱筱琪、

2021/05/30  阅读:38  主题:全栈蓝

导出小米6微信记录并词云分析

导出小米6微信记录并词云分析

词云分析我最早应该是在2018/2019年接触过,但那时候代码没写过多少,一晃都2021年了...

2021年04月07日,无意间想起了b站看到过一个农学专业的Up主说给导师做过数据/词云分析,正好最近又在学Python(说来惭愧😔),脑门一热又想搞搞词云分析了,然后就搜了篇教程,对着敲了敲,熟悉了下流程,但开始的时间比较晚了,所以当天并没有看完。

2021年04月08日(也就是昨天),早上一起来就想着既然学了词云分析倒不如对自己微信里的聊天记录分析分析,看看经常发哪些信息。说搞就搞,当然第一步要拿出浏览器先搜搜看有没有人做过,果然还真有人做过了,但看的也是云里雾里的,有说要用xx软件的也有说手机需要root...,眼花缭乱...这时间过得真快啊,一晃时间都中午了,我也快撑不住了,得赶紧速战速决了,想着再试试不行的话就改天再说。最后,在快要放弃的时候找到了一两篇比较靠谱的文章,抱着试一试的心态开始了复现。数据库的密码通过IMEI和uin进行md5运算死活不对,搞得我都怀疑文章有问题了,但文章最后也拿到数据了,后来我又尝试了另外的解密方式,终于在快要放弃的两、三小时后,成功拿到了数据并进行了词云分析😁。

2021年04月09日,整理下思路写下这篇文章,一来记录下自己的复现过程,二来为后续学习者避开弯路,节省时间。

内容摘要

观前提醒:因为我的手机是小米6(用了四年了,依然顽强👍,妥妥米6钉子户),其他手机操作可能略有不同。

1.本地备份拿到微信(com.tencent.mm).bak备份文件。

2.解压备份文件拿到CompatibleInfo.cfgsystemInfo.cfgEnMicroMsg.db数据库文件。

3.进行EnMicroMsg.db数据库解密。

4.导出message数据到Excel中。

5.去除message中的无效信息。

6.python进行词云分析。

手机备份

首先在手机设置中找到备份和重置,选择本地备份

备份

输入密码后选择新建备份

新建备份

取消系统数据软件程序的勾选,并点击软件程序右侧的>选择微信,然后点击开始备份

开始备份

备份开始,时间有点长需要稍等片刻

备份开始

等备份完成后,通过USB数据线将手机连接到电脑上并在手机上选择传输文件(MTP)

备份文件

首先在电脑上新建wechat文件用以存放备份文件和解压缩后的文件

备份文件在手机目录MIUI\backup\AllBackup\时间命名的文件夹中双击打开复制微信(com.tencent.mm).bak(这个文件就是微信的备份文件)文件到电脑上,并通过解压缩文件(这里使用的是7zip,推荐)打开,按以下路径找到相对的文件并复制到wechat文件中

apps->com.tencent.mm->r->MicroMsg->systemInfo.cfg

apps->com.tencent.mm->r->MicroMsg->CompatibleInfo.cfg

apps->com.tencent.mm->r->MicroMsg->字母数字随机组成的用户文件(每个人不一样,一般大小为最大的文件)->EnMicroMsg.db

image-20210409122511867

最后拿到的文件

image-20210409122657801

EnMicroMsg.db解密

这里提供两种方法,其他方法请参考参考1

首先声明:我是通过方法2成功拿到的数据库密码,方法1试了很多次都提示不对,推荐使用方法2,简单粗暴...

  1. 手机IMEI+uin(微信用户id userinformation) 将拼接的字符串MD5加密前7位[参考1]

    IMEI123456uinabc,则拼接后的字符串为123456abc 将此字符串用MD5加密(32位)后为df10ef8509dc176d733d59549e7dbfaf 那么前7位df10ef8 就是数据库的密码,由于有的手机是双卡,有多个IMEI,或者当手机获取不到IMEI时会用默认字符串1234567890ABCDEF来代替,由于种种原因,并不是所有人都能得出正确的密码,我试了很多次都没有成功后来放弃了:(

    uin\apps\com.tencent.mm\sp\auth_info_key_prefs中,用记事本打开找到<int name="_auth_uin" value="xxxxxxxxxx" />xxxxxxxxxx就是uin

  2. 反序列化CompatibleInfo.cfgsystemInfo.cfg[参考1]

    不管是否有多个IMEI ,或者是微信客户端没有获取到IMEI,而使用默认字符串代替,微信客户端都会将使用的信息保存在MicroMsg文件夹下面的CompatibleInfo.cfgsystemInfo.cfg文件中,可以通过这两个文件来得到正确的密码,但是这两个文件需要处理才能看到信息。

具体操作如下:

wechat文件中新建IMEI.java文件并复制以下代码保存

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.security.MessageDigest;
import java.util.HashMap;
public class IMEI {
 public static void main(String[] args) {
  try {
   ObjectInputStream in = new ObjectInputStream(new FileInputStream(
     args[0]));
   Object DL = in.readObject();
   HashMap hashWithOutFormat = (HashMap) DL;
   ObjectInputStream in1 = new ObjectInputStream(new FileInputStream(
     args[1]));
   Object DJ = in1.readObject();
   HashMap hashWithOutFormat1 = (HashMap) DJ;
   String s = String.valueOf(hashWithOutFormat1.get(Integer
     .valueOf(258))); // 取手机的IMEI
   System.out.println("The IMEI is : " + s);
   String uin = String.valueOf(hashWithOutFormat.get(Integer.valueOf(1)));
   System.out.println("The uin is : " + uin);
   s = s + uin; //合并到一个字符串
   s = encode(s); // hash
   System.out.println("The Key is : " + s.substring(07));
   in.close();
   in1.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 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();
  }
}

接下来的操作,电脑需要有java环境,如果没有请点击这里。

在终端中按顺序执行以下命令,来得到数据库密码。

javac IMEI.java
java IMEI systemInfo.cfg CompatibleInfo.cfg

一切顺利的话会出现图示内容,其中The key is:xxxxxxx就是数据库的密码,一共7位,图片这里进行了处理

image-20210409124802316

EnMicroMsg.db文件拖入到sqlcipher软件中,输入从终端获取到的密码点击OK即可打开文件

image-20210408154958558

打开后的界面如下图示:

image-20210408155027532

导出数据

点击左上角File->Export->Table as CSV file

image-20210408155146089

弹出的Table name选择message,点击Export,选择保存路径后输入文件名称即可

最后打开数据文件如图示

聊天内容在content列中,联系人在talker列中

数据处理

content内容复制到message.txt

新建process_wechat.py文件,复制以下代码并保存

import sys


def main(input_filename):
    fin = open(input_filename, "r", encoding='utf8')
    fout = open("__" + input_filename, "w", encoding='utf8')

    for line in fin.readlines():
        if len(line) > 0:
            if line[0] == '<' or line[0] == '\"' or line[0] == " ":
                pass
            else:
                fout.write(line)


if __name__ == '__main__':
    if len(sys.argv) == 2:
        main(sys.argv[1])
    else:
        print('[usage] <input>')

终端执行以下代码进行数据处理,这时候会产生一个__message.txt,这个文件就是处理完的聊天记录了

python3 process_wechat.py message.txt

词云分析

import wordcloud
import imageio
import jieba  # 中文分词
jieba.setLogLevel(jieba.logging.INFO)  # jieba不报错

f = open('__message.txt',encoding='utf-8'#导入文件
txt = f.read()
txtlist = jieba.lcut(txt)
string = ''.join(txtlist)

mk = imageio.imread('pic.png')  # 导入外部词云图片
w = wordcloud.WordCloud(
     height=1000,
     width=1200,
     background_color='white',
     font_path='msyh.ttc',
     mask=mk,  # 外部词云图片
     scale=10# 更改清晰度
)

w.generate(string)
w.to_file('output.png')

得到词云图(这里聊天内容稍微进行了处理)

image-20210409132101785

参考文章

小米手机提取微信聊天记录数据库

微信聊天记录导出为电脑txt文件教程

微信聊天记录导出(2020新版)

筱筱琪、

2021/05/30  阅读:38  主题:全栈蓝

作者介绍

筱筱琪、