27 lines
1.4 KiB
Python
27 lines
1.4 KiB
Python
"""DomClick-specific exceptions для anti-bot detection."""
|
||
|
||
|
||
class DomClickBlockedError(Exception):
|
||
"""DomClick BFF вернул QRATOR block-страницу (HTTP 200 + block HTML).
|
||
|
||
QRATOR (qrator.net) — WAF/DDoS-защита domclick.ru. Блокирует datacenter-IP
|
||
и возвращает HTML с маркерами: "qrator", "bot_mitigation", "система защиты",
|
||
"403 | домклик", "captcha", "access denied".
|
||
|
||
Обходится через shared mobile proxy (BrowserFetcher(source="domclick") →
|
||
generic provider → мобильный egress).
|
||
"""
|
||
|
||
|
||
class DomClickParseError(Exception):
|
||
"""DomClick detail-карточка получена (HTTP 200, не block), но SSR-стейт
|
||
не извлекается / не парсится.
|
||
|
||
Возникает в Layer B (domclick_detail.py) когда:
|
||
- `window.__SSR_STATE__` не найден в HTML (но это и не challenge-страница);
|
||
- object-литерал не сбалансирован по скобкам;
|
||
- json.loads падает после санитайза bare `undefined` → `null`.
|
||
|
||
В отличие от DomClickBlockedError (anti-bot), это сигнал дрейфа схемы карточки
|
||
или повреждённого ответа — оркестратор считает его parse-failure, а не блоком.
|
||
"""
|