效果展示
导出内容:文字、图片、撤回消息、表情包、拍一拍、回复
导出格式:txt,docx,PDF
一、下载模拟器导入聊天记录到模拟器里
这里以夜神模拟器(支持root的模拟器都行)为例
在模拟器里安装微信并登录,然后在电脑上登录微信。
选择恢复聊天记录到手机,选择你导出的联系人到模拟器里,确保模拟器里的微信可以查看到聊天记录
完成之后打开夜神模拟器,找到Amaze
选择根目录,找到./data/data/com.tencent.mm/MicroMsg
将这个文件夹复制到共享文件夹中
共享文件夹在上面可以看到,按照图片操作进行复制粘贴
然后再将下面这个文件(auth_info_key_prefs.xml)复制到共享文件夹中(文件目录://data/data/com.tencent.mm/shared_prefs)
复制完成之后到电脑的文件管理器查看共享文件夹
提取成功,第一步搞定
二、破译密码
文件夹里面会有一个以很长一串数字或者一些字母组成命名的文件夹(也可能有多个。不同的文件夹名代表不同的qq,如果你用不同的qq登陆过微信,每个qq会产生一个新乱码文件夹,保险起见,可以都备份上)把此文件夹备份出来,文件夹里还有个systeminfo.cfg文件可以不用备份
在这个名字很长的文件夹下将这三个文件提取出来,avatar(存储了用户的头像数据),image2(存储了聊天的图片数据)EnMicroMsg.db(存储了所有的聊天记录)
微信数据库EnMicroMsg.db的加密方式,把IMEI和auth_uin组合得到一起md5加密,取加密后的前7位(小写)
IMEI提取:打开夜神模拟器,右上角找到设置,进入手机设置,查看IMEI值
auth_uin提取方式,用记事本打开上面得到的xml文件,<int name=“_auth_uin” value="-15641**** " value后面的值就是uin(负号保留)
被加密字符串就是: 351564524987328-15641****
在线加密网站:MD5在线加密/解密/破解—MD5在线 (sojson.com)
经过MD5加密后输出的字符串取前7位(小写)
将EnMicroMsg.db用sqlcipher.exe打开输入密码试试能不能打开
不能的话 用 IMEI = ‘1234567890ABCDEF’ 再试试
打开之后显示这个界面,点击Browse Data可以查看每个数据表的信息
微信所有聊天记录都在message表里,所有联系人都在rcontact表里,userinfo里存储个人信息,把这三个表导出为csv文件,分别命名为message.csv和rcontact.csv,userinfo.csv
将导出的所有表都放在db_tables文件夹里(自己新建)
直接导出的csv文件在python读写会出现异常,所以先在Excel里打开csv文件再另存为xlsx文件(或者用记事本更改编码方式为utf-8)放到db_tables文件夹里
三、解析数据
0、模块安装(不会安装的话自行百度)
-
pandas库,安装失败自行百度,网上很多教程
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
-
docx库
pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple
-
requests库
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
-
docxcompose库
pip install docxcompose -i https://pypi.tuna.tsinghua.edu.cn/simple
1、把三个xlsx文件解析成新的csv文件(rcontact.py和message.py)
rcontant.py
#-*- coding : utf-8-*-
# coding:unicode_escape
'''
#! 本文件功能
#! 1、将rcontact.xlsx转化成new_rcontact.csv
#! 2、获取联系人的wxid
#! 另外两个文件都会使用此模块
'''
import os
import pandas as pd
filename = ''
if isExists := os.path.exists('./db_tables/rcontact.xlsx'):
isExists = os.path.exists('./db_tables/new_rcontact.csv')
if not isExists:
filename = './db_tables/rcontact.xlsx'
df = pd.read_excel(filename)
df.to_csv('./db_tables/new_rcontact.csv')
print("new_rcontact.csv 导出成功")
filename = './db_tables/new_rcontact.csv'
else:
print('rcontact.xlsx not exits')
print("请将数据库里的rcontact表导出\n命名为:rcontact.csv")
print("用Excel把文件导出为xlsx格式放到此目录下")
'''获取指定备注名的wxid'''
def get_one_wxid(conRemark):
if not filename:
print("联系人csv文件不存在")
else:
df = pd.read_csv(filename)
for row_index, row in df.iterrows():
if row['conRemark'] == conRemark :
wxid = row['username']