Сценарии использования

Обработка CAPTCHA драматурга с помощью CaptchaAI

Playwright обеспечивает надежную автоматизацию браузеров в Chromium, Firefox и WebKit. Когда целевые страницы обрабатывают CAPTCHA, CaptchaAI решает их на стороне сервера, а Playwright обрабатывает взаимодействие с браузером.

Требования

Требование Подробности
Питон pip install playwright requests, затем playwright install
Node.js npm install playwright axios
CaptchaAI API-ключ Отcaptchaai.com

Python: Драматург + CaptchaAI

Настраивать

from playwright.sync_api import sync_playwright
import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_recaptcha(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": site_key,
        "pageurl": page_url
    })
    if not resp.text.startswith("OK|"):
        raise Exception(resp.text)
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)
    raise TimeoutError()

Полный пример

def login_with_captcha(url, username, password):
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        context = browser.new_context(
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        )
        page = context.new_page()
        page.goto(url)

        # Fill login form
        page.fill("#username", username)
        page.fill("#password", password)

        # Check for reCAPTCHA
        recaptcha = page.query_selector(".g-recaptcha")
        if recaptcha:
            site_key = recaptcha.get_attribute("data-sitekey")
            print(f"Solving reCAPTCHA: {site_key}")

            token = solve_recaptcha(site_key, page.url)

            # Inject token
            page.evaluate(f"""
                document.getElementById('g-recaptcha-response').innerHTML = '{token}';
                document.getElementById('g-recaptcha-response').style.display = '';
            """)

        # Submit
        page.click('button[type="submit"]')
        page.wait_for_load_state("networkidle")

        print(f"Current URL: {page.url}")
        content = page.content()

        browser.close()
        return content

result = login_with_captcha(
    "https://https://staging.example.com/qa-login",
    "user@example.com",
    "password123"
)

Асинхронная версия

from playwright.async_api import async_playwright
import aiohttp
import asyncio

async def solve_recaptcha_async(site_key, page_url):
    async with aiohttp.ClientSession() as session:
        params = {
            "key": API_KEY, "method": "userrecaptcha",
            "googlekey": site_key, "pageurl": page_url
        }
        async with session.get("https://ocr.captchaai.com/in.php", params=params) as resp:
            text = await resp.text()
            task_id = text.split("|")[1]

        for _ in range(60):
            await asyncio.sleep(5)
            params = {"key": API_KEY, "action": "get", "id": task_id}
            async with session.get("https://ocr.captchaai.com/res.php", params=params) as resp:
                text = await resp.text()
                if text == "CAPCHA_NOT_READY": continue
                if text.startswith("OK|"): return text.split("|")[1]
                raise Exception(text)
        raise TimeoutError()

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto("https://example.com/form")

        site_key = await page.get_attribute(".g-recaptcha", "data-sitekey")
        token = await solve_recaptcha_async(site_key, page.url)

        await page.evaluate(f"document.getElementById('g-recaptcha-response').innerHTML = '{token}'")
        await page.click('button[type="submit"]')
        await browser.close()

asyncio.run(main())

Node.js: Драматург + CaptchaAI

const { chromium } = require("playwright");
const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

async function solveRecaptcha(siteKey, pageUrl) {
  const submit = await axios.get("https://ocr.captchaai.com/in.php", {
    params: {
      key: API_KEY,
      method: "userrecaptcha",
      googlekey: siteKey,
      pageurl: pageUrl,
    },
  });
  const taskId = submit.data.split("|")[1];

  while (true) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId },
    });
    if (result.data === "CAPCHA_NOT_READY") continue;
    if (result.data.startsWith("OK|")) return result.data.split("|")[1];
    throw new Error(result.data);
  }
}

(async () => {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto("https://https://staging.example.com/qa-login");

  // Fill form
  await page.fill("#username", "user@example.com");
  await page.fill("#password", "password123");

  // Solve CAPTCHA
  const siteKey = await page.getAttribute(".g-recaptcha", "data-sitekey");
  if (siteKey) {
    const token = await solveRecaptcha(siteKey, page.url());
    await page.evaluate(
      (t) => (document.getElementById("g-recaptcha-response").innerHTML = t),
      token
    );
  }

  // Submit
  await page.click('button[type="submit"]');
  await page.waitForLoadState("networkidle");

  console.log("Logged in:", page.url());
  await browser.close();
})();

Обработка Cloudflare Turnstile

# Detect Turnstile
turnstile = page.query_selector(".cf-turnstile")
if turnstile:
    site_key = turnstile.get_attribute("data-sitekey")

    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY, "method": "turnstile",
        "sitekey": site_key, "pageurl": page.url
    })
    task_id = resp.text.split("|")[1]

    # Poll and inject...

Драматург против Селена против Puppeteer

Особенность Драматург Селен Puppeteer
Языки Python, Node.js, C#, Java Питон, Java, C#, Руби, JS Node.js
Браузеры Хром, Фаерфокс, ВебКит Хром, Фаерфокс, Край, Сафари Хром
Авто-ожидание ✅ Встроенный ⏳ Ручное ожидание šï¸ Частичный
Сетевой перехват šï¸ Limited
Интеграция CaptchaAI ✅ Тот же API ✅ Тот же API ✅ Тот же API

CaptchaAI работает одинаково со всеми тремя — извлекает ключ сайта, решает через API, внедряет токен.

Поиск неисправностей

Проблема Исправить
page.query_selector возвращает ноль CAPTCHA загружается динамически; используйте page.wait_for_selector()
передача токена во внутренний QA endpoint не работает Проверьте, имеет ли текстовое поле ответа другой идентификатор.
Драматург вылетает в Docker Установите зависимости браузера: playwright install-deps
Капча появляется снова после решения Сайт может потребовать выполнения обратного вызова; запустить его через page.evaluate()

Часто задаваемые вопросы

Помогает ли автоожидание Playwright с CAPTCHA?

Автоматическое ожидание Playwright обеспечивает видимость элементов перед взаимодействием, но не решает CAPTCHA. Для фактического решения вам понадобится CaptchaAI.

Могу ли я использовать Playwright со всеми типами CAPTCHA?

Да. CaptchaAI выполняет решение через API — Драматургу просто нужно извлечь ключ сайта и ввести токен. Это работает для reCAPTCHA, Turnstile, hCaptcha и всех других поддерживаемых типов.

Является ли Playwright подходящий Selenium для автоматизации CAPTCHA?

Встроенная функция автоматического ожидания Playwright и улучшенный дизайн API делают рабочие процессы CAPTCHA более надежными. Интеграция CaptchaAI идентична для обоих.

Связанные руководства

  • Обработка Selenium CAPTCHA с помощью Python
  • Решение CAPTCHA Puppeteer с помощью Node.js
  • Автоматический вход в систему, обработка CAPTCHA
Комментарии для этой статьи отключены.