chore: попытка сохранить отпечатки браузера и загрузить их снова

This commit is contained in:
protokey committed 2026-09-10 21:45:56 +04:00
1 parent d9c74227bd
commit 623aaa2abc
1 file changed
+33 -10
+33 -10
View File
@@ -1,17 +1,18 @@
import json
import uuid import uuid
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import Annotated from typing import Annotated
from urllib.parse import urlsplit from urllib.parse import urlsplit
from browserforge.fingerprints import Screen
from camoufox.async_api import AsyncCamoufox from camoufox.async_api import AsyncCamoufox
from camoufox.fingerprints import generate_context_fingerprint
from camoufox.utils import determine_ua_os from camoufox.utils import determine_ua_os
from fastapi import Cookie from fastapi import Cookie
from fastapi import FastAPI from fastapi import FastAPI
from fastapi import Request from fastapi import Request
from fastapi import Response from fastapi import Response
from playwright.async_api import ViewportSize, ProxySettings from playwright.async_api import ProxySettings
from ua_parser import user_agent_parser from ua_parser import user_agent_parser
from engine import actions from engine import actions
@@ -33,6 +34,18 @@ def parse_proxy(proxy_url: str) -> ProxySettings:
return settings return settings
def load_or_create_identity(user_data_dir, os=None, ff_version=None, locale=None, time_zone=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 (для контекста)
fp = generate_context_fingerprint(os=os, ff_version=ff_version, locale=locale, timezone=time_zone)
identity_file.write_text(json.dumps(fp))
return fp
app = FastAPI() app = FastAPI()
@@ -81,24 +94,34 @@ async def solve(
# proxy = ProxySettings(socks5://host:port, username, password) # proxy = ProxySettings(socks5://host:port, username, password)
proxy = None proxy = None
browser_options = {}
if payload.user_agent:
os, ff_version = parse_os_and_ff(payload.user_agent)
browser_options["os"] = os
browser_options["ff_version"] = ff_version
browser_options["config"] = {'navigator.UserAgent': payload.user_agent}
user_data_dir = Path(__file__).parent / f"../extra/user_data_dir/{session_id}" user_data_dir = Path(__file__).parent / f"../extra/user_data_dir/{session_id}"
if not user_data_dir.exists(): if not user_data_dir.exists():
user_data_dir.mkdir(parents=True) user_data_dir.mkdir(parents=True)
browser_options = {
# "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)
ctx_opts = {**config["context_options"], **browser_options}
async with AsyncCamoufox( async with AsyncCamoufox(
persistent_context=True, persistent_context=True,
user_data_dir=user_data_dir, user_data_dir=user_data_dir,
proxy=proxy, proxy=proxy,
window=scr_size, window=scr_size,
**browser_options, os=os,
ff_version=ff_version,
**ctx_opts,
) as camoufo: ) as camoufo:
await camoufo.add_init_script(config["init_script"])
page = camoufo.pages[0] if camoufo.pages else await camoufo.new_page() page = camoufo.pages[0] if camoufo.pages else await camoufo.new_page()
page.set_default_timeout(30_000) page.set_default_timeout(30_000)
await page.goto(url=payload.url) await page.goto(url=payload.url)