152 lines
5.9 KiB
Python
152 lines
5.9 KiB
Python
"""
|
||
Тест создания браузера 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())
|