劫持微信聊天记录并分析还原 —— 访问数据库并查看聊天记录(五)

- 本工具设计的初衷是用来获取微信账号的相关信息并解析PC版微信的数据库。
- 程序以 Python 语言开发,可读取、解密、还原微信数据库并帮助用户查看聊天记录,还可以将其聊天记录导出为csv、html等格式用于AI训练,自动回复或备份等等作用。下面我们将深入探讨这个工具的各个方面及其工作原理。
- 本项目仅供学习交流使用,严禁用于商业用途或非法途径,任何违反法律法规、侵犯他人合法权益的行为,均与本项目及其开发者无关,后果由行为人自行承担。
- 创作不易,请动动您发财的小手点点赞并收藏,您的支持是咱敲键盘的动力。
【完整演示工具下载】
https://download.csdn.net/download/qq_39190622/89958183
https://download.csdn.net/download/qq_39190622/89958183
我们接着上一篇文章《劫持微信聊天记录并分析还原 —— 数据库结构讲解(四)》继续演示与讲解如何访问微信合并后的数据库并利用程序自带的网页UI来查看PC端微信的聊天记录,包括实时消息的获取等。
详细命令:
dbshow -merge "C:\Users\admin\AppData\Local\Temp\wxdb_all.db" -wid "C:\Users\admin\Documents\WeChat Files\wxid_b*************1"
- -merge 为指定合并后的微信数据库路径
- - wid 为微信用户帐号文件目录(用于显示图片)


运行命令后程序会自动打开网页UI。

此时我们点击“聊天查看”功能是无法看到聊天数据的,首次使用我们需要先将程序初始化设置。

依次点击右下角“更多设置” - “初始化设置” - “自动解密已登录微信”

选择已登录的微信(支持多个微信查看)


并耐心等待提示成功后(加载的时间根据数据量的大小而定),我们再次点击“聊天查看”功能。

此时所有该帐号下最近的聊天数据即可一一查看,但这些数据并不会实时显示,如果需要获取实时聊天数据,我们还需要手动点击聊天记录框右上角“实时消息”。


等待提示成功后,我们刷新一下页面即可查看实时聊天记录。
部分现实代码:
# -*- coding: utf-8 -*-#
# -------------------------------------------------------------------------------
# Name: __init__.py
# Description:
# Author: Rainbow
# Date: 2024/11/09
# -------------------------------------------------------------------------------
import os
import subprocess
import sys
import time
import uvicorn
import mimetypes
import logging
from logging.handlers import RotatingFileHandlerfrom uvicorn.config import LOGGING_CONFIG
from fastapi import FastAPI, Request, Path, Query
from fastapi.staticfiles import StaticFiles
from fastapi.exceptions import RequestValidationError
from starlette.middleware.cors import CORSMiddleware
from starlette.responses import RedirectResponse, FileResponsefrom .utils import gc, is_port_in_use, server_loger
from .rjson import ReJson
from .remote_server import rs_api
from .local_server import ls_apifrom pywxdump import __version__def gen_fastapi_app(handler):app = FastAPI(title="wxdump", description="微信工具", version=__version__,terms_of_service="https://www.chwm.vip",contact={"name": "Rainbow", "url": "https://www.chwm.vip"},license_info={"name": "MIT License","url": "https://www.chwm.vip"})web_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "ui", "web") # web文件夹路径# 跨域origins = ["http://localhost:5000","http://127.0.0.1:5000","http://localhost:8080", # 开发环境的客户端地址"# "http://0.0.0.0:5000",# "*"]app.add_middleware(CORSMiddleware,allow_origins=origins, # 允许所有源allow_credentials=True,allow_methods=["*"], # 允许所有方法allow_headers=["*"], # 允许所有头)@app.on_event("startup")async def startup_event():logger = logging.getLogger("uvicorn")logger.addHandler(handler)# 错误处理@app.exception_handler(RequestValidationError)async def request_validation_exception_handler(request: Request, exc: RequestValidationError):# print(request.body)return ReJson(1002, {"detail": exc.errors()})# 首页@app.get("/")@app.get("/index.html")async def index():response = RedirectResponse(url="/s/index.html", status_code=307)return response# 路由挂载app.include_router(rs_api, prefix='/api/rs', tags=['远程api'])app.include_router(ls_api, prefix='/api/ls', tags=['本地api'])# 根据文件类型,设置mime_type,返回文件@app.get("/s/{filename:path}")async def serve_file(filename: str):# 构建完整的文件路径file_path = os.path.join(web_path, filename)file_path = os.path.abspath(file_path)# 检查文件是否存在if os.path.isfile(file_path):# 获取文件 MIME 类型mime_type, _ = mimetypes.guess_type(file_path)# 如果 MIME 类型为空,则默认为 application/octet-streamif mime_type is None:mime_type = "application/octet-stream"server_loger.warning(f"[+] 无法获取文件 MIME 类型,使用默认值:{mime_type}")if file_path.endswith(".js"):mime_type = "text/javascript"server_loger.info(f"[+] 文件 {file_path} MIME 类型:{mime_type}")# 返回文件return FileResponse(file_path, media_type=mime_type)# 如果文件不存在,返回 404return {"detail": "Not Found"}, 404# 静态文件挂载# if os.path.exists(os.path.join(web_path, "index.html")):# app.mount("/s", StaticFiles(directory=web_path), name="static")return appdef start_server(port=5000, online=False, debug=False, isopenBrowser=True,merge_path="", wx_path="", my_wxid="", ):"""启动flask:param port: 端口号:param online: 是否在线查看(局域网查看):param debug: 是否开启debug模式:param isopenBrowser: 是否自动打开浏览器:return:"""work_path = os.path.join(os.getcwd(), "wxdump_work") # 临时文件夹,用于存放图片等 # 全局变量if not os.path.exists(work_path):os.makedirs(work_path, exist_ok=True)server_loger.info(f"[+] 创建临时文件夹:{work_path}")print(f"[+] 创建临时文件夹:{work_path}")# 日志处理,写入到文件log_format = '[{levelname[0]}] {asctime} [{name}:{levelno}] {pathname}:{lineno} {message}'log_datefmt = '%Y-%m-%d %H:%M:%S'log_file_path = os.path.join(work_path, "wxdump.log")file_handler = RotatingFileHandler(log_file_path, mode="a", maxBytes=10 * 1024 * 1024, backupCount=3)formatter = logging.Formatter(fmt=log_format, datefmt=log_datefmt, style='{')file_handler.setFormatter(formatter)wx_core_logger = logging.getLogger("wx_core")db_prepare = logging.getLogger("db_prepare")# 这几个日志处理器为本项目的日志处理器server_loger.addHandler(file_handler)wx_core_logger.addHandler(file_handler)db_prepare.addHandler(file_handler)conf_file = os.path.join(work_path, "conf_auto.json") # 用于存放各种基础信息auto_setting = "auto_setting"env_file = os.path.join(work_path, ".env") # 用于存放环境变量# set 环境变量os.environ["PYWXDUMP_WORK_PATH"] = work_pathos.environ["PYWXDUMP_CONF_FILE"] = conf_fileos.environ["PYWXDUMP_AUTO_SETTING"] = auto_settingwith open(env_file, "w", encoding="utf-8") as f:f.write(f"PYWXDUMP_WORK_PATH = '{work_path}'\n")f.write(f"PYWXDUMP_CONF_FILE = '{conf_file}'\n")f.write(f"PYWXDUMP_AUTO_SETTING = '{auto_setting}'\n")if merge_path and os.path.exists(merge_path):my_wxid = my_wxid if my_wxid else "wxid_dbshow"gc.set_conf(my_wxid, "wxid", my_wxid) # 初始化wxidgc.set_conf(my_wxid, "merge_path", merge_path) # 初始化merge_pathgc.set_conf(my_wxid, "wx_path", wx_path) # 初始化wx_pathdb_config = {"key": my_wxid, "type": "sqlite", "path": merge_path}gc.set_conf(my_wxid, "db_config", db_config) # 初始化db_configgc.set_conf(auto_setting, "last", my_wxid) # 初始化last# 检查端口是否被占用if online:host = '0.0.0.0'else:host = "127.0.0.1"if is_port_in_use(host, port):server_loger.error(f"Port {port} is already in use. Choose a different port.")print(f"Port {port} is already in use. Choose a different port.")input("Press Enter to exit...")return # 退出程序if isopenBrowser:try:# 自动打开浏览器url = f"http://127.0.0.1:{port}/"# 根据操作系统使用不同的命令打开默认浏览器if sys.platform.startswith('darwin'): # macOSsubprocess.call(['open', url])elif sys.platform.startswith('win'): # Windowssubprocess.call(['start', url], shell=True)elif sys.platform.startswith('linux'): # Linuxsubprocess.call(['xdg-open', url])else:server_loger.error(f"Unsupported platform, can't open browser automatically.", exc_info=True)print("Unsupported platform, can't open browser automatically.")except Exception as e:server_loger.error(f"自动打开浏览器失败:{e}", exc_info=True)time.sleep(1)server_loger.info(f"启动 Web 服务,host:port:{host}:{port}")print("[+] 请使用浏览器访问 http://127.0.0.1:5000/ 查看聊天记录")global appprint("[+] 如需查看api文档,请访问 http://127.0.0.1:5000/docs ")app = gen_fastapi_app(file_handler)LOGGING_CONFIG["formatters"]["default"]["fmt"] = "[%(asctime)s] %(levelprefix)s %(message)s"LOGGING_CONFIG["formatters"]["access"]["fmt"] = '[%(asctime)s] %(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s'uvicorn.run(app=app, host=host, port=port, reload=debug, log_level="info", workers=1, env_file=env_file)app = None__all__ = ["start_server", "gen_fastapi_app"]
相关文章:
劫持微信聊天记录并分析还原 —— 访问数据库并查看聊天记录(五)
本工具设计的初衷是用来获取微信账号的相关信息并解析PC版微信的数据库。程序以 Python 语言开发,可读取、解密、还原微信数据库并帮助用户查看聊天记录,还可以将其聊天记录导出为csv、html等格式用于AI训练,自动回复或备份等等作用。下面我们…...
vue3+vite 前端打包不缓存配置
最近遇到前端部署后浏览器得清缓存才能出现最新页面效果得问题 所以…按以下方式配置完打包就没啥问题了,原理很简单就是加个时间戳 /* eslint-disable no-undef */ import {defineConfig, loadEnv} from vite import path from path import createVitePlugins from…...
Dinky控制台:利用SSE技术实现实时日志监控与操作
1、前置知识 1.1 Dinky介绍 实时即未来,Dinky 为 Apache Flink 而生,让 Flink SQL 纵享丝滑。 Dinky 是一个开箱即用、易扩展,以 Apache Flink 为基础,连接 OLAP 和数据湖等众多框架的一站式实时计算平台,致力于流批一体和湖仓一体的探索与实践。 致力于简化Flink任务开…...
cannot locate symbol _ZTVNSt6__ndk119basic_ostringstreamIcNS_
编译正常,运行报错:cannot locate symbol _ZTVNSt6__ndk119basic_ostringstreamIcNS_ 简单记录: 1、编译ffmpeg so库,编译正常; 2、AndroidStudio建立项目,引用so库,编译正常,运行…...
SwiftUI开发教程系列 - 第4章:数据与状态管理
在 SwiftUI 中,数据与视图的绑定可以自动响应数据变化,实时更新 UI。SwiftUI 提供了多种数据管理方式,包括 @State、@Binding、@ObservedObject 和 @EnvironmentObject 等属性包装器。本章将逐一介绍这些属性包装器的用途及其最佳实践。 4.1 使用 @State 进行本地状态管理 …...
API接口:助力汽车管理与安全应用
随着汽车行业的飞速发展,越来越多的汽车管理技术被应用到交通安全和智慧交通系统中。在这一过程中,API接口起到了至关重要的作用。通过API接口,我们可以实现诸如车主身份验核、车辆信息查询等功能,从而为汽车智慧交通发展与安全应…...
聊一聊在字节跳动做项目质量改进的经验
引言 那一年,我刚毕业一年多,在第一家公司依然到了成长瓶颈期,一是不愿意频繁出差(做乙方的无奈);二是疲于每天重复的手工测试(团队缺乏技术氛围),技术上难有突破的机会…...
CSS基础概念:什么是 CSS ? CSS 的组成
什么是 CSS? CSS(层叠样式表,Cascading Style Sheets)是一种用于控制网页外观的样式表语言。通过定义样式规则,CSS 可以指定 HTML 页面中各个元素的显示方式,包括颜色、布局、字体、间距等。 与 HTML 专注…...
鸿蒙next版开发:ArkTS组件自定义事件分发详解
在HarmonyOS 5.0中,ArkTS提供了灵活的自定义事件分发机制,允许开发者对组件的事件进行细粒度的控制。自定义事件分发对于实现复杂的用户界面交互和提升用户体验至关重要。本文将详细解读如何在ArkTS中实现自定义事件分发,并提供示例代码进行说…...
计算机图形学论文 | 多边形中的点可见性快速算法
🦌🦌🦌读论文 🐨🐨摘要 针对点的可见性计算这一计算几何中的基础问题,提出一种支持任意查询点的可见多边形快速计算的基于多边形Voronoi图的点可见性算法。以与Voronoi骨架路径对应的Voronoi通道概念&…...
程序员输入问题
题目描述 程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以按一个退行符“”,以表示“”与它之前的字符…...
雨晨 23H2 Windows 11 企业版 IE VCDX 适度 22631.4445 (VIP有限开放版本)
雨晨 23H2 Windows 11 企业版 IE VCDX 适度 22631.4445 (VIP有限开放版本) 文 件: 雨晨 23H2 Windows 11 企业版 适度 22631.4445 install.wim 提 取 码: ZZLR 大 小: 2824999564 字节 修改时间: 2024年11月9日, 星期六, 05:33:05 MD5 : 9C88…...
如何评估焊机测试负载均衡性能
评估焊机测试负载均衡性能的方法有很多,以下是一些建议: 1. 确定测试目标:首先,需要明确评估焊机测试负载均衡性能的目标。这可能包括提高生产效率、降低能耗、减少设备故障率等。明确目标有助于选择合适的评估方法和指标。 2. …...
【卷积基础】CNN中一些常见卷积(1*1卷积、膨胀卷积、组卷积、深度可分离卷积)
文章目录 逐通道卷积(Pointwise Convolution,1x1 卷积)主要作用逐通道卷积的操作过程优势代码示例典型应用 膨胀卷积(Dilated Convolution)主要作用工作原理膨胀率 (dilation rate) 的定义代码实例膨胀卷积的优点 组卷…...
组合(DFS)
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2: 输入:n 1, k 1…...
linux盘扩容缩容
这里写目录标题 文件格式介绍问题:当根盘满了过后怎么办?解决方式: Xfs文件格式缩容扩容1. 备份2. 卸载home3. 缩容home(home盘为xfs文件格式)4. 扩容 /5. 恢复home备份 Ext4文件格式缩容扩容1. 备份(可选&…...
mysql中REPLACE语句使用说明
在 MySQL 中,REPLACE语句用于插入或更新数据。当插入的数据与表中的唯一索引或主键冲突时,它会先删除冲突的行,然后再插入新的数据。这是一种很方便的操作方式,可以简化在需要更新或插入数据时的代码逻辑。 它的语法结构与INSERT语…...
分享:文本转换工具:PDF转图片,WORD转PDF,WORD转图片
前言 鉴于网上大多数在线转换工具要么需要收费,要么免费后但转换质量极差的情况,本人开发并提供了PDF转图片,WORD转PDF,WORD转图片等的文本转换工具。 地址 http://8.134.236.93/entry/login 账号 账号:STAR001&a…...
mac crontab 不能使用问题简记
需要 crontab 有权限,如下截图设置 在访达上方【前往】-》【前往文件夹】输入/ 然后按 Command Shift . 显示隐藏文件,然后将 usr 放到左边栏 然后如下操作 系统设置中找到 隐私安全->完全访问磁盘 点击小锁头 点击号,将/usr/bin/c…...
Python 自动化测试应用
Python 自动化测试应用 目录 🧪 自动化测试基础与重要性📝 使用 pytest、unittest 进行运维脚本和工具的自动化测试🔧 自动化测试与 CI/CD 集成🛠 测试驱动开发(TDD)在运维脚本中的应用🐳 模拟…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
