osintph/fblogs
GitHub: osintph/fblogs
一个用于在本地离线查看和搜索 Facebook「Data Logs」数据导出文件的隐私分析工具。
Stars: 0 | Forks: 0
# fblogs
**一个用于查看 Facebook “Data Logs” 导出文件的本地、离线查看器。**
Facebook 的数据下载中有一个默认不勾选的部分:**Data logs**。
这大约需要 15 天时间才能获取,并作为一个独立的压缩包发送给你。它包含了
那些整洁的个人资料导出永远不会展示给你的深层
遥测层数据:请求日志、设备和
网络指纹、基于距离的位置、读取你活动的第三方供应商,
以及持有你联系信息的广告商。
`fblogs` 会将该导出文件导入到一个单一的 SQLite 数据库中,并在 `127.0.0.1` 上提供一个快速、
可搜索的法证级 UI。运行时不依赖云服务、不上传数据、不进行外部调用。
你的导出文件永远不会离开你的本地计算机。
已在真实的导出文件上测试过:**横跨 161 个表的 429,793 行数据**,导入到
一个约 450 MB 的数据库中,可在浏览器中完全搜索。
## 功能
- **一键导入**整个导出文件(`.zip` 或解压后的文件夹)到
`fblogs.db`(SQLite + FTS5 全文索引)。
- **查询视图:**浏览全部 161 个表中的任何一个,支持实时行数统计、
跨所有字段的同时全文搜索、按 Manila 日期范围过滤,
以及结果的分页浏览。
- **概览仪表板:**随时间变化的活动趋势(数据保留断崖)、
生活模式热力图、各平台花费的时间,以及针对
最活跃的表、第三方供应商、广告商和出站域名的顶级活跃柱状图。
- **截图脱敏:**默认情况下所有数据均可见(因为这是你的
数据)。拨动一个开关,携带 PII(个人身份信息)的字段(IP、位置、cookies、user
agent、会话 ID、帖子/内容 URL)就会变成黑色的标记条,这样你就可以
为博客截图而不会泄露任何信息。点击标记条可显示
单个值。
- **离线且自包含:**使用标准库 Python、单个 HTML 页面、无 CDN、
不使用浏览器存储。可在隔离网络的主机上运行。仅绑定到 localhost。
## 快速开始
```
git clone https://github.com/osintph/fblogs.git
cd fblogs
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
# 从你的导出文件构建数据库 (zip 或解压后的文件夹均可)
python3 ingest.py /path/to/facebook-export.zip
# serve,仅限 localhost
python3 app.py # http://127.0.0.1:8713
```
然后打开 `http://127.0.0.1:8713`。在无头服务器上,请使用隧道访问,而不是
直接暴露它:
```
ssh -L 8713:127.0.0.1:8713 you@your-server
```
此外还有一个 `./run.sh` 脚本,它会在首次
运行时初始化 venv 并安装依赖项。
## 工作原理
导出文件将每个表以 JSON 格式存储在 `data_logs/content///` 下,
每一行都包含一个 Unix 时间戳和一个 `label_values` 列表。`ingest.py`
将其扁平化为一个 `events` 表(包含 `category`、`table_name`、`ts`、`data`
作为 JSON),外加一个 `tables_meta` 目录以及一个基于扁平化
文本的 FTS5 索引。`app.py` 是一个小型的 FastAPI 服务,对外暴露 `/api/meta`、`/api/query`、
`/api/timeline` 和 `/api/overview` 接口;`index.html` 是包含整个 UI 的单一文件。
```
ingest.py export -> SQLite (schema, flattening, FTS build)
app.py FastAPI JSON API + static page (query_only, localhost)
index.html single-page UI (vanilla JS, system fonts, no deps)
run.sh venv-bootstrapping launcher
requirements.txt
```
服务器以 `query_only` 模式打开 SQLite,绝不会向导出文件
或数据库执行回写操作。
## 搜索语法
搜索框使用的是 SQLite FTS5:
| 查询条件 | 匹配结果 |
| --- | --- |
| `spotify` | 包含单词 spotify 的行 |
| `"custom audience"` | 精确匹配该短语 |
| `ip AND cookie` | 同时包含这两个词 |
| `brandwatch OR talkwalker` | 包含其中任意一个词 |
| `stores near*` | 前缀匹配 |
无效的 FTS 语法会返回友好的错误提示,而不会导致程序崩溃。
## 配置
- **时区:**显示时间设为 Asia/Manila。可在 `app.py` 顶部附近修改 `MANILA`。
- **脱敏集合:**在截图模式下会变黑的标签是
`app.py` 中的 `SENSITIVE_LABELS`,以不区分大小写的子字符串形式进行匹配。可以添加或
删除条目并刷新页面。
- **绑定地址 / 端口:**`python3 app.py --host 0.0.0.0 --port 9000` 仅适用于
你确实需要局域网访问的情况。该服务无身份验证机制;其安全模型是
“仅限 localhost”。如果你将其暴露在外,请将其置于带有
访问控制权限的自建反向代理之后。
## 隐私
`fblogs` 专为阅读你**自己**的导出文件而构建。它在
运行时不会发出任何出站请求。整个工作流程中唯一的网络访问
就是一次性的 `pip install`,用于获取 FastAPI 和 uvicorn;此后它将完全
离线运行。任何时候都不会上传任何数据。
不要提交真实数据:包含的 `.gitignore` 已经排除了 `*.db`、`*.zip`、
`data_logs/` 和 venv。
## 许可证
[AGPL-3.0](LICENSE)。与 [Suri](https://github.com/osintph/suri) 相同。如果你将
修改后的版本作为网络服务运行,请分享你的修改内容。