Skip to content

Repository files navigation

NTQQ Media Cleaner

这是一个面向 Windows NTQQ 的群聊图片缓存清理工具。

仅限学习交流。 本项目涉及 QQ 本地数据库、缓存文件和第三方取 key/解密资料,仅供技术研究和个人数据整理使用。使用前请确认你有权访问和处理相关数据,并遵守当地法律、QQ 软件许可协议及上游项目许可证。

重要警告:请务必先备份。 数据库解密、文件匹配、移动和删除操作都有造成数据丢失、文件损坏或误操作的风险。请先退出 QQ,备份原始数据库和图片目录,优先使用副本测试;任何数据丢失、程序异常、系统故障或其他意外后果,均由使用者自行承担,项目作者不作任何明示或默示保证。

完整流程分为两阶段:

  1. 准备 Windows NTQQ 的原始加密数据库和对应的 key,并将数据库解密为普通 SQLite 数据库。
  2. 根据解密后的数据库和 QQ 图片缓存目录,识别指定群聊的图片文件,生成清单并在确认后清理。

本项目当前负责第 2 阶段。数据库取 key 和数据库解密请按照下面的 QQDecrypt 教程完成;项目中的 windows_ntqq_get_key.ps1 是取 key 的辅助脚本。

安全边界

  • 默认只扫描和预览,不删除文件。
  • 只处理 manifest 中列出的本地图片,不修改数据库和消息记录。
  • 使用 --extract-dir 时只复制图片,原始 QQ 缓存文件不会被移动或删除。
  • 删除阶段只读取已经确认的 manifest,不重新扫描数据库。
  • 删除前会重新检查文件是否存在以及文件大小是否变化;发生变化时跳过。
  • 建议先退出 QQ,备份原始数据库和图片目录,并在副本上操作。
  • 不要把原始数据库、解密数据库、key、聊天记录或 manifest 提交到版本库。

环境要求

  • Windows x86-64
  • Python 3.14 或更高版本
  • uv
  • 已安装的 Windows NTQQ

本项目的 pyproject.toml 会安装 protobuf 依赖。

第一步:准备原始数据库和 key

你需要两项输入:

  • 原始加密数据库:<你的原始 nt_msg.db 路径>
  • 对应的数据库 key:<你的数据库 key>

请参考 QQDecrypt 的 Windows NTQQ 教程获取它们:

也可以在 PowerShell 中运行项目内的脚本:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
.\windows_ntqq_get_key.ps1

脚本输出的 key 只供你本地使用,不要写入 README、源代码或提交到 Git。

第二步:解密数据库

按照“统一解密 NTQQ 数据库”教程,将下面两项填入解密脚本:

INPUT_DB = r"<你的原始 nt_msg.db 路径>"
DB_KEY = "<你的数据库 key>"

解密成功后,得到:

  • nt_msg_clear.db:去除 NTQQ 文件头后的中间文件
  • nt_msg_plain.db:最终的未加密 SQLite 数据库

后续清理步骤使用 nt_msg_plain.db,不要把原始加密数据库直接传给清理器。

第三步:预览图片清单

在本项目根目录执行。请将示例中的占位符替换成你自己的值:

uv run python -m ntqq_media_cleaner `
	--group "<你的QQ群号>" `
	--db "<你的 nt_msg_plain.db 路径>" `
	--cache-dir "<你的 QQ\Image\Group2 图片目录>" `
	--hash `
	--manifest "<你的清单文件路径>.json" `
	--extract-dir "<你的群聊图片查看目录>"

说明:

  • --group:要处理的QQ群号。
  • --db:第二步生成的未加密数据库。
  • --cache-dir:QQ 的 Image\Group2 图片缓存目录。
  • --hash:在文件名和大小匹配基础上使用 MD5 校验,扫描较慢但更可靠。
  • --manifest:预览结果保存位置。
  • --extract-dir:将匹配到的图片复制到一个独立文件夹,便于集中查看;原始缓存文件不变。

命令只扫描、保存清单并复制查看用图片,不会删除原始文件。请先打开提取目录查看照片,也可以直接在资源管理器中删除整个提取目录;这不会影响 QQ 原始缓存。若不需要复制图片,可以省略 --extract-dir。

第四步:全群图片统计

如果想查看 Group2 中哪些群聊匹配到的图片最多,可以使用只读统计模式。它不会生成 manifest,也不会复制、移动或删除任何文件:

uv run python -m ntqq_media_cleaner `
	--stats `
	--db "<你的 nt_msg_plain.db 路径>" `
	--cache-dir "<你的 QQ\Image\Group2 图片目录>" `
	--hash

输出列为:排名、群号、匹配本地文件数、图片总大小(MiB)、图片消息数。默认按匹配本地文件数从多到少排序;文件名和大小匹配不到时,--hash 会使用 MD5 继续匹配。

第五步:确认后清理

默认先移动到一个集中暂存目录,不直接永久删除。确认图片无误后,可以在 Windows 资源管理器中右键删除整个暂存目录,让 Windows 统一将它放入回收站:

uv run python -m ntqq_media_cleaner `
	--group "<你的QQ群号>" `
	--manifest "<你的清单文件路径>.json" `
	--stage-dir "<你的图片暂存目录>" `
	--delete

程序会要求输入确认字符串。此步骤会把 manifest 中的原始图片集中移动到暂存目录,成功移动后原位置不再保留这些文件;它不会直接调用 Windows 回收站。确认暂存目录中的图片后,再删除整个暂存目录即可。

旧参数 --trash-dir 仍可使用,它与 --stage-dir 完全等价,但推荐使用名称更准确的 --stage-dir。

如果你已经确认过匹配结果,不想保存或读取 manifest,也可以直接扫描后处理。此模式必须同时提供数据库和图片缓存目录,程序会先显示本次扫描到的文件数量,再要求输入确认字符串:

uv run python -m ntqq_media_cleaner `
	--group "<你的QQ群号>" `
	--db "<你的 nt_msg_plain.db 路径>" `
	--cache-dir "<你的 QQ\Image\Group2 图片目录>" `
	--hash `
	--stage-dir "<你的图片暂存目录>" `
	--delete

直接处理模式不会读取或生成 manifest。若省略 --cache-dir,程序会拒绝执行,避免在没有重新扫描依据时误处理文件。

需要由程序永久删除时,额外加上 --permanent,并完成更严格的确认:

uv run python -m ntqq_media_cleaner `
	--group "<你的QQ群号>" `
	--manifest "<你的清单文件路径>.json" `
	--delete `
	--permanent

当前范围

  • 已支持:从 group_msg_table 识别群图片消息,按文件名、大小和可选 MD5 匹配 Image\Group2 文件,保存 manifest,并安全移动或删除匹配文件。
  • 当前不负责:从 QQ 客户端复制原始数据库、自动获取 key、执行完整数据库解密、恢复无法匹配到本地文件的图片。
  • 原始数据库和 key 的获取、数据库解密格式及版本兼容性以 QQDecrypt 教程为准。

许可证与第三方归属

数据库 key 提取脚本和数据库解密流程参考:

本项目自己的媒体扫描、统计和清理代码采用 GNU GPLv3,完整条款见 LICENSE。

数据库 key 提取脚本和解密流程来自外部项目,不能将其默认为本项目原创代码。windows_ntqq_get_key.ps1 遵循其上游项目的 CC BY-NC-SA 4.0 条款,不因本项目包含 GPLv3 而改变;相关来源、许可证和发布注意事项见 NOTICE.md。

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages