前言
不知道你们是不是和我一样,QQ加了不少的群,基本是加了就不看的。
有一些水群又水得厉害,收进群助手了,但没有屏蔽信息,不知道不觉间,就堆了一堆的图片。
而QQ的删除聊天记录,就真的只是删除聊天记录,群里面图片还是会留在聊天记录的文件夹里面。
这就很麻烦了,你又分不清哪个群的图片,把图片全删除了,又有那么几个群是想保留图片的。
刚好,腾讯最近出了个新的NT架构的QQ,我本来期待他能像微信一样按群来删除图片,结果还是不行。
搜索一番,找到两个项目,分别用来解密和解码QQ的数据库,然后发现能从数据库的群聊天信息拿到图片路径。
那就好办了,写了几个脚本来实现按群来删除图片。
GitHub项目地址:
tjxwork/qq_db_export_group_image_path_and_move_or_delete: QQ数据库导出群图片路径并移动或者删除(github.com)
视频教程地址:
其实是先有的视频教程(演示),这篇文章算是图文教程,会比视频教程详细一点。
删除指定QQ群的图片【tjxwork】_哔哩哔哩_bilibili
建议
如果你是出于:“想要清理不看的QQ群的群图片,并且希望能一直保持聊天记录比较“干净”。” 的目的。
那么,新版的NTQQ暂时不建议使用,因为目前只有旧版的QQ才能屏蔽接受群图片(看的时候可以手动点击加载)
QQ的相关信息
QQ的聊天记录路径
聊天记录的配置文件存放在:C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini
同一台电脑下,所有用户使用同一个配置文件。
例如,当聊天记录存放在D:\Chats\Tencent Files
时,UserDataInfo.ini
的内容为:
1[UserDataSet]
2UserDataSavePathType=2
3UserDataSavePath=D:\Chats\Tencent Files
QQ配置文件的相关信息可以看之前这篇:免登录,用脚本提前修改微信、企业微信、QQ 的聊天路径 - tjxblog
NT版本QQ暂时无法修改记录路径,它直接沿用了旧版QQ的路径设定。
QQ的图片文件结构
例如,当聊天记录存放在D:\Chats\Tencent Files
,QQ账号是303xxx445
时
1存放所有图片的文件夹
2D:\Chats\Tencent Files\303xxx445\Image
3
4存放个人对个人聊天图片的文件夹
5D:\Chats\Tencent Files\303xxx445\Image\C2C
6
7存放群聊天图片的文件夹
8D:\Chats\Tencent Files\303xxx445\Image\Group
9D:\Chats\Tencent Files\303xxx445\Image\Group2
10
11有两个,是不同时期的,里面的结构也不太一样,不知道腾讯怎么搞的屎山代码。
移动脚本要处理的是,聊天记录文件夹的 Image 下面的 Group Group2 两个文件夹
新版NT架构QQ的相关信息
当你使用首次使用NTQQ的时候,会提示导入数据库。
其实就是把旧的 聊天记录文件夹\QQ账号\Msg3.0.db
导入了到了新的 聊天记录文件夹\QQ账号\nt_qq\nt_db\nt_msg.db
这期间会提示优化过程,新的数据库应该是和旧数据库不一样的。
使用新的NTQQ的时候,会在原来的聊天记录路径下建立聊天记录路径\QQ账号\nt_qq\
文件夹
接收到的图片及各类文件都是存放在新的路径下面。
各种数据库:聊天记录路径\QQ账号\nt_qq\nt_db
图片之类的:聊天记录路径\QQ账号\nt_qq\nt_data
图片的存放结构和Windows版微信类似,会按年-月份
的方式来区分。
但是NTQQ目前仍然做不到像微信那样,按群来删除图片之类的文件。
聊天记录路径\QQ账号\nt_qq\nt_data\Pic
的结构:
前置项目及所需工具
解密QQ数据库 qq-win-db-key
Young-Lord/qq-win-db-key: Windows QQ 聊天数据库解密 (github.com)
解码QQ数据库 qq_msg_decode
saucer-man/qq_msg_decode: 解码qq聊天数据库 (github.com)
修复QQ数据库 SQLite-Tools
这里用的是 sqlite-tools-win32-x86-3420000
操作流程
为了方便描述,假设下载完上面2个项目及SQLite-Tools后,都带文件夹解压到和我的脚本文件在同一级,为当前目录,文件结构如下:
我的项目地址:
tjxwork/qq_db_export_group_image_path_and_move_or_delete: QQ数据库导出群图片路径并移动或者删除(github.com)
以及:
你已经安装好Python,并且添加到系统环境变量。(安装时,勾选 PATH
选项)
Python 脚本运行时,提示缺少什么模块的时候,你要学会 pip install xxxxxx
PowerShell 已允许脚本运行 (请管理员权限打开 PowerShell 运行: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
)
在资源管理器的目录空白处,按着Shift + 鼠标右键
,点击 在此处打开 PowerShell 窗口
就可以在当前目录直接打开PowerShell
如果有不是很清楚的地方,请搭配视频版演示食用。
解密QQ数据库
先去你的聊天记录文件夹下面备份 Msg3.0.db
先打开QQ,出现登陆窗口,先不要点击登陆。
在当前目录打开PowerShell,运行解密脚本 \qq-win-db-key-master\main.py
1PS > python .\qq-win-db-key-master\main.py
2
3# 实际的提示路径是 "PS D:\qq_db_export_group_image_path_and_move_or_delete-main> "
4# 为简短显示,全文省略为 "PS >" 下文不再提示
然后点击QQ的登陆按钮。
耐心等待登陆,登陆成功后,脚本也随之运行结束。
此时当前目录下出现一个解密完成的 Msg3.0.db_0_xxxxxxxxxx.db
数据库文件。
QQ可以退出了,后面用不到它了。
修复QQ数据库
在当前目录打开PowerShell,运行 SQLite-Tools
1PS > .\sqlite-tools-win32-x86-3420000\sqlite3.exe
使用SQLite-Tools
打开 Msg3.0.db_0_xxxxxxxxxx.db
1sqlite> .open Msg3.0.db_0_xxxxxxxxxx.db
检查是否出错
1sqlite> .selftest
不出错就输入 .quit
退出 。
如提示出错的话,就继续处理,导出为 temp.sql
临时的SQL文件。
1sqlite> .output temp.sql
2sqlite> .dump
3sqlite> .quit
运行完成后,当前目录下出现一个 temp.sql
文件。
modify_temp_sql_last_line.py
脚本功能及默认参数:修改 temp.sql
文件的最后一行为 COMMIT;
运行 modify_temp_sql_last_line.py
脚本
1PS > python .\modify_temp_sql_last_line.py
运行完成,可以看到 temp.sql
文件的修改时间发现变化。
在当前目录打开PowerShell,运行 SQLite-Tools
创建新数据库 Msg.db
并导入 temp.sql
1PS > .\sqlite-tools-win32-x86-3420000\sqlite3.exe
2sqlite> .open Msg.db
3sqlite> .read temp.sql
4sqlite> .quit
等待运行完成后,当前目录下出现一个修复完成的 Msg.db
文件。
解码QQ数据库
使用文本编辑器打开 \qq_msg_decode-main\index.py
文件,
在大约534
行处,修改为你的数据库路径,建议使用绝对路径。
例如:
1...
2conn = sqlite3.connect(r'D:\qq_db_export_group_image_path_and_move_or_delete-main\Msg.db')
3...
在当前目录打开PowerShell,运行解码脚本 \qq_msg_decode-main\index.py
1PS > python .\qq_msg_decode-main\index.py
此过程最为漫长,我10G左右的QQ数据库,跑了4小时20分钟。
脚本跑完后,Msg.db
的体积会变大,因为会在表里面多加一个字段,用于存放解码完成后的信息。
解码完成后的数据库结构如图:
导出群聊天记录的图片路径为CSV
regex_processing_img_path_to_csv.py
脚本功能及默认参数:
读取当前目录下的 Msg.db
,导出各个群聊天记录中的图片路径为csv格式,存放到当前目录下的 QQ_Group_CSV
文件夹下
1...
2# QQ聊天记录数据库的路径
3qq_msg3_db_path = "Msg.db"
4
5# QQ聊天记录相关csv的存放路径
6csv_folder_path = "QQ_Group_CSV"
7...
运行 regex_processing_img_path_to_csv.py
脚本。
会将数据库内的群消息中的图片路径,以群分类,以数据库中的表名为命名,导出为csv文件。
1PS > python .\regex_processing_img_path_to_csv.py
运行完成后,当前目录下出现一个 QQ_Group_CSV
文件夹
其中包含若干数量的,格式类似 group_123456789.csv
的CSV文件。
注意:CSV文件名,其数字部分并不100%和QQ群的群号对应!
以聊天记录查询对应的群的数据库表名
由于在QQ数据库里面存储的群消息的表的名称,并不是绝对和QQ群的群号是一致对应的。
再加之,有部分还能在QQ消息管理器中查看聊天记录的QQ群,已经被封禁,无法查看其群号。
所以需要通过查询来确定,QQ群与数据库中的表的关系。
query_chat_come_from_qq_group.py
脚本功能及默认参数:
连接到当前目录下的 Msg.db
数据库,使用聊天记录来查询确定其在数据库中对应的表名。
1...
2# QQ聊天记录数据库的路径
3qq_msg3_db_path = "Msg.db"
4...
运行 query_chat_come_from_qq_group.py
脚本
1PS > python .\query_chat_come_from_qq_group.py
2获取到: 94 个 QQ 群
3
4输入 quit 退出,请输入聊天文本:
复制消息管理器中的文本内容,粘贴到PowerShell窗口中查询,复制内容请尽量具有独特性,防止返回内容过多。
查询效果如图:
定义移动文件脚本参数来移动图片
move_csv_img_path.ps1
的脚本功能:
按脚本中定义黑白名单的群列表、运行模式、时间线,来移动对应群csv文件中记录的图片,按群来分类,移动到指定的目录下。
move_csv_img_path.ps1
的脚本参数部分:
1...
2# QQ聊天记录路径
3$qq_chats_path = "D:\Chats\Tencent Files\303xxx445"
4
5# 存放移动后的QQ群的图片的指定目录,例如:$qq_chats_path\Image_Group_Move_Img
6$qq_group_move_img_folder_path = "$qq_chats_path\Image_Group_Move_Img"
7
8# 数据库导出的QQ群的图片路径csv文件夹
9$qq_group_csv_folder_path = "C:\Users\xin\Desktop\QQ\QQ_Group_CSV"
10
11# 避免操作此时间线后的图片
12$time_line = Get-Date "2023-07-08 12:00:00"
13
14# 黑名单运行模式? $ture:黑名单,$False:白名单
15$blacklist_operation_mode = $False
16
17# 注意! QQ群的名字,和数据库里面的群表名,两者的名字不一定是一样的。
18# 请配合 query_chat_come_from_qq_group.py 查询聊天记录来确定在数据库的表名,复制到以下对应列表
19
20# qq群 移动图片 黑名单
21$qq_group_blacklist = @("group_552xxx835")
22
23# qq群 移动图片 白名单
24$qq_group_whitelist = @("group_206xxx7139", "group_777xxx650", "group_609xxx153", "group_806xxx657")
25...
请自行修改脚本中的参数为自己的实际路径。
建议移动后的存放目录,设置为聊天记录同分一区下面,能极大地节省移动时间,同分区移动文件只是修改文件系统中的路径指向而已。
move_csv_img_path.ps1
的脚本运行逻辑:
1# 只处理修改时间在时间线之前、聊天记录文件夹的 Image 下面的 Group Group2 这两个文件夹的图片
2
3# 白名单模式效果:
4# 保留白名单内的群聊天图片;
5# 其他已知的群图片,按群归类,保留文件夹结构移动到别的地方;
6# 没有对应csv记录的群图片,移动到 group_unknown 文件夹
7
8# 黑名单模式效果:
9# 黑名单内的群,按群归类,保留文件夹结构移动到别的地方;
10# 其余所有图片文件保持在原地不动。
11
12# 由于不同QQ群是有可能使用同一张图片,特别是表情包。
13# 所以实际的处理流程是:
14
15# 先把 聊天记录文件夹的 Image 下面的 Group Group2 两个文件夹,移动到聊天记录文件夹内的 Image_Group_Temp 临时文件夹内
16# 将修改时间在时间线之后的图片文件,移动回原来的位置
17
18# 黑名单分支流程:
19# 把 非黑名单 的csv对应的图片 从 Image_Group_Temp 移动回原来的位置
20# 把 黑名单 csv对应的图片,从 Image_Group_Temp 移动到指定目录下(例如:Image_Group_Move_Img)对应的群文件夹(group_xxxxxx)
21# 然后把剩下的图片再全部移动回原来的位置
22
23# 白名单流程:
24# 然后把 白名单 csv对应的图片,从 Image_Group_Temp 移动回原来的位置
25# 然后把 非白名单 有csv对应的图片,从 Image_Group_Temp 移动到指定目录下(例如:Image_Group_Move_Img)对应的群文件夹(group_xxxxxx)
26# 再剩下的图片,移动到指定目录下的 group_unknown 文件夹
27
28# 每次在移动文件的时候,都会在聊天记录文件夹内的 Image_Group_Temp 下生成每次移动文件的操作日志。
29# 日志记录了时间,旧的完整路径,新的完整路径,理由上可以通过读取日志记录来逆转移动操作。
运行move_csv_img_path.ps1
脚本
1PS > move_csv_img_path.ps1
返回内容如图:
移动日志中出现大量错误的原因
由于存在表情包之类的复用图片,同一个图片路径,可能会在多个群CSV里面反复出现。 从而导致移动脚本读取第1个群CSV正常移走图片后,移动脚本再读取到后续的群CSV文件中再出这条图片路径, 脚本再次移动该图片路径时找不到图片,就会在日志中记录为失败。此部分内容可以看看视频版演示。
效果
我最后清掉了183G的图片,最多那个群35G……
留下的4个群只有3.32G。
原文作者:tjxwork
原文链接:https://www.tjxblog.com/blog/2023-0009
发布时间:2023-07-22
评论