Skip to content

fix(reader): 反爬挑战页独立报错 + 失败冷却负缓存 (#160) - #162

Merged
fxbin merged 3 commits into
mainfrom
issue-160-reader-anti-bot
Oct 27, 2026
Merged

fxbin merged 3 commits into
mainfrom
issue-160-reader-anti-bot

Conversation

@fxbin

@fxbin fxbin commented Oct 27, 2026

Copy link
Copy Markdown
Owner

变更

Closes #160。两个切片,对应两个 commit:

  1. 挑战页识别(1f74109):掘金被字节 WAF 按 IP 限流时返回 200 的 JS 挑战空壳页(约 2.5KB,waf_jschallenge/_wafchallengeid),此前走完提取链路后误报 not_readerable「没有可提取的正文」。现在按响应体签名识别(字节两家 + Cloudflare challenge-platform),抛独立错误码 anti_bot_challenge(503,文案如实说明「来源暂时限制访问」)。签名匹配带 64KB 体积上限——真实挑战页都是轻量空壳,讨论反爬的正常长文不会因正文出现词干被误判。刻意不进 _no_retry:TLS 指纹型挑战 curl_cffi 仍可能救回。
  2. 失败冷却(b8d82c1):失败此前不缓存,用户每次点击都再打一次源站,对分钟级拦截窗口的限流站点只会加深限流。现在按 content_id 做进程内负缓存(ARTICLE_READER_FAILURE_COOLDOWN_SECONDS,默认 120s,0 关闭),期内直接重抛上次错误;refresh=true 绕过、成功后清除。与 _robots_cache 同为进程级口径。

根因证据(本地复现):同机 6 连抓掘金同文,第 5、6 次连续两层(httpx+curl_cffi)失败拿到挑战页;约 15 分钟后自动解除。掘金 robots 允许 /post/。

前端无需改动:API 已透传 detail.message,ReaderDrawer 直接渲染。

明确不做

服务端解 WAF PoW / 种 cookie 伪装通过 = 绕过反爬,违反 article_reader 设计契约(no cookies / no stealth escalation)。

Verification

  • 本地隔离环境(一次性 PG 5433,未触碰开发库):
    • tests/test_article_reader.py:19/19 绿(12 存量 + 7 新增:签名识别正/负/体积上限、httpx 路径分类、tiered 保留 curl_cffi 重试、冷却抑制/refresh 绕过/成功清除/0 关闭)
    • 后端全量 pytest tests/:exit 0,1372 通过 0 失败
  • ruff format --check + ruff check:改动文件全过
  • uv run python -m py_compile:通过
  • 覆盖范围:httpx 与 curl_cffi 两条抓取路径的挑战识别各有断言;冷却经服务层直测(fetch 调用计数证明冷却期内零外呼)
  • 未覆盖:多 worker 进程间冷却共享(单进程口径,与 _robots_cache 一致,部署为单 worker 不受影响)
  • 独立复核:待合并前由非实现过程复核者确认

fxbin added 2 commits October 27, 2026 08:27
掘金等站被 WAF 按 IP 限流时返回 200 的 JS 挑战空壳页,此前走完
提取链路后误报 not_readerable「没有可提取的正文」。现在按响应体签名
(字节 WAF waf_jschallenge/_wafchallengeid、Cloudflare challenge-platform)
识别,抛独立的 anti_bot_challenge(503,文案如实说明来源暂时限制访问),
并保留 curl_cffi 第二层重试。签名匹配加 64KB 体积上限,避免讨论反爬的
正常长文因正文出现词干被误判。
失败此前不缓存,用户每次点击都再打一次源站,对被反爬限流的站点
(拦截窗口分钟级)只会加深限流。现在按 content_id 做进程内负缓存,默认
120 秒(ARTICLE_READER_FAILURE_COOLDOWN_SECONDS,0 关闭)内直接重抛上次
错误;refresh=true 绕过,成功读取后清除。与 _robots_cache 同为进程级口径。
@fxbin
fxbin merged commit c7ab7f3 into main Oct 27, 2026
8 checks passed
@fxbin
fxbin deleted the issue-160-reader-anti-bot branch October 27, 2026 08:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

站内阅读把反爬挑战页误报为「没有可提取的正文」,且失败无冷却会加深限流

1 participant