mhadifilms/serializd-exporter
GitHub: mhadifilms/serializd-exporter
一个纯 Python 零依赖的命令行工具,通过逆向 Serializd 私有 API 将用户的剧集观看数据批量导出为 JSON 和 CSV 文件。
Stars: 0 | Forks: 0
# serializd-exporter
[](https://github.com/mhadifilms/serializd-exporter/actions/workflows/ci.yml)
导出你的 [Serializd](https://www.serializd.com) 账户 — 评论、日记、
评分、观看列表、点赞、活动,以及你的**完整分集观看记录** —
格式为 JSON + CSV。Serializd 没有导出功能;本工具驱动其 Web
应用所使用的私有 API。
纯 Python 3.9+ 标准库。无需 `pip install`,没有依赖。
```
git clone https://github.com/mhadifilms/serializd-exporter
cd serializd-exporter
# 公开数据 — 任何公开的 profile,无需 auth
python3 serializd_export.py YOUR_USERNAME
# 所有内容,包括你的 per-episode log
python3 serializd_token.py # grabs the auth cookie from your browser
python3 serializd_export.py YOUR_USERNAME --token-file ~/.serializd_token
```
输出文件将存放在 `./serializd-export/` 中。重新运行时会跳过磁盘上已有的数据集,
因此第二次运行只会获取第一次未能获取的内容。
## 获取 token
`serializd_token.py` 会从本地浏览器读取 `tvproject_credentials` cookie
并将其写入 `~/.serializd_token`(权限模式为 `600`)。它仅输出字节数 —
该值绝对不会出现在你的终端或 shell 历史记录中。
| | |
|---|---|
| Chromium 内核系列 | Chrome, Brave, Edge, Arc, Vivaldi, Opera, Chromium — macOS & Linux |
| Firefox | macOS & Linux |
| 参数 | `--browser brave`, `--list`, `--stdout`, `--out PATH` |
在 macOS 上,系统钥匙串会提示一次 "Chrome Safe Storage"(或你所使用的
浏览器的对应项)— 这是操作系统在保护 cookie 存储;请批准它。
更倾向于手动获取?打开 DevTools → Application → Cookies → `https://www.serializd.com`
→ 复制 `tvproject_credentials`,然后使用 `--token-file` 或 `SERIALIZD_TOKEN=...`。
## 导出内容
`profile` · `stats` · **`episode_logs`** · `watched` · `watchlist` · `diary` ·
`reviews` · `currently_watching` · `paused_shows` · `dropped_shows` · `lists`
(+ `list_contents`) · `lists_pinned` · `liked_lists` · `review_tags` ·
`reviews_pinned` · `liked_shows` · `liked_seasons` · `liked_episodes` ·
`liked_reviews` · `followers` · `following` · `friends` · `activity`
有了 token,还可以导出:`account_information` · `blocked_users` · `collaborative_lists`
所有内容都会写入 `.json`;表格型数据集同时会生成 `.csv`。
`_manifest.json` 会记录每个数据集的条目数,以及任何不完整或失败的内容。
```
serializd-export/
├── _manifest.json
├── episode_logs.json episode_logs.csv
├── reviews.json reviews.csv
├── diary.json diary.csv
├── watched.json watched.csv
└── ...
```
`episode_logs.csv` 是大多数人最想要的文件:
```
loggedAt,showName,seasonNumber,episodeNumber,episodeName,airDate,runtime,...
2026-07-18T02:11:05Z,The Boys,4,6,Dirty Business,2024-07-11,60,...
```
## 选项
```
--only a,b export just these datasets (always re-fetched)
--skip a,b exclude these
--list-datasets print every dataset name and whether it needs a token
--force re-fetch datasets already on disk (default: keep them)
--out DIR output directory (default: ./serializd-export)
--delay SECONDS pause between requests (default: 0.35)
--since Y-M-D lower bound for the episode-log cursor search
--quiet
```
## API 及其本工具所规避的 bug
Base `https://serializd.onrender.com`;每个请求都需要包含 header
`X-Requested-With: serializd_vercel`;认证方式为 `Authorization: Bearer `。
这些都没有官方文档,并且存在一些实际的 bug:
1. **`sort_by` 是必填项。** `watchedpage_v2`、`watchlistpage_v2`、
状态分桶页面、`reviewspage_v3` 和 `liked_lists` 如果缺少该项就会返回 `500`
(大多数情况下使用 `date_added_desc`;`liked_lists` 使用 `date_created_desc`)。
2. **`liked_shows?type=` 必须是复数形式**(`shows`/`seasons`/`episodes`)。无法识别的值
不会报错 — 它会静默返回*未过滤的*数据集合,因此
不加处理的调用者会得到三个完全相同的文件。
3. **`episode_logs_page_v2` 存在两个游标 bug。**
(a) 没有微秒的游标会直接报 `500` 错误 — `…12:00:00` 会失败,
`…12:00:00.000000` 则正常。
(b) 损坏的数据行会污染整个时间戳范围:*任何*时间窗口触及该损坏行的
游标都会永远报 `500` 错误。普通的遍历器会在那里中断,并丢失之前已获取的所有数据。
本导出工具按从新到旧的顺序分页,并且在遇到 `500` 错误时,通过二分查找
寻找仍能正常响应的最新游标,将跳过的区间记录在
`episode_logs_gaps.json` 中,然后继续执行。
4. **`collaborative_lists` 会必然报 `500` 错误。**
这里的每一个分页器都具备防部分失败机制:遍历中途的失败会保留
已收集到的数据,并在 `_manifest.json` 中记录错误,而不会
丢弃本次运行的结果。
## 为什么你的分集数可能与个人资料不一致
`episode_logs` 包含的是单独记录的分集。Serializd 在其 API 中**没有
针对分集级别的 "watched" 标记** — 分集仅以日志形式存在,并附带剧集*级别*的
观看状态。因此 `profile.totalEpisodesWatched` 可能会超过日志记录的
数量;多出的部分来自于没有任何 endpoint 会进行枚举的季/剧级别标记(以及被删除的日志)。
这些日志就是所有实际可检索到的数据。
## 开发
```
python3 -m unittest discover -s tests -v # offline; no network, no creds
ruff check .
```
测试覆盖了分页器、部分失败行为,以及针对
复现了这两种游标 bug 的模拟 API 的分集日志恢复遍历器。
## 免责声明
本工具为非官方项目,且不隶属于官方。它使用的是可能会随时更改或失效的
私有 API。仅用于导出**你自己的**账户数据。请配合 `--delay` 礼貌使用。
采用 MIT 许可证。
标签:API, BeEF, DFIR, Python, 数据导出, 无后门, 爬虫, 逆向工具