真实环境问题: 抓取被墙/反爬站点 (如 baike.baidu.com) 返回 403 时, classify_error 统一归为 E_AUTH, AI Agent 会误判为凭证问题而做无效的 认证重试。被封锁不是认证失败。 改动: - common.py: 新增 E_BLOCKED 错误码 + recovery_hint (提示换 URL/镜像/ 用 Wayback 兜底/--exclude-domain); 新增 classify_fetch_error() 与 _extract_status_code(): fetch 场景 403→E_BLOCKED, 401→E_AUTH, 其余委托 classify_error (搜索场景 403 仍为 E_AUTH, 不变) - fetch.py main(): 错误路径改用 classify_fetch_error (替代 classify_error) - search.py: fetch_page 与 fetch_top_results 线程错误路径同样切换 - 新增 11 个测试 (test_v240_blocked_code.py), 全量 572 测试通过 - 真实环境验证: baike 403 → E_BLOCKED, 正常站点不受影响 - 文档同步 (SKILL.md/README.md 错误码表, 版本号 2.4.0)
63 lines
3.2 KiB
Python
63 lines
3.2 KiB
Python
"""Package-level constants for searxng-cli scripts.
|
||
|
||
Import in sibling scripts with:
|
||
from _config import VERSION, USER_AGENT, SCHEMA_VERSION, UA_POOL
|
||
|
||
Retry settings and shared HTTP utilities now live in ``common.py`` so that
|
||
both ``search.py`` and ``fetch.py`` share one consistent implementation.
|
||
"""
|
||
|
||
VERSION = "2.4.0"
|
||
SCHEMA_VERSION = "1.0"
|
||
USER_AGENT = f"searxng-cli/{VERSION}"
|
||
|
||
# 浏览器 UA 池(用于 searxng-cli 默认 UA 被站点拦截时的回退)。
|
||
#
|
||
# v2.2.0 从 common.py 迁移至此统一管理(SSOT)。common.py 通过
|
||
# ``from _config import UA_POOL`` 引用,并在导入失败时回退到其内置副本。
|
||
#
|
||
# 维护原则:
|
||
# 1. 版本号保持为当前年份的主流浏览器版本,避免被识别为过时浏览器
|
||
# 2. 顺序固定——get_ua_for_domain() 用 SHA-256 哈希选索引,顺序变化会
|
||
# 改变域名→UA 的映射,导致跨版本缓存失效(可接受,但应尽量避免无谓变动)
|
||
# 3. 至少覆盖 Chrome/Edge/Firefox × Windows/macOS/Linux,保证指纹多样性
|
||
#
|
||
# 当前版本(2026 年):Chrome 138-140 / Edge 138 / Firefox 140 / Safari 18。
|
||
UA_POOL = [
|
||
# Chrome 140 — Windows / macOS / Linux
|
||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
|
||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
|
||
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
|
||
# Chrome 139 — Windows / macOS / Linux
|
||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
|
||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
|
||
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
|
||
# Chrome 138 — Windows / macOS / Linux
|
||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
|
||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
|
||
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
|
||
# Edge 138 — Windows / macOS
|
||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0",
|
||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
|
||
"(KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0",
|
||
# Firefox 140 — Windows / macOS / Linux
|
||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) "
|
||
"Gecko/20100101 Firefox/140.0",
|
||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:140.0) "
|
||
"Gecko/20100101 Firefox/140.0",
|
||
"Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0",
|
||
# Safari 18 — macOS(WebKit 指纹,应对 Chromium 针对性拦截)
|
||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 "
|
||
"(KHTML, like Gecko) Version/18.0 Safari/605.1.15",
|
||
]
|