"""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, а не блоком. """