40 lines
885 B
Python
40 lines
885 B
Python
"""Shared browser response value objects and challenge detection."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class BrowserResponse:
|
|
status: int
|
|
body: str
|
|
challenge: str = ""
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class BrowserMediaResponse:
|
|
status: int
|
|
content_type: str
|
|
body_base64: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class BrowserLoginQRResponse:
|
|
content_type: str
|
|
body_base64: str
|
|
qr_detected: bool
|
|
|
|
|
|
def detect_challenge(status: int, body: str) -> str:
|
|
if status == 429:
|
|
return ""
|
|
if status == 412:
|
|
return "captcha"
|
|
lowered = body.lower()
|
|
if any(token in lowered for token in ("captcha", "verify_code", "验证码")):
|
|
return "captcha"
|
|
if any(token in lowered for token in ("device_verify", "device_check", "设备验证")):
|
|
return "device"
|
|
return ""
|