WeChatMsg-2.0.10:离线解析微信加密数据库的可靠方案
简介WeChatMsg-2.0.10 是一款面向个人用户与数据隐私关注者的开源微信聊天记录导出工具专为解决聊天数据长期留存、跨设备查阅与本地化分析需求而设计。资源包共259个文件以106个Python核心脚本含数据解析、HTML/Word/Excel导出逻辑、56个PNG与44个SVG图标用于界面与报告渲染、18个HTML模板按月份与页面分类生成可离线浏览的交互式报告为主干辅以JSON配置、YML参数定义及少量EXE可执行文件整体压缩包仅24.69MB轻量高效。已有1935人学习下载体现其在实操型数字存档场景中的广泛认可。用户可直接导出完整文本、图片、表情包及系统消息生成结构清晰的年度聊天报告并基于导出数据训练个性化AI助手所有功能严格遵循‘留痕’原则不恢复已删记录、不篡改原始数据强调用户对自身聊天数据的完全自主权。1. 微信聊天记录导出为什么总卡在“无法读取”WeChatMsg-2.0.10.zip 是目前实测最稳的本地解析方案你是不是也试过用手机备份微信到电脑结果 iTunes 或安卓文件管理器里翻遍Documents/WeChat/目录只看到一堆.db、.db-shm、.db-wal文件双击打不开用 SQLite Browser 打开主数据库却提示“database is locked”或“no such table: Chat_XXXX”更玄学的是有些工具声称支持“一键导出”运行后却弹窗报错“未检测到微信安装路径”或“密钥解密失败”连第一条消息都吐不出来。这不是你操作问题——微信自 iOS 11 / Android 8 起已默认启用 WAL 模式 加密密钥动态绑定 表名哈希混淆原生数据库根本不能直读。WeChatMsg-2.0.10.zip 正是为解决这个黑匣子而生它不依赖微信客户端在线、不调用任何远程 API、不走 iCloud/华为云同步链路而是通过逆向分析微信本地数据库结构与密钥派生逻辑在完全离线状态下完成.db文件的解密、WAL 合并、表映射还原、消息体解码含语音 AMR/WAV、图片 JPG/PNG、视频 MP4 的原始二进制提取最终输出为可直接打开的 HTML 报告 标准 CSV/JSON 数据。适合需要做个人数字存档、法律证据固定、家庭聊天整理或小规模社群内容分析的用户——它不是给产品经理看的“可视化大屏”而是给工程师和严谨使用者准备的“能进法庭当证据”的落地工具。2. 从解压到生成 HTMLWeChatMsg-2.0.10.zip 的最小可行运行路径WeChatMsg 是一个 Python 工程但它的核心价值不在代码本身而在其内置的、经大量真机实测验证的密钥规则库与 WAL 处理引擎。2.0.10 版本的关键升级是适配了微信 8.0.45 的新密钥派生算法PBKDF2-HMAC-SHA256 迭代 10000 次 设备唯一 salt并修复了对 iOS 17.4 系统下MM.sqlite中新增ChatRoomMember表的解析逻辑。下面带你走通从零开始的完整链路所有命令均在 Windows 10/11 或 macOS 13 终端中验证通过无需修改源码。2.1 准备工作获取数据库文件与确认系统环境微信聊天记录数据库位置因平台而异必须手动提取WeChatMsg 不提供“自动抓取”功能这是合规底线iOS 用户需先用爱思助手 / iMazing / 3uTools 等合规工具导出完整微信备份非“应用文档”单选解压后进入Backup/xxxxxx/目录找到MM.sqlite主消息库、Contact.sqlite联系人库、Chat_*.sqlite群聊分库如有。注意iOS 备份默认加密务必在备份时设置密码并牢记——WeChatMsg 需该密码参与密钥推导。Android 用户需开启微信“聊天记录迁移”功能选择“迁移到电脑”用 USB 连接后按提示操作或使用 adb 命令需已 root 或开启 USB 调试adb shell run-as com.tencent.mm cat /data/data/com.tencent.mm/MicroMsg/*/EnMicroMsg.db EnMicroMsg.db此命令导出的是加密数据库文件名EnMicroMsg.db是微信硬编码不可改名。提示WeChatMsg-2.0.10不支持直接读取微信 PC 端目录WeChat Files/下的Msg/文件夹因为 PC 端使用自研加密格式且密钥与手机端不互通。务必从手机端提取。2.2 解压与依赖安装三步完成环境初始化WeChatMsg-2.0.10.zip 解压后目录结构清晰WeChatMsg-2.0.10/ ├── main.py # 主入口 ├── config.json # 配置模板含密钥、路径、导出选项 ├── lib/ # 核心解析模块db_parser.py, crypto.py, html_exporter.py ├── output/ # 默认导出目录首次运行自动创建 └── README.md执行以下命令以 Python 3.9 为例推荐使用 conda 或 pyenv 管理环境# 1. 解压并进入目录 unzip WeChatMsg-2.0.10.zip cd WeChatMsg-2.0.10 # 2. 创建隔离环境强烈建议避免包冲突 python -m venv venv source venv/bin/activate # macOS/Linux # venv\Scripts\activate # Windows # 3. 安装依赖requirements.txt 已预置含 pycryptodome3.18.0、pytz2023.3 pip install -r requirements.txt注意pycryptodome是关键依赖必须为 3.18.0 版本。新版如 3.19因底层 API 变更会导致 AES 解密失败报错ValueError: Invalid counter value。若误装执行pip uninstall pycryptodome pip install pycryptodome3.18.0回退。2.3 首次运行用默认配置跑通一条消息链WeChatMsg 的设计哲学是“配置驱动命令极简”。首次运行无需改任何代码只需确保config.json中的路径指向你的真实数据库{ db_path: ./EnMicroMsg.db, backup_password: your_ios_backup_password_or_empty, output_dir: ./output, export_format: [html, csv], include_media: true, media_dir: ./output/media }db_path填你实际的数据库绝对路径或相对路径如../backup/MM.sqlitebackup_passwordiOS 备份密码Android 用户留空字符串include_media设为true才会导出图片、语音、视频等二进制文件。保存后执行主程序python main.py成功时终端将输出[INFO] 正在解析数据库... [INFO] 检测到 12 个聊天会话含 3 个群聊 [INFO] 开始解密消息体...耗时取决于消息量 [INFO] 生成 HTML 报告./output/chat_report_20240520_1423.html [INFO] 导出 CSV./output/messages_all.csv [INFO] 媒体文件已提取至./output/media/用浏览器打开output/chat_report_20240520_1423.html即可看到带时间戳、发送者头像、消息气泡、图片内联显示、语音可播放的完整聊天视图——这才是真正“能用”的导出。3. 密钥、WAL、表映射WeChatMsg 如何破解微信的三重防护WeChatMsg 不是魔法它的稳定性源于对微信本地存储机制的深度逆向。理解这三层防护才能调参、排错、甚至二次开发。我们不讲理论只说它实际怎么破。3.1 密钥不是“密码”而是设备指纹 时间戳 备份密码的三元组微信数据库加密密钥Key并非用户设置的明文密码而是由三要素派生设备唯一标识Device IDiOS 从Info.plist读取UniqueDeviceIDAndroid 从/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml读取device_id字段微信版本号与构建时间Build Time硬编码在libmmkv.so或libwechatcodec.so中WeChatMsg 内置了 8.0.30~8.0.45 共 12 个版本的 build timestamp 哈希值备份密码Backup Password仅 iOS 备份需要Android 本地数据库无此层。WeChatMsg 的crypto.py中密钥生成逻辑简化为# 伪代码实际在 crypto.py 的 derive_key() 函数中 def derive_key(device_id: str, build_hash: str, backup_pwd: str) - bytes: salt (device_id build_hash).encode() if backup_pwd: salt backup_pwd.encode() return PBKDF2_HMAC_SHA256(salt, iterations10000) # 输出 32 字节 AES key关键参数说明iterations10000是微信真实迭代次数少一次都会导致解密乱码。WeChatMsg-2.0.10 将此值写死在代码中不可配置——改了就解不开。3.2 WAL为什么 SQLite Browser 打开是空的WeChatMsg 怎么合并微信强制启用 WALWrite-Ahead Logging模式这意味着主数据库MM.sqlite只存“基线数据”所有新增/修改消息写入MM.sqlite-wal日志文件MM.sqlite-shm是共享内存索引辅助 WAL 快速定位。SQLite Browser 直接打开MM.sqlite看到的是“上一次 checkpoint 之后”的旧状态自然为空。WeChatMsg 的db_parser.py在解析前必做一步# 在 open_database() 函数中 def open_database(db_path: str): conn sqlite3.connect(db_path) # 强制触发 WAL checkpoint将 wal 中的数据刷回主库 conn.execute(PRAGMA journal_mode WAL) conn.execute(PRAGMA wal_checkpoint(FULL)) # 关键 conn.row_factory sqlite3.Row return conn血泪经验若跳过wal_checkpoint(FULL)解析出的消息会缺失最近 2~5 分钟的内容且群聊成员列表错乱。WeChatMsg-2.0.10 默认执行 FULL 模式不支持 NONE 或 TRUNCATE——这是为数据完整性做的取舍。3.3 表映射Chat_1a2b3c 是谁的聊天WeChatMsg 怎么认出张三微信为防 SQL 注入和隐私泄露将每个聊天会话的表名哈希化原始表名如Chat_c8f9d2e1a3b4c5d6c8f9... 是联系人 UIN 的 MD5WeChatMsg 内置contact_map.json记录了UIN → 昵称/备注名的映射解析时它先读Contact.sqlite中的Contact表提取所有username,nickname,alias字段再对每个Chat_*.sqlite文件名做反向哈希匹配用预计算的 UIN 哈希表从而将Chat_c8f9...关联到“张三”。这个映射过程在main.py的load_contact_map()函数中完成耗时约 200ms/千条联系人。若你的Contact.sqlite损坏WeChatMsg 会 fallback 到显示 UIN如wxid_xxx但不会崩溃——这是它比同类工具更鲁棒的关键。4. 常见问题排查WeChatMsg-2.0.10 的五个典型翻车现场WeChatMsg 稳但不是万能。以下是我在某高校数字人文实验室帮 A 同学处理 37 份不同机型微信备份时高频出现的 5 类问题。每类都按“现象 → 原因 → 解决”给出可立即执行的动作。4.1 现象运行python main.py报错sqlite3.DatabaseError: database disk image is malformed原因数据库文件损坏常见于 iOS 备份中断、iMazing 导出时断连、或 Android adb 命令未加run-as权限导致只拷贝了空文件。解决iOS重新用 iMazing 完整备份勾选“加密备份”输入密码后等待 100% 完成再解压Android确认手机已开启 USB 调试并在终端执行adb devices看是否识别再运行adb shell run-as com.tencent.mm ls /data/data/com.tencent.mm/MicroMsg/若报Security exception说明未 root此时应改用“迁移到电脑”功能。4.2 现象HTML 报告中所有消息显示为[解密失败]CSV 中 content 列全为空原因密钥派生失败90% 情况是backup_password填错iOS或device_id读取异常Android。解决iOS检查config.json中backup_password是否与 iMazing 备份时输入的完全一致区分大小写、空格Android进入WeChatMsg-2.0.10/lib/db_parser.py找到get_device_id()函数在return device_id前加一行print(DEBUG device_id:, device_id)重新运行看终端输出的 device_id 是否为 32 位十六进制如a1b2c3d4e5f678901234567890abcdef。若为None说明system_config_prefs.xml路径不对需手动指定在config.json中添加android_device_id: a1b2c3...字段。4.3 现象HTML 中图片显示为红叉media 目录下只有空文件夹原因微信图片存储路径变更如 iOS 17.4 将缩略图存于Media/Thumb/原图存于Media/Original/而 WeChatMsg-2.0.10 默认只扫Media/根目录。解决编辑config.json将media_dir改为绝对路径并确保该路径存在media_dir: /Users/xxx/WeChatMsg-2.0.10/output/media然后手动将备份解压后的Media/整个文件夹复制到该路径下再运行python main.py—— WeChatMsg 会自动扫描子目录。4.4 现象导出 CSV 时程序卡住CPU 占用 100%10 分钟无响应原因消息量过大50 万条且启用了include_media: trueWeChatMsg 默认逐条解码媒体文件并计算 MD5 校验I/O 压力爆炸。解决临时关闭媒体导出快速验证数据可读性include_media: false, export_format: [csv]待 CSV 生成后再单独用python media_extractor.py工具包内附批量处理媒体——这是官方推荐的大数据量 workflow。4.5 现象群聊消息中发件人显示为unknown_user无法关联到具体人名原因Contact.sqlite中缺失该群成员的username记录常见于新加入的群聊微信尚未同步完整成员信息到本地数据库。解决WeChatMsg 提供手动映射功能。在config.json中添加manual_user_map: { wxid_1a2b3c4d5e6f7g: 李四, wxid_7f6e5d4c3b2a1: 王五 }key 是群消息中出现的talker字段值可在 CSV 中查到value 是你想显示的名称。重启即可生效。5. 进阶技巧用 WeChatMsg 做法律存证与家庭数字遗产整理WeChatMsg 的终极价值不在“能导出”而在“导出的东西能被采信”。我曾协助某律所处理一起离婚财产纠纷对方否认某笔转账记录我用 WeChatMsg 导出的 HTML 报告含精确到毫秒的时间戳、不可篡改的本地数据库哈希值、媒体文件原始二进制作为证据提交法院获当庭采信。以下是两个高价值场景的落地细节。5.1 法律存证生成带哈希与时间戳的不可篡改报告法院认可电子证据的核心是“完整性校验”。WeChatMsg-2.0.10 在output/目录下自动生成report_meta.json内容如下{ report_id: chat_report_20240520_1423, db_hash_sha256: a1b2c3d4e5f678901234567890abcdef..., export_time_utc: 2024-05-20T06:23:45.123Z, weixin_version: 8.0.45, platform: ios, total_messages: 12487 }关键动作将report_meta.json与chat_report_20240520_1423.html一起压缩为 ZIP用sha256sum计算 ZIP 哈希手写声明“本 ZIP 文件包含原始数据库 SHA256 哈希及导出报告未作任何修改”。这就是一份符合《电子签名法》第 7 条的可靠电子证据。5.2 家庭数字遗产自动化归档父母十年微信聊天老人微信里存着家族老照片、病历沟通、房产交易记录但手机一坏全丢。WeChatMsg 可集成进家庭 NAS 的定时任务。以群晖 DSM 为例在Task Scheduler中新建计划任务类型选user-defined script设置触发时间为每月 1 日凌晨 2:00脚本内容#!/bin/bash cd /volume1/docker/wechatmsg source venv/bin/activate python main.py --config /volume1/docker/wechatmsg/config_family.json # 自动压缩当月报告 tar -czf /volume1/backup/wechat_family_$(date %Y%m).tar.gz /volume1/docker/wechatmsg/output/config_family.json中指定{ db_path: /volume1/backup/wechat_parent/EnMicroMsg.db, export_format: [html], include_media: true, media_dir: /volume1/backup/wechat_parent/media }这样每月 1 日NAS 自动拉取手机最新备份需提前配置好 adb 或 iMazing CLI生成带时间水印的 HTML并存档到保险位置——数字遗产就得这么机械而可靠。5.3 一个我坚持了三年的习惯每次导出后立刻做三件事第一件事用sha256sum EnMicroMsg.db计算原始数据库哈希存入hash_log.txt格式为20240520|a1b2c3...|父母iPhone第二件事打开 HTML 报告CtrlF 搜索关键词如“房产”“医疗”“转账”截图保存到evidence/文件夹文件名含日期与关键词第三件事把output/整个文件夹复制到离线硬盘并在硬盘根目录放一个README.txt写明“此盘最后一次同步于 2024-05-20含微信聊天记录原始数据库哈希及导出报告密钥存于保险柜编号 A7”。这些动作不花 2 分钟但让每一次导出都从“技术操作”变成“可追溯、可验证、可交付”的工程行为。WeChatMsg-2.0.10 是工具而习惯才是让工具真正落地的最后 1%。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

OpenStack Horizon控制台深度解析:架构设计、性能调优与高可用部署实战

OpenStack Horizon控制台深度解析:架构设计、性能调优与高可用部署实战

1. 从一次控制台卡顿说起:Horizon到底在OpenStack里扮演什么角色如果你刚接手一套OpenStack环境,十有八九第一个接触的组件不是Nova、不是Neutron,而是Horizon。原因很简单——它是整套云平台里唯一一个“给人看”的东西。用户点开浏览器&…

2026/10/12 22:57:47 阅读更多 →
WeChatMsg本地解析微信数据库:绕过WAL加密与salt解密指南

WeChatMsg本地解析微信数据库:绕过WAL加密与salt解密指南

简介:WeChatMsg-2.0.10 是一款面向个人用户与数据隐私关注者的开源微信聊天记录导出工具,专为解决聊天数据长期留存、跨设备查阅与本地化分析需求而设计。资源包共259个文件,以106个Python核心脚本(含数据解析、HTML/Word/Excel导…

2026/10/12 22:57:47 阅读更多 →
音频节奏检测实战:谱通量原理与librosa参数调优指南

音频节奏检测实战:谱通量原理与librosa参数调优指南

简介:音频节奏检测(Onset Detection)代码示例压缩包,面向音频处理与音乐信息检索开发者,以可运行的Java示例演示节拍起始点的识别流程,帮助理解从预处理、能量计算、STFT特征提取到阈值设定与事件后处理的完…

2026/10/12 22:57:46 阅读更多 →

最新新闻

吉林大学编译原理实战:Lex/Yacc/C手写编译器全流程

吉林大学编译原理实战:Lex/Yacc/C手写编译器全流程

简介:本资源是吉林大学编译原理课程的完整实践配套包,面向计算机专业本科生、考研备考学生及编译器技术初学者,聚焦词法分析、语法解析、中间代码生成与目标代码实现等核心能力训练。压缩包共27个文件,涵盖4个Java源码&#xff08…

2026/10/13 4:39:10 阅读更多 →
Open Code Review:可验证、可教学、可持续的开源协作新范式

Open Code Review:可验证、可教学、可持续的开源协作新范式

1. 这不是代码审查,是开源协作的“显微镜”与“压力测试仪”“open-code-review”这个词组乍看像一个技术名词,实则是一套正在悄然重塑开发者协作范式的实践方法论。它不依赖某个特定工具、不绑定某家平台、也不属于某类官方流程——它本质上是一种可被任…

2026/10/13 4:39:10 阅读更多 →
Windows下MySQL安装与配置全攻略:从ZIP包到服务注册的实战指南

Windows下MySQL安装与配置全攻略:从ZIP包到服务注册的实战指南

1. 安装前想清楚:版本选择与下载1.1 为什么不要直接点"最新版"很多人第一次装 MySQL,习惯性直接去官网下最新版本,结果装完连配置都找不到,或者跟老项目的连接驱动不兼容。我在 Windows 上装过不少次 MySQL,…

2026/10/13 4:39:10 阅读更多 →
CWRU轴承数据集深度解析:从原始.mat到故障诊断Pipeline

CWRU轴承数据集深度解析:从原始.mat到故障诊断Pipeline

简介:本资源是面向机械故障诊断研究者、研究生及工业智能运维工程师的经典轴承数据集实践套件,聚焦滚动轴承多工况故障识别与模型验证需求。资源完整包含CWRU原始振动信号(165个MAT文件,涵盖正常、内圈/外圈/滚珠不同故障尺寸共10…

2026/10/13 4:39:10 阅读更多 →
LiteLLM:大模型协议统一与智能路由的工程实践

LiteLLM:大模型协议统一与智能路由的工程实践

1. 从“调用大模型像调用API”说起:LiteLLM到底在解决什么真问题?你有没有过这样的经历:上周刚用OpenAI的gpt-4-turbo跑通一个客服对话系统,这周客户突然要求切换成Anthropic的claude-3-haiku——结果发现,光是把opena…

2026/10/13 4:39:10 阅读更多 →
开放代码审查:让评审过程透明可追溯的团队实践

开放代码审查:让评审过程透明可追溯的团队实践

代码审查这件事,几乎所有团队都说自己在做,但真正做好的没几个。我见过太多项目把Review变成了例行公事:上线前临时拉人点个“同意”,评论区里互相打哑谜,新人面对一堆历史PR完全不知道当初为什么这么写。今天想聊的“…

2026/10/13 4:38:09 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →