diff --git a/app.py b/app.py index de501cd..9c8b298 100644 --- a/app.py +++ b/app.py @@ -218,7 +218,7 @@ try: sitekey = await turnstile_element.get_attribute('data-sitekey') turnstile_frame = await page.query_selector('iframe[src*="turnstile"]') if turnstile_frame and sitekey: - captcha_type = "TurnstileTask" + captcha_type = "AntiTurnstileTaskProxyLess" if not sitekey or not captcha_type: return ActionResult( @@ -319,7 +319,7 @@ try: include_in_memory=True ) - elif captcha_type == "TurnstileTask": + elif captcha_type == "AntiTurnstileTaskProxyLess": token = solution.get("token") if token: await page.evaluate(f'''(token) => {{ @@ -438,7 +438,7 @@ async def solve_captcha_with_capsolver(page, capsolver_api_key: str) -> bool: if sitekey: turnstile_frame = await page.query_selector('iframe[src*="turnstile"]') if turnstile_frame: - captcha_type = "TurnstileTask" + captcha_type = "AntiTurnstileTaskProxyLess" if not sitekey or not captcha_type: logger.info("No captcha found on page") @@ -507,7 +507,7 @@ async def solve_captcha_with_capsolver(page, capsolver_api_key: str) -> bool: await textarea.fill(h_captcha_response) logger.info("hCaptcha solved successfully!") return True - elif captcha_type == "TurnstileTask": + elif captcha_type == "AntiTurnstileTaskProxyLess": token = solution.get("token") if token: # Вставляем токен @@ -947,29 +947,28 @@ async def run_browser_task(task_id: str, task: str, max_steps: int, model: str): logger.info(f"[{task_id}] Using new Chrome on internal port {CHROME_INTERNAL_PORT}") # Инжектируем stealth-скрипты через CDP для дополнительной защиты - # Отключено: stealth-скрипты вызывают ошибки и ломают Cloudflare Turnstile - # try: - # import json - # stealth_script_path = "/app/stealth-extension/stealth.js" - # if os.path.exists(stealth_script_path): - # with open(stealth_script_path, 'r') as f: - # stealth_js = f.read() - # - # # Получаем список целей (вкладок) через CDP - # response = urllib.request.urlopen(f"{cdp_url}/json/list", timeout=5) - # targets = json.loads(response.read().decode()) - # - # for target in targets: - # if target.get('type') == 'page': - # ws_url = target.get('webSocketDebuggerUrl') - # if ws_url: - # logger.info(f"[{task_id}] Injecting stealth scripts via CDP into {target.get('url', 'unknown')}") - # - # logger.info(f"[{task_id}] Stealth extension loaded + CDP stealth injection ready") - # else: - # logger.warning(f"[{task_id}] Stealth script not found at {stealth_script_path}") - # except Exception as e: - # logger.warning(f"[{task_id}] CDP stealth injection failed (extension should still work): {e}") + try: + import json + stealth_script_path = "/app/stealth-extension/stealth.js" + if os.path.exists(stealth_script_path): + with open(stealth_script_path, 'r') as f: + stealth_js = f.read() + + # Получаем список целей (вкладок) через CDP + response = urllib.request.urlopen(f"{cdp_url}/json/list", timeout=5) + targets = json.loads(response.read().decode()) + + for target in targets: + if target.get('type') == 'page': + ws_url = target.get('webSocketDebuggerUrl') + if ws_url: + logger.info(f"[{task_id}] Injecting stealth scripts via CDP into {target.get('url', 'unknown')}") + + logger.info(f"[{task_id}] Stealth extension loaded + CDP stealth injection ready") + else: + logger.warning(f"[{task_id}] Stealth script not found at {stealth_script_path}") + except Exception as e: + logger.warning(f"[{task_id}] CDP stealth injection failed (extension should still work): {e}") # Подключаемся через CDP browser = Browser(cdp_url=cdp_url) diff --git a/docker-compose.yml b/docker-compose.yml index 6d463e8..5922578 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,6 +21,8 @@ services: # CapSolver для автоматического решения капчи (Turnstile, reCAPTCHA, hCaptcha) - CAPSOLVER_API_KEY=${CAPSOLVER_API_KEY:-} - AUTO_SOLVE_CAPTCHA=${AUTO_SOLVE_CAPTCHA:-false} + # ВАЖНО! Прокси обязательна для Turnstile! Без прокси Cloudflare детектит бота + - PROXY_URL=${PROXY_URL:-} volumes: - /home/nafer/dokploy_data/browser-use:/app/browser-data shm_size: '4gb'