手机微信聊天记录导出

微信聊天记录导出教程

安装OpenSSL

下载链接:https://slproweb.com/download/Win64OpenSSL-3_1_4.exe
安装过程参考:https://blog.csdn.net/m0_65939803/article/details/128932476
说明:验证openssl时需要重启电脑,不然openssl version会报错,当然不验证也没关系,其实没什么影响

安装python-3.6.1-amd64.exe

下载链接:https://www.alipan.com/s/CYerTE4uqGG
这都2023年了,相信大家都很奇怪,为什么还要用python-3.6。
原因很简单,解密聊天记录需要的一个python库 pysqlcipher3已经好久没更新了,最高支持到python-3.6,其他版本无法编译通过,因此必须安装python3.6

安装需要的依赖

注意:pysqlcipher3-1.2.0-cp36-cp36m-win_amd64.whl 私信作者获取
pip install re
pip install hashlib
pip install pandas
pip install pymysql
pip install .\pysqlcipher3-1.2.0-cp36-cp36m-win_amd64.whl

备份手机微信聊天记录(以小米手机为例)

在设置中找到我的设备------>备份与恢复------>选择备份微信

将聊天记录拷贝至电脑

小米备份的存储位置为 MIUI/backup/AllBackup/备份的日期/微信(com.tencent.mm).bak

解压备份文件

第一步:将微信(com.tencent.mm).bak 重命名为 微信(com.tencent.mm).zip
第二步:使用7-ZIP(其他的解压缩软件解压不出来)解压微信(com.tencent.mm).zip

对微信聊天数据库进行解密

创建 解密.py

代码内容如下
import re
import os
import hashlib
import pandas as pd
from pysqlcipher3 import dbapi2 as sqlite
from pymysql.converters import escape_string

sqlkeys=[]
databasepath=[]

# 解密数据库
def DecodeDataBase(path,i):
    # 加密文件路径
    encrypted_file = path
    # 解密文件路径
    decrypted_file = str(i+1)+"_Decode.db"
    print(decrypted_file)
    # 提供加密密钥
    for key in sqlkeys:
        try:
            # 连接到加密数据库文件
            conn = sqlite.connect(encrypted_file)
            # 设置加密密钥
            conn.execute(f"PRAGMA key='{key}'")
            # 添加这一行,将数据库文件转换为 SQLCipher 4 格式
            conn.execute("PRAGMA cipher_migrate")
            # 备份到新的解密数据库文件
            conn.execute(f"ATTACH DATABASE '{decrypted_file}' AS decrypted KEY '';")
            conn.execute("SELECT sqlcipher_export('decrypted');")
            conn.execute("DETACH DATABASE decrypted;")
            # 关闭连接
            conn.close()
        except Exception as e:
            print(e)

# 获取当前目录下的文件和文件夹名称
def GetFileName(path):
    dirs = os.listdir(path)
    return dirs

# 计算数据库密码
def calculate_md5(string):
    md5_hash = hashlib.md5()
    md5_hash.update(string.encode('utf-8'))
    return md5_hash.hexdigest()

# uin 是生成数据库密码的两个参数之一,存储在auth_info_key_prefs.xml中
def GetUin(path):
    print(path)
    uin=""
    with  open(path, 'r', encoding='UTF-8') as file_obj:
        lines = file_obj.readlines()
        for line in lines:
            if "auth_uin" in line:
                uin=re.compile('(?<=value=").*?(?=")').findall(str(line))[0]
    print(uin)
    return uin

# 获取数据库的密码
def GetKey(path):
    # 生成IME列表,IME是生成数据库密码的两个参数中的另一个参数
    if not os.path.exists("IMELists.txt"):
        IMELists=["1234567890ABCDEF"]
        order=1
        while order==1:
            order=int(input("请输入要执行的指令:\n1.手动输入IME\t2.使用默认IME并停止输入\n:"))
            if order==1:
                IME=str(input("请输入IME号:\n"))
                IMELists.append(IME)
        with open("IMELists.txt", 'a', encoding='UTF-8') as file_obj:
            for IME in IMELists:
                file_obj.write(IME+"\n")
    lines=[]
    result=[]
    # 计算数据库的密码,数据库密码的计算方式为 IME+UIN 取MD5前七位
    with  open("IMELists.txt", 'r', encoding='UTF-8') as file_obj:
        lines = file_obj.readlines()
    for line in lines:
        uin=GetUin(path)
        IME=str(line).strip()
        key=calculate_md5(IME+uin)
        result.append(key[0:7])
    return result

# 递归遍历当前目录,寻找数据库文件以及auth_info_key_prefs.xml
def Visit(path):
    global sqlkeys
    if os.path.isdir(path):
        path=path+'/'
        try:
            dirs=GetFileName(path)
            for dir in dirs:
                new_path=path+dir
                Visit(new_path)
        except Exception as e:
            print(e)
    else:
        if "auth_info_key_prefs.xml" in path:
            sqlkeys=GetKey(path)
            for key in sqlkeys:
                print("微信数据库密码可能为:", key)
        if "EnMicroMsg.db"==path[-13:]:
            databasepath.append(str(path).replace("./",""))
            path=str(path).replace("./","")
            print("微信聊天记录存储位置为:",path)

if __name__ == '__main__':
    Visit(".")
    for i in range(0,len(databasepath)):
        path=databasepath[i]
        DecodeDataBase(path,i)
    input("键入任意内容回车后结束运行!")

将 解密.py 存储至解压缩文件存储的目录下

手机微信聊天记录导出_第1张图片
运行 解密.py
运行后会生成 数字_Decode.db,这就是我们微信聊天记录解密后的sqlite文件了
手机微信聊天记录导出_第2张图片

使用数据库查询工具打开解密后的文件

Navicat、DataGrip或者其他数据库查询工具都是可以打开的
推荐使用DataGrip,查看起来比较友好

比较重要的数据存放在以下表中

手机微信聊天记录导出_第3张图片

执行如下SQL 就可以查询聊天记录了

SELECT iif(iif(
               iif(talker like "%chatroom%", "群聊", "其他") = "其他" and talker  not like "gh_%", "朋友",
               iif(talker like "%chatroom%", "群聊", "其他"))="其他"
       and talker like "gh_%","公众号",iif(
               iif(talker like "%chatroom%", "群聊", "其他") = "其他" and talker not like "gh_%", "朋友",
               iif(talker like "%chatroom%", "群聊", "其他"))) as 聊天类型,
       iif(conRemark !="",conRemark,nickname) as 用户名称,
       content as 聊天内容,
       DATETIME(createTime / 1000, 'unixepoch') as 时间
from rcontact,
     message
WHERE message.talker = rcontact.username
order by 聊天类型,用户名称,时间;

手机微信聊天记录导出_第4张图片

导出查询结果

手机微信聊天记录导出_第5张图片
手机微信聊天记录导出_第6张图片
最终的结果就是这样的
手机微信聊天记录导出_第7张图片

你可能感兴趣的:(微信)