mhadifilms/serializd-exporter

GitHub: mhadifilms/serializd-exporter

一个纯 Python 零依赖的命令行工具,通过逆向 Serializd 私有 API 将用户的剧集观看数据批量导出为 JSON 和 CSV 文件。

Stars: 0 | Forks: 0

# serializd-exporter [![ci](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](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, 数据导出, 无后门, 爬虫, 逆向工具