Crowligarchy/cache-crow
GitHub: Crowligarchy/cache-crow
一个用于从Discord、Slack等应用的本地缓存中恢复和分析媒体文件的命令行工具。
Stars: 0 | Forks: 0
# cache-crow
[](https://pypi.org/project/cache-crow/)
[](https://pepy.tech/project/cache-crow)
[](https://www.python.org/downloads/)
[](LICENSE)
[](https://github.com/Crowligarchy/cache-crow/actions)
[](https://github.com/Crowligarchy/cache-crow/stargazers)
支持 **Linux、macOS 和 Windows**。当前针对 **Discord 和 Slack**;未来路线图将支持更多应用。
## 功能介绍
Discord 是基于 Chromium 构建的 Electron 应用。Chromium 的网络栈为了性能维护着本地的 HTTP 缓存——你查看的每张图片、GIF 和视频都会以二进制文件形式写入磁盘,这些文件没有扩展名,文件名类似 `f_000001` 或 `f_00a3f2`。
当有人删除消息时,Discord 会移除服务器端的记录,并告知你的客户端将其隐藏。但它无法深入你的本地文件系统删除缓存副本。**该文件会留在磁盘上**——有时会持续数天或数周,这取决于 Chromium 的缓存清除计划。
cache-crow 利用了这一点:
1. 扫描 `Cache_Data/` 目录中匹配已知媒体文件魔术字节的文件
2. 无需猜测,准确识别每个文件的格式(PNG、JPEG、GIF、WebP、MP4、WebM)
3. 使用正确的扩展名提取文件,剥离 Chrome Simple Cache 包装
4. 可选择从嵌入的缓存条目头信息中恢复原始 CDN URL
无需账户。无需网络访问。无需第三方服务器。只读取你的操作系统用户账户已有权限读取的文件。
## 安装
```
# 推荐方式 — 安装到独立环境,无需修改 PATH
pipx install cache-crow
# 或使用标准 pip 安装
pip install cache-crow
# 从源码安装(最新未发布代码)
pipx install git+https://github.com/Crowligarchy/cache-crow
pip install git+https://github.com/Crowligarchy/cache-crow
```
### 可选附加功能
```
# 交互式 TUI 浏览器(由 Textual 支持)
pip install 'cache-crow[tui]'
# LevelDB 索引读取器 — 从缓存索引恢复 CDN URL
pip install 'cache-crow[leveldb]'
# 全部内容
pip install 'cache-crow[all]'
```
### 验证安装
```
cache-crow --version
# cache-crow 0.1.0
```
## 快速开始
```
# 扫描您的 Discord 缓存,以表格形式显示所有找到的媒体
cache-crow
# 仅统计:计数与大小,不列出文件
cache-crow --stats
# 将所有 >=1 KB 的内容提取到 ./recovered/,并保留正确扩展名
cache-crow --output-dir ./recovered
# 针对 Slack 而非 Discord
cache-crow --app slack
# 指定特定目录(用于取证或其他用户配置文件)
cache-crow --cache-dir /path/to/Cache_Data
# 机器可读 JSON — 可通过 jq、脚本或其他方式处理
cache-crow --format json | jq '.[] | select(.mime_type == "video/mp4")'
# 实时监控:显示新出现的缓存文件
cache-crow --watch --output-dir ./live-capture
# 交互式 TUI 浏览器
cache-crow --tui
```
## 演示
```
$ cache-crow --stats
Cache Stats
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ Metric ┃ Value ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━┩
│ Total files scanned │ 39 │
├─────────────────────┼─────────┤
│ Media files found │ 23 │
├─────────────────────┼─────────┤
│ Total media size │ 92.0 KB │
└─────────────────────┴─────────┘
Breakdown by Type
┏━━━━━━━━━━━━┳━━━━━━━┓
┃ Type ┃ Count ┃
┡━━━━━━━━━━━━╇━━━━━━━┩
│ image/png │ 8 │
├────────────┼───────┤
│ image/jpeg │ 5 │
├────────────┼───────┤
│ image/webp │ 4 │
├────────────┼───────┤
│ image/gif │ 3 │
├────────────┼───────┤
│ video/mp4 │ 2 │
├────────────┼───────┤
│ video/webm │ 1 │
└────────────┴───────┘
```
```
$ cache-crow
Media in discord cache
┏━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┓
┃ Filename ┃ Type ┃ Size ┃
┡━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━┩
│ f_000001 │ image/png │ 11.4 KB │
│ f_000006 │ image/png │ 11.4 KB │
│ f_000009 │ image/jpeg │ 120 B │
│ f_000023 │ video/webm │ 104 B │
│ f_000017 │ image/webp │ 45 B │
│ f_000014 │ image/gif │ 42 B │
│ f_000021 │ video/mp4 │ 40 B │
│ ... │ ... │ ... │
└──────────┴────────────┴─────────┘
Media files found: 23 of 39 total
```
```
$ cache-crow --output-dir ./recovered
Extracting from: /home/user/.config/discord/Cache/Cache_Data
Extraction Results
┏━━━━━━━━━━━━━━━┳━━━━━━━┓
┃ Metric ┃ Value ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━┩
│ Total scanned │ 39 │
├───────────────┼───────┤
│ Extracted │ 8 │
├───────────────┼───────┤
│ Skipped │ 31 │
└───────────────┴───────┘
Output: ./recovered
```
## 完整使用参考
```
usage: cache-crow [-h] [--version] [--app APP] [--cache-dir PATH]
[--output-dir PATH] [--min-size BYTES] [--stats]
[--format FORMAT] [--metadata] [--watch] [--watch-all] [--tui]
options:
--version Show version and exit
--app APP Target app: discord (default) or slack
--cache-dir PATH Override the cache directory (skips auto-detection)
--output-dir PATH Extract found media files into PATH with correct extensions
--min-size BYTES Minimum file size to extract, in bytes (default: 1024)
--stats Summary stats only (counts and sizes, no file listing)
--format FORMAT Output format: table (default) or json
--metadata Enrich entries with CDN URLs and guild/channel IDs
--watch Watch for new cache files in real time (Ctrl+C to stop)
--watch-all In watch mode, show all files, not just media
--tui Interactive TUI browser (requires cache-crow[tui])
```
## 工作原理
### Chrome Simple Cache 格式
Discord 的 Chromium 缓存使用 "Simple Cache" 格式。每个条目是一个单独的文件:
```
[24-byte header][URL key][response body][EOF record][response headers][EOF record]
```
头信息包含作为 UTF-8 键值的原始 CDN URL。响应体是实际的媒体内容。cache-crow 解析此结构以提取原始字节——而不仅仅是复制原始文件——因此提取的媒体是干净且可播放的。
### 魔术字节检测
cache-crow 不依赖文件名或扩展名(它们本就不存在),而是读取每个文件的开头字节并与已知签名进行匹配:
| 魔术字节 | 格式 |
|--------------------------|-----------|
| `\x89PNG` | PNG |
| `\xFF\xD8\xFF` | JPEG |
| `GIF8` 或 `GIF9` | GIF |
| `RIFF....WEBP` | WebP |
| `....ftyp`(偏移量 4) | MP4 |
| `\x1A\x45\xDF\xA3` | WebM/MKV |
### CDN URL 恢复
使用 `--metadata` 选项,cache-crow 还会读取嵌入在每个缓存条目头信息中的 URL 键。对于 Discord 的附件,URL 编码了服务器 ID、频道 ID 和原始文件名:
```
https://cdn.discordapp.com/attachments/{guild_id}/{channel_id}/{filename}
```
这让你可以将缓存文件追溯到最初分享它的 Discord 频道和服务器。
## 缓存持久性:事实说明
**删除消息不会清除缓存。**
当你删除一条 Discord 消息时,服务器端的记录会被移除。其他客户端会收到删除事件。但每个查看者机器上 Chromium 的磁盘缓存没有接收删除信号的机制——它只是保留该文件,直到其正常的清除周期。
**Discord 的 "清除缓存" 设置不可靠。**
Discord 内置的缓存清除通过 Electron API 进行。清除前写入的文件有时会被清除,有时不会——这取决于 Chromium 内部的清除顺序,而不是保证删除。
**卸载 Discord 不会移除缓存。**
在大多数系统上,`~/.config/discord` 目录不会被卸载程序触碰。`Cache_Data` 目录在卸载后依然存在。
**这不是 Discord 的 bug。**
这是记录在案的 Chromium 行为,所有 Electron 应用都存在:Discord、Slack、VS Code、Teams、Signal Desktop、Telegram Desktop。本地磁盘缓存是一个性能特性,而非隐私控制。
## 支持的应用
| 应用 | Linux 路径 | 状态 |
|----------------|--------------------------------------------------|--------|
| Discord | `~/.config/discord/Cache/Cache_Data` | 稳定 |
| Discord Canary | `~/.config/discordcanary/Cache/Cache_Data` | 稳定 |
| Discord PTB | `~/.config/discordptb/Cache/Cache_Data` | 稳定 |
| Slack | `~/.config/Slack/Cache/Cache_Data` | 稳定 |
macOS 和 Windows 路径也会被自动检测——完整列表请参见 `cache-crow --help`。
路线图:Telegram Desktop、Signal Desktop、VS Code、Microsoft Teams。欢迎提交 PR。
## 与现有工具对比
大多数 Discord 缓存工具编写于 2019-2022 年,仅针对 Windows,且需要 GUI。cache-crow 有所不同:
| 特性 | cache-crow | 大多数替代工具 |
|--------------------------|-----------------|-------------------|
| 跨平台 | 是 | 仅 Windows |
| CLI / 可脚本化 | 是 | 仅 GUI |
| JSON 输出 / 管道友好 | 是 | 否 |
| Chrome Simple Cache 解析 | 是(流式处理) | 原始文件复制 |
| 魔术字节检测 | 是 | 扩展名重命名 |
| 多应用支持 | 是 | 仅 Discord |
| 最小依赖(仅 rich) | 是 | 不一 |
| 实时监视模式 | 是 | 否 |
| TUI 浏览器 | 是 | 否 |
| CDN URL 恢复 | 是 | 否 |
| 积极维护 | 2025年 | 2019-22年已弃用 |
## 安全与隐私
cache-crow 是一个取证和隐私研究工具。它只读取你本地文件系统上操作系统用户账户已有权限读取的文件。它不进行任何网络请求。
**预期使用场景:**
- **DFIR / 事件响应**——从受损或被查封的主机中恢复证据
- **隐私审计**——了解你的 Electron 应用为你存储了什么
- **安全研究**——研究 Chromium 的磁盘缓存格式和行为
- **个人恢复**——找回你查看过但忘记保存的内容
如果你使用此工具访问你不拥有或没有明确权限检查的设备,这属于你与你所在辖区计算机滥用法律之间的法律问题。作者对误用不承担任何责任。
## 许可证
MIT。参见 [LICENSE](LICENSE)。
标签:CDN URL恢复, Chromium缓存, Discord缓存, Electron应用, WSL, 二进制文件处理, 媒体提取, 媒体文件恢复, 应用缓存探索, 数字取证, 数据恢复, 文件扫描, 文件格式识别, 本地文件分析, 缓存分析, 缓存探索, 缓存文件管理, 缓存浏览, 缓存过滤, 自动化脚本, 逆向工具