feat(auth): separate read and write bilibili accounts

This commit is contained in:
kairee committed 2026-10-31 20:01:21 +08:00
1 parent 5c2ab7b187
commit 178ab64b18
17 files changed
+671 -707

No files matched your search

+37 -20
View File
@@ -97,8 +97,13 @@ uv run python app.py snapshot
# 忽略当日完成标记,重新采集
uv run python app.py snapshot --force
# 检查 Cookie 登录态
uv run python app.py auth-check
# 分别为只读和写入账号扫码授权(默认 read)
uv run python app.py auth
uv run python app.py auth --account write
# 检查指定账号或两套账号的登录态
uv run python app.py auth-check --account read
uv run python app.py auth-check --account all
```
- `snapshot` 对 `active` / `unfaved` 视频逐条请求 `view`,每条请求间隔 1.0~1.6 秒;
@@ -108,7 +113,7 @@ uv run python app.py auth-check
- 粉丝数写入 `up_stat`,失败同样写 `ok=0`;
- 当日全部视频与粉丝采集成功后写入完成标记;服务启动时若当天未完成会自动补跑;
- 每次采集后生成 `data/backup/app-YYYYMMDD.db`,按 `storage.backup_keep_days` 清理旧日备份;
- Cookie 失效只告警,不阻塞匿名 `view` 采集;`auth-check` 可单独检查。
- Cookie 失效只告警,不阻塞匿名 `view` 采集;P0/P1 只使用 `bilibili.read`。
首次真实全量采集结果:795 条视频全部成功、0 失败、0 移除,耗时约 19 分钟;粉丝 `follower=2767270`;日备份为 `data/backup/app-20261031.db`。
@@ -120,9 +125,20 @@ uv run python app.py auth-check
Copy-Item config.example.json config.json
```
`config.json` 已被 `.gitignore` 忽略,**不得提交**。其中:
`config.json` 已被 `.gitignore` 忽略,**不得提交**。配置必须使用双账号格式:
- `mid` / `cookie` / `csrf`:B 站账号 UID、完整 Cookie 与 `bili_jct`(兼容 `favsort.py` 的扁平写法;也支持 `bilibili` 嵌套对象);
```json
{
"bilibili": {
"read": { "mid": 0, "cookie": "...", "csrf": "..." },
"write": { "mid": 0, "cookie": "...", "csrf": "..." }
}
}
```
- `bilibili.read`:年度收藏夹同步、视频数据快照、粉丝数与其他只读查询使用;
- `bilibili.write`:后续加入目标收藏夹、回读验证与现有 `favsort.py` 排序使用;
- 两个账号的 Cookie、CSRF 与设备指纹严格隔离;顶层 `mid` / `cookie` / `csrf` **不再支持**;
- `overrides`:可选,为代发或联合投稿视频指定归属 UP;
- `folders`:年度收藏夹配置(`year` + `media_id` + `title`),系统不自动建夹;
- `up_blacklist_seed`:首次启动写入数据库的 UP 黑名单种子;
@@ -140,9 +156,9 @@ Copy-Item config.example.json config.json
# 查看全部命令;无需 config.json
uv run bili-fav help
# 扫码登录,更新 config.json 中失效的身份 Cookie
uv run bili-fav auth
uv run bili-fav auth --check
# 为写账号扫码登录与检查状态(认证入口统一在 app.py)
uv run python app.py auth --account write
uv run python app.py auth-check --account write
# 列出本人创建的收藏夹
uv run bili-fav folders
@@ -172,38 +188,39 @@ uv run bili-fav verify <media_id>
## 扫码授权
当接口返回 `-101` 或 Cookie 即将过期时,运行:
当接口返回 `-101` 或 Cookie 即将过期时,使用统一认证入口:
```powershell
uv run bili-fav auth
uv run bili-fav auth --check
uv run python app.py auth --account read
uv run python app.py auth --account write
uv run python app.py auth-check --account all
```
授权流程在本地生成二维码图片并等待手机客户端扫码确认。成功后:
- 更新 `SESSDATA`、`bili_jct`、`DedeUserID`、`sid` 等身份字段;
- 保留 `buvid3`、`buvid4`、`_uuid`、`buvid_fp` 等设备指纹;
- 将 `csrf` 同步为新的 `bili_jct`;
- 将选中账号的 `csrf` 同步为新的 `bili_jct`,并从 `nav` 回写该账号实际 mid;
- 原子写入 `config.json`,并保留 `config.json.bak`;
- 通过 `x/web-interface/nav` 验证新登录态,失败时自动回滚。
- 通过 `x/web-interface/nav` 验证新登录态,失败时自动回滚;不会修改另一个账号。
常用选项:
```powershell
uv run bili-fav auth --no-browser # 只生成二维码图片并输出路径
uv run bili-fav auth --timeout 180 # 修改扫码等待时间(秒)
uv run python app.py auth --account write --no-browser
uv run python app.py auth --account read --timeout 180
```
## B 站访问与安全约束
| 接口 | 当前用途 | 身份 Cookie |
|---|---|---|
| `fav/resource/ids` | 收藏夹资源 ID | 不需要账号身份;可匿名读取。 |
| `fav/resource/infos` | 收藏夹元数据 | 不需要账号身份,但需要设备指纹,完全无 Cookie 时可能返回 HTTP 412。 |
| `fav/folder/created/list-all` | 列出自建收藏夹 | 需要完整登录 Cookie。 |
| `fav/resource/sort` | 收藏夹排序 | 写操作;需要完整 Cookie 和 `csrf`。 |
| `fav/resource/ids` / `infos` | 年度收藏夹同步与排序计划 | `read` 用于 P0;`favsort.py` 计划使用 `write`。 |
| `view` / `relation/stat` / `nav` | P1 快照与 read 登录态 | `read`。 |
| `fav/folder/created/list-all` | 列出目标自建收藏夹 | `write`。 |
| `fav/resource/deal` / `sort` | 加入收藏夹、收藏夹排序 | `write`,需要完整 Cookie 和 CSRF。 |
现有工具对 `ids` / `infos` 默认剥离账号身份 Cookie,仅保留设备指纹;如果只读请求失败,才使用完整 Cookie 重试。所有写操作使用完整 Cookie 与 CSRF。
只读客户端对 `ids` / `infos` 默认剥离 `read` 身份 Cookie,仅保留该账号设备指纹;如果失败才使用完整 `read` Cookie 重试。写操作一律使用完整 `write` Cookie 与 CSRF。
`x/v3/fav/resource/sort` 的实测语义为: