fix(bili): 登录态判定改为校验 cookie 有效性,避免静默降级到 480P

check_login_state 原先只判断 SESSDATA 是否存在。过期会话的 SESSDATA 会一直
留在浏览器里,于是 pong 报"账号未登录"后进入的登录流程会被立刻判成成功:
既不等待扫码,又把这份死 cookie 灌给 API client。

后果是隐蔽的:详情和评论两个接口不要求登录,照常爬到;而 playurl 依据
Cookie 决定清晰度,未登录状态会静默封顶在 480P,不报任何错。

- login.py: 抽出 is_login_cookie_refreshed(),要求 SESSDATA 被扫码换发成新值
  才算登录成功;进入登录流程前记录旧值,残留死 cookie 时输出告警
- core.py: 登录流程结束后补一次 pong 校验,仍失败则明确报错退出,
  不再带着未登录状态跑完全程
- 新增 tests/test_bilibili_login_state.py 覆盖上述分支
This commit is contained in:
程序员阿江(Relakkes)
2026-09-18 15:48:06 +08:00
parent 9cfc148577
commit c03ab60aac
3 changed files with 82 additions and 4 deletions
+10
View File
@@ -24,6 +24,7 @@
import asyncio
import os
import sys
# import random # Removed as we now use fixed config.CRAWLER_MAX_SLEEP_SEC intervals
from asyncio import Task
from typing import Dict, List, Optional, Tuple, Union
@@ -113,6 +114,15 @@ class BilibiliCrawler(AbstractCrawler):
browser_context=self.browser_context,
urls=self.cookie_urls,
)
# 登录流程结束后再校验一次,宁可在这里失败也不要带着未登录状态跑完全程:
# B 站的清晰度由 playurl 依据 Cookie 决定,死会话不会报错,
# 只会把带 get_media 的视频静默限制在 480P
if not await self.bili_client.pong():
utils.logger.error(
"[BilibiliCrawler.start] 登录流程结束后仍未登录:请确认扫码已完成、"
"或 config.COOKIES 是否有效。已终止,否则视频会被静默限制在 480P。"
)
sys.exit(1)
crawler_type_var.set(config.CRAWLER_TYPE)
if config.CRAWLER_TYPE == "search":