Spaces:
Paused
Paused
| from playwright.sync_api import sync_playwright | |
| import random | |
| import time | |
| # ----------------------------- | |
| # Human-like delay | |
| # ----------------------------- | |
| def human_delay(min_ms=200, max_ms=800): | |
| time.sleep(random.uniform(min_ms / 1000, max_ms / 1000)) | |
| # ----------------------------- | |
| # Stealth browser launcher | |
| # ----------------------------- | |
| def launch_stealth_browser(headless=True): | |
| p = sync_playwright().start() | |
| browser = p.chromium.launch( | |
| headless=headless, | |
| args=[ | |
| "--disable-blink-features=AutomationControlled", | |
| "--disable-infobars", | |
| "--disable-dev-shm-usage", | |
| "--no-sandbox", | |
| "--disable-gpu", | |
| "--disable-extensions", | |
| ] | |
| ) | |
| context = browser.new_context( | |
| user_agent=random_user_agent(), | |
| viewport=random_viewport(), | |
| locale="en-US", | |
| timezone_id="America/New_York", | |
| permissions=["geolocation"], | |
| java_script_enabled=True, | |
| ) | |
| # Mask webdriver + automation traces | |
| context.add_init_script(""" | |
| Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); | |
| Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] }); | |
| Object.defineProperty(navigator, 'plugins', { | |
| get: () => [1, 2, 3, 4, 5] | |
| }); | |
| """) | |
| page = context.new_page() | |
| return p, browser, context, page | |
| # ----------------------------- | |
| # Random viewport | |
| # ----------------------------- | |
| def random_viewport(): | |
| return { | |
| "width": random.choice([1366, 1440, 1536, 1600, 1920]), | |
| "height": random.choice([768, 900, 1024, 1080]), | |
| } | |
| # ----------------------------- | |
| # High-quality user agents | |
| # ----------------------------- | |
| def random_user_agent(): | |
| return random.choice([ | |
| "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", | |
| "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15", | |
| "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", | |
| ]) | |
| # ----------------------------- | |
| # Cloudflare-aware navigation | |
| # ----------------------------- | |
| def stealth_goto(page, url): | |
| page.goto(url, wait_until="domcontentloaded", timeout=45000) | |
| human_delay(800, 1600) | |
| # Simulate small mouse movements | |
| for _ in range(random.randint(2, 5)): | |
| page.mouse.move( | |
| random.randint(100, 800), | |
| random.randint(100, 600), | |
| steps=random.randint(5, 20) | |
| ) | |
| human_delay(100, 300) | |
| # Scroll like human | |
| page.mouse.wheel(0, random.randint(300, 900)) | |
| human_delay(500, 1200) | |
| return page.content() | |
| # ----------------------------- | |
| # Close browser safely | |
| # ----------------------------- | |
| def close_browser(p, browser): | |
| try: | |
| browser.close() | |
| p.stop() | |
| except: | |
| pass |