[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-895":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":14,"forks30d":14,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":14,"starSnapshotCount":14,"syncStatus":27,"lastSyncTime":28,"discoverSource":29},895,"wx-favorites-report","zhuyansen\u002Fwx-favorites-report","zhuyansen","微信收藏可视化 Claude Code Skill — 从加密 DB 到交互式 HTML 报告的端到端管线",null,"Python",608,124,1,0,5,10,21,15,64.39,false,"main",true,[],"2026-06-12 04:00:06","# 微信收藏可视化 (wechat-favorites-viz)\n\n从加密的微信 Mac 本地数据库中提取收藏数据，生成交互式可视化 HTML 报告。\n\n## 效果预览\n\n报告包含：统计仪表盘、月度趋势、类型分布、来源排行、活跃热力图、词云、标签云，以及可按类型\u002F标签筛选的收藏浏览区。\n\n> 截图请打开 `report.html` 后自行截取（数据含个人信息，不宜公开分享截图）\n\n## 快速开始（macOS）\n\n### 前置条件\n\n- macOS (Apple Silicon 或 Intel)\n- 微信 Mac 4.x 已登录\n- Python 3.9+\n- Claude Code（推荐，自动执行全流程）\n\n### 方式一：用 Claude Code 一键执行\n\n```bash\n# 在 Claude Code 中说：\n微信收藏可视化\n```\n\nClaude 会自动完成密钥提取、解密、解析、报告生成全流程。\n\n### 方式二：手动分步执行\n\n#### Step 1: 安装依赖\n\n```bash\npip3 install frida frida-tools pycryptodome\n```\n\n#### Step 2: 准备签名副本\n\n微信 App Store 版有 Hardened Runtime 保护，需要复制一份去掉签名限制：\n\n```bash\ncp -R \u002FApplications\u002FWeChat.app ~\u002FDesktop\u002FWeChat.app\ncodesign --force --deep --sign - ~\u002FDesktop\u002FWeChat.app\n```\n\n#### Step 3: 提取加密密钥\n\n关闭当前微信，用 frida 启动桌面版微信：\n\n```bash\nkillall WeChat 2>\u002Fdev\u002Fnull; sleep 2\n\n# 运行 frida hook 脚本（见 SKILL.md 中完整代码）\n# 微信启动后：登录 → 打开「收藏」页面 → 等待 60 秒\n```\n\nfrida 会 hook `CCKeyDerivationPBKDF` 函数，捕获所有 PBKDF2 密钥派生调用。\n\n输出文件：`\u002Ftmp\u002Fwechat_frida_keys.log`\n\n#### Step 4: 解密数据库\n\n从 frida 日志中找到 favorite.db 对应的 enc_key（通过 salt 匹配），用 Python 解密：\n\n```python\n# favorite.db 路径:\n# ~\u002FLibrary\u002FContainers\u002Fcom.tencent.xinWeChat\u002FData\u002FDocuments\u002F\n#   xwechat_files\u002F\u003Cwxid>\u002Fdb_storage\u002Ffavorite\u002Ffavorite.db\n\n# 解密参数: SQLCipher 4\n# AES-256-CBC, HMAC-SHA512, PBKDF2 256000 轮, page_size=4096, reserve=80\n```\n\n#### Step 5: 生成报告\n\n```bash\n# 解析数据\npython3 parse_favorites.py --input favorite_decrypted.db --output data.json\n\n# 生成 HTML 报告\npython3 generate_report.py --input data.json --output report.html\n\n# 打开（推荐用 http server）\ncd \u003C输出目录> && python3 -m http.server 8765\nopen http:\u002F\u002Flocalhost:8765\u002Freport.html\n```\n\n## 踩坑记录\n\n在实现过程中经历了 6 轮迭代，以下是关键经验：\n\n### 密钥提取（最难的部分）\n\n| 尝试 | 方法 | 结果 | 原因 |\n|------|------|------|------|\n| 1 | C 内存扫描 x'hex' 格式 | 0 keys | WeChat 4.x 不用此格式存密钥 |\n| 2 | 搜索原始 salt 字节 | 误匹配 | 匹配到 ASCII 字符串不是真密钥 |\n| 3 | HMAC 暴力验证 (8B对齐) | 未找到 | 过滤条件跳过了真正位置 |\n| 4 | 无过滤暴力 (4B对齐) | 未找到 | 密钥经 PBKDF2 派生后存储，不是原始 enc_key |\n| 5 | DYLD hook \u002F lldb | 被阻止 | macOS SIP + Hardened Runtime |\n| **6** | **frida + CCKeyDerivationPBKDF** | **成功** | hook 系统 PBKDF2 函数捕获派生过程 |\n\n### 关键踩坑\n\n**坑 1: SIP 阻止签名 \u002FApplications 下的微信**\n复制到 ~\u002FDesktop 再签名。\n\n**坑 2: sudo 启动微信导致数据目录变成 \u002Fvar\u002Froot**\n不用 sudo，以普通用户身份运行 frida。\n\n**坑 3: favorite.db 密钥在启动时不加载**\n微信只在用户打开「收藏」页面时才加载 favorite.db。frida 运行期间必须手动打开收藏。\n\n**坑 4: WeChat 4.x 表结构变化**\n3.x 用 `FavItems` + `FavDataItem`，4.x 改为 `fav_db_item` 单表，content 是 XML。\n\n**坑 5: XML 字段名不统一**\n文章标题在 `\u003Cpagetitle>` 不是 `\u003Ctitle>`，聊天记录在 `\u003Cdatalist>\u003Cdataitem>\u003Cdatadesc>`，视频标题在 `\u003Cdataitem>` 内部的 `\u003Cdatatitle>`。\n\n**坑 6: JS 引号嵌套**\n`onerror=\"this.style.display='none'\"` 在 Python f-string + JS 模板字符串中会导致语法错误。用 `&quot;` 替代。\n\n**坑 7: file:\u002F\u002F 协议下 onclick 不工作**\n改用 event delegation（addEventListener on parent element）。\n\n**坑 8: ECharts 图表间距**\n图表容器需要明确的 height，否则部分区域渲染为空白。\n\n## 项目结构\n\n```\n~\u002F.claude\u002Fskills\u002Fwechat-favorites-viz\u002F\n├── SKILL.md                    # Skill 定义（触发词、流程、参数）\n└── scripts\u002F\n    ├── parse_favorites.py      # 解析器（SQLite\u002FCSV\u002FJSON → 统一 JSON）\n    ├── generate_report.py      # 报告生成器（JSON → 单文件 HTML）\n    └── demo_data.py            # 模拟数据生成（测试用）\n```\n\n## 报告功能一览\n\n- 统计卡片：总数、跨越天数、日均、来源数\n- 亮点发现：最忙日、最爱来源、主力类型\n- 月度趋势：折线 + 面积图\n- 内容类型分布：甜甜圈图\n- 来源 Top 15：水平柱状图\n- 活跃热力图：星期 x 小时\n- 时段分布：小时柱状图、星期柱状图\n- 词云：从标题 + 描述提取关键词\n- 标签云：微信收藏标签\n- 收藏浏览：按类型筛选 + 按标签筛选 + 全文搜索 + 排序 + 分页\n- 详情弹窗：点击卡片查看完整内容、原文链接、来源、标签\n\n## 已知限制\n\n- 图片\u002F视频\u002F文件原始内容存在微信 CDN（加密格式），无法在报告中预览\n- 文章缩略图来自微信公众号 CDN，需联网\n- 密钥提取仅支持 macOS，需要 frida\n- 每次微信更新后需要重新签名桌面副本\n\n## 技术栈\n\n| 组件 | 技术 |\n|------|------|\n| 密钥提取 | frida 17.x, CCKeyDerivationPBKDF hook |\n| 数据库解密 | PyCryptodome AES-256-CBC, HMAC-SHA512 |\n| 数据解析 | Python sqlite3 + regex XML |\n| 可视化 | ECharts 5.x CDN, echarts-wordcloud 2.x |\n| 报告格式 | 单文件 HTML，暗色主题，内联所有依赖 |\n","微信收藏可视化项目能够从加密的微信Mac本地数据库中提取用户的收藏数据，并生成一个包含多种可视化图表的交互式HTML报告。其核心功能包括使用Frida工具提取加密密钥、解密favorite.db文件以及通过Python脚本解析数据并生成报告，支持展示统计仪表盘、月度趋势等多维度分析结果。该项目特别适合希望深入了解自己微信收藏习惯或进行相关数据分析的用户。整个过程可以在macOS上通过Claude Code一键执行完成，对于熟悉命令行操作的用户也提供了详细的分步指南。",2,"2026-06-11 02:40:06","CREATED_QUERY"]