feature!: параметр user_agent убран, UA всегда родной; docs/Usage.md

- user_agent в запросе → 422 с подсказкой брать UA из ответа: UA, отличный от реального
  Chrome, расходится с userAgentData и движком, Cloudflare такой браузер не пропускает
  (замер: родной 3/3, Chrome 147 и Windows — 0) (#87)
- профиль хранит только отпечаток (экран, DPR), UA не подменяется (#89)
- docs/Usage.md: практики для клиентов API — тот же UA и прокси, что у браузера, сессии,
  cookies, ошибки и повторы, таймауты, пример на httpx
- README, docs/API.md, docs/Introduction.md; тесты под новый контракт

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
protokeyandClaude Opus 5.5 committed 2026-10-13 18:19:08 +04:00
1 parent 0ae5b0c83f
commit fe509c25c3
11 files changed
+202 -125

No files matched your search

+11 -1
View File
@@ -66,7 +66,6 @@ class SolveRequest(BaseModel):
url: str
proxy: str | None = None
timeout: int | None = None
user_agent: str | None = None
cookies: list[dict[str, Any]] | None = None
# List[{name: str, value: str, domain: str, path: str, expires: float, httpOnly: bool, secure: bool, sameSite: Union["Lax", "None", "Strict"], partitionKey: Union[str, None]}]
@@ -89,6 +88,17 @@ class SolveRequest(BaseModel):
wait: int = 0
google_search: bool = False
@model_validator(mode="before")
@classmethod
def reject_browser_identity(cls, data):
# UA и размер окна задаёт сам браузер: подмена расходится с userAgentData и движком,
# и Cloudflare такой браузер не пропускает (см. docs/Usage.md)
if isinstance(data, dict) and "user_agent" in data:
raise ValueError(
"user_agent is not supported: take user_agent from the response instead (see docs/Usage.md)"
)
return data
@field_validator("proxy")
@classmethod
def check_proxy(cls, proxy: str | None) -> str | None: