""" Тест создания браузера Camoufox с разными параметрами. Запуск: python test_browser.py """ import asyncio import time from camoufox.async_api import AsyncCamoufox from camoufox import DefaultAddons PROXY = None # Вставь прокси если нужно: "http://127.0.0.1:PORT" async def try_browser(label: str, **kwargs) -> bool: t = time.time() try: async with AsyncCamoufox(**kwargs) as browser: page = await browser.new_page() await page.goto("about:blank", timeout=10000) await page.close() elapsed = time.time() - t print(f" ✅ {label} ({elapsed:.1f}s)") return True except ValueError as e: print(f" ❌ {label} — fingerprint error: {e}") return False except Exception as e: print(f" ⚠️ {label} — {type(e).__name__}: {str(e)[:80]}") return False async def main(): base = dict(headless=True, exclude_addons=[DefaultAddons.UBO]) proxy_kwargs = {"proxy": {"server": PROXY}} if PROXY else {} print("\n=== Без прокси ===") tests_no_proxy = [ ("geoip=False, locale=ru-RU", dict(geoip=False, locale="ru-RU")), ("geoip=False, locale=en-US", dict(geoip=False, locale="en-US")), ("geoip=True", dict(geoip=True)), ("geoip=True, locale=ru-RU", dict(geoip=True, locale="ru-RU")), ("geoip=True, locale=en-US", dict(geoip=True, locale="en-US")), ("geoip=True, os=windows", dict(geoip=True, os="windows")), ] for label, kwargs in tests_no_proxy: await try_browser(label, **base, **kwargs) if PROXY: print(f"\n=== С прокси ({PROXY}) ===") tests_proxy = [ ("geoip=True", dict(geoip=True)), ("geoip=True, locale=ru-RU", dict(geoip=True, locale="ru-RU")), ("geoip=True, locale=en-US", dict(geoip=True, locale="en-US")), ("geoip=True, os=windows", dict(geoip=True, os="windows")), ("geoip=False, locale=ru-RU", dict(geoip=False, locale="ru-RU")), ("geoip=False, locale=en-US", dict(geoip=False, locale="en-US")), ] for label, kwargs in tests_proxy: await try_browser(label, **base, **proxy_kwargs, **kwargs) print("\n=== Версия camoufox бинарника ===") try: from camoufox._utils import BROWSER_VERSION print(f" Firefox version: {BROWSER_VERSION}") except ImportError: try: import subprocess, re result = subprocess.run( ["python3", "-c", "from camoufox.fingerprints import FP_GENERATOR; print(FP_GENERATOR)"], capture_output=True, text=True ) print(f" FP_GENERATOR: {result.stdout.strip()}") except Exception as e: print(f" Не удалось определить: {e}") print("\n=== Fingerprint generation напрямую ===") from camoufox.fingerprints import generate_fingerprint fp_tests = [ ("без параметров", {}), ("locale=ru-RU", {"locale": "ru-RU"}), ("locale=en-US", {"locale": "en-US"}), ("locale=ru-Cyrl-RU", {"locale": "ru-Cyrl-RU"}), ("os=windows, locale=ru-RU", {"os": "windows", "locale": "ru-RU"}), ("os=windows, locale=en-US", {"os": "windows", "locale": "en-US"}), ] for label, kwargs in fp_tests: try: fp = generate_fingerprint(**kwargs) print(f" ✅ generate_fingerprint({label})") except ValueError as e: print(f" ❌ generate_fingerprint({label}) — {e}") print("\n=== Firefox версия vs база browserforge ===") try: from browserforge.fingerprints.generator import FingerprintGenerator gen = FingerprintGenerator() for version in range(120, 145): try: gen.generate(browser={"name": "firefox", "minVersion": version, "maxVersion": version}) print(f" ✅ firefox {version}") except (ValueError, Exception): print(f" ❌ firefox {version}") except Exception as e: print(f" Ошибка: {e}") print("\n=== Патч generate_fingerprint в camoufox.utils ===") import camoufox.utils as _cu _orig_gf = _cu.generate_fingerprint def _relaxed(**config): try: return _orig_gf(**config) except ValueError: config.pop("screen", None) try: return _orig_gf(**config) except ValueError: return _orig_gf(locale=config.get("locale", "en-US")) _cu.generate_fingerprint = _relaxed print(" Патч применён, пробуем AsyncCamoufox...") ok = await try_browser("geoip=False, locale=ru-RU (с патчем)", **base, geoip=False, locale="ru-RU") if ok: print(" ✅ Патч работает — проблема в constraints camoufox") else: print(" ❌ Патч не помог — проблема глубже") print("\n=== Geoip данные ===") from camoufox.utils import get_geolocation ips = ["127.0.0.1"] if PROXY: host = PROXY.replace("http://", "").split(":")[0] if host not in ("127.0.0.1", "localhost"): ips.append(host) import urllib.request try: ext = urllib.request.urlopen("https://api.ipify.org", timeout=5).read().decode() ips.append(ext) except Exception: pass for ip in ips: try: geo = get_geolocation(ip) print(f" {ip}: lang={geo.locale.language} region={geo.locale.region} script={geo.locale.script} tz={geo.timezone}") except Exception as e: print(f" {ip}: ошибка — {e}") if __name__ == "__main__": asyncio.run(main())