From 638c7a961890700b8632358e0748e5bdd26731b9 Mon Sep 17 00:00:00 2001 From: protokey Date: Thu, 10 Sep 2026 22:05:47 +0400 Subject: [PATCH] =?UTF-8?q?chore!:=20=D0=BF=D1=80=D0=B8=D0=BA=D1=80=D1=83?= =?UTF-8?q?=D1=87=D0=B8=D0=B2=D0=B0=D1=8E=20=D0=BF=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BD=D1=82=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=82=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main.py b/src/main.py index f9c97e3..2d577c3 100644 --- a/src/main.py +++ b/src/main.py @@ -34,13 +34,17 @@ def parse_proxy(proxy_url: str) -> ProxySettings: return settings -def load_or_create_identity(user_data_dir, os=None, ff_version=None, locale=None, time_zone=None) -> dict: +def load_or_create_identity(user_data_dir, os=None, ff_version=None, locale=None, time_zone=None, user_agent=None) -> dict: identity_file = user_data_dir / IDENTITY_FILE if identity_file.exists(): return json.loads(identity_file.read_text()) - # один вызов -> config (для браузера) + context_options/init_script (для контекста) + kwargs = {} + if user_agent: + os, ff_version = parse_os_and_ff(user_agent) + kwargs["config_overrides"] = {"navigator.UserAgent": user_agent} + fp = generate_context_fingerprint(os=os, ff_version=ff_version, locale=locale, timezone=time_zone) identity_file.write_text(json.dumps(fp)) return fp @@ -57,12 +61,12 @@ async def root(): _OS_MAP = {'win': 'windows', 'mac': 'macos', 'lin': 'linux'} -def parse_os_and_ff(user_agent): +def parse_os_and_ff(user_agent) -> tuple[str, str]: os_name = _OS_MAP[determine_ua_os(user_agent)] parsed = user_agent_parser.ParseUserAgent(user_agent) ff_version = int(parsed["major"]) if ( - parsed.get("family") == "Firefox" and parsed.get("major")) else None - return os_name, ff_version + parsed.get("family") == "Firefox" and parsed.get("major")) else 150 + return os_name, str(ff_version) @app.post("/v1/solve") @@ -98,27 +102,19 @@ async def solve( if not user_data_dir.exists(): user_data_dir.mkdir(parents=True) - browser_options = { + ctx_opts = { # "locale": payload.locale, # "timezone": payload.time_zone } - ctx_opts = {} - if payload.user_agent: - os, ff_version = parse_os_and_ff(payload.user_agent) - ctx_opts["config"] = {'navigator.UserAgent': payload.user_agent} - else: - os = ff_version = None - config = load_or_create_identity(user_data_dir, os=os, ff_version=ff_version, **browser_options) + config = load_or_create_identity(user_data_dir, payload.user_agent, **ctx_opts) - ctx_opts = {**config["context_options"], **browser_options} + ctx_opts = {**config["context_options"], "config": config["config"]} async with AsyncCamoufox( persistent_context=True, user_data_dir=user_data_dir, proxy=proxy, window=scr_size, - os=os, - ff_version=ff_version, **ctx_opts, ) as camoufo: await camoufo.add_init_script(config["init_script"])