Casos de Uso

Manipulação de CAPTCHA do dramaturgo com CaptchaAI

Playwright fornece automação confiável de navegador em Chromium, Firefox e WebKit. Quando as páginas de destino atendem CAPTCHAs, CaptchaAI os resolve no lado do servidor enquanto o Playwright cuida da interação do navegador.

Requisitos

Requisito Detalhes
Pitão pip install playwright requests e depois playwright install
Node.js npm install playwright axios
Chave de API CaptchaAI Decaptchaai.com

Python: Dramaturgo + CaptchaAI

Configuração

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()

Exemplo completo

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://staging.example.com/qa-login",
    "user@example.com",
    "password123"
)

Versão assíncrona

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: Dramaturgo + 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://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();
})();

Tratamento de 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...

Dramaturgo vs Selênio vs Titereiro

Recurso Dramaturgo Selênio Puppeteer
Idiomas Python, Node.js, C#, Java Python, Java, C#, Ruby, JS Node.js
Navegadores Cromo, Firefox, WebKit Cromo, Raposa de fogo, Borda, Safári Cromo
Espera automática ✅ Embutido ⏳ Esperas manuais ⚠️ Parcial
Interceptação de rede ⚠️ Limitado
Integração CaptchaAI ✅ Mesma API ✅ Mesma API ✅ Mesma API

CaptchaAI funciona de forma idêntica com todos os três – extrair a chave do site, resolver via API, injetar o token.

Solução de problemas

Problema Correção
page.query_selector retorna nulo CAPTCHA carrega dinamicamente; usar page.wait_for_selector()
A envio controlado ao endpoint QA não funciona Verifique se a área de texto da resposta possui um ID diferente
O dramaturgo trava no Docker Instale as dependências do navegador: playwright install-deps
CAPTCHA reaparece após resolver O site pode exigir execução de retorno de chamada; acione-o via page.evaluate()

Perguntas frequentes

A espera automática do Playwright ajuda com CAPTCHAs?

A espera automática do Playwright garante que os elementos fiquem visíveis antes da interação, mas não resolverá CAPTCHAs. Você precisa de CaptchaAI para a solução real.

Posso usar o Playwright com todos os tipos de CAPTCHA?

Sim. CaptchaAI cuida da solução via API - o Playwright só precisa extrair a chave do site e injetar o token. Isso funciona para reCAPTCHA, Turnstile, hCaptcha e todos os outros tipos suportados.

O Playwright é mais adequado que o Selenium para automação CAPTCHA?

A espera automática integrada do Playwright e o mais adequado design da API tornam os fluxos de trabalho CAPTCHA mais confiáveis. A integração CaptchaAI é idêntica para ambos.

Guias Relacionados

Os comentários estão desativados para este artigo.