Cas d'Usage

Dramaturge Gestion des CAPTCHA avec CaptchaAI

Playwright fournit une automatisation fiable du navigateur sur Chromium, Firefox et WebKit. Lorsque les pages cibles diffusent des CAPTCHA, CaptchaAI les résout côté serveur tandis que Playwright gère l'interaction du navigateur.

Exigences

Exigence Détails
Python pip install playwright requests puis playwright install
Noeud.js npm install playwright axios
Clé API CaptchaAI Depuiscaptchaai.com

Python : Dramaturge + CaptchaAI

Configuration

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

Exemple complet

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

Version asynchrone

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 : dramaturge + 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://example.com/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();
})();

Gestion 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...

Dramaturge contre Sélénium contre Marionnettiste

Caractéristique Dramaturge Sélénium Marionnettiste
Langues Python, Node.js, C#, Java Python, Java, C#, Ruby, JS Noeud.js
Navigateurs Chrome, Firefox, WebKit Chrome, Firefox, Bord, Safari Chrome
Attente automatique ✅ Intégré ⏳ Attentes manuelles ⚠️ Partielle
Interception de réseau ⚠️ Limité
Intégration CaptchaAI ✅ Même API ✅ Même API ✅ Même API

CaptchaAI fonctionne de manière identique avec les trois : extrayez la clé du site, résolvez via l'API, injectez le jeton.

Dépannage

Problème Corriger
page.query_selector renvoie null CAPTCHA se charge dynamiquement ; utiliser page.wait_for_selector()
L'injection de jetons ne fonctionne pas Vérifiez si la zone de texte de réponse a un identifiant différent
Le dramaturge plante dans Docker Installer les dépendances du navigateur : playwright install-deps
CAPTCHA réapparaît après résolution Le site peut nécessiter l'exécution d'un rappel ; déclenchez-le via page.evaluate()

FAQ

L'attente automatique de Playwright est-elle utile avec les CAPTCHA ?

L'attente automatique de Playwright garantit que les éléments sont visibles avant d'interagir, mais elle ne résoudra pas les CAPTCHA. Vous avez besoin de CaptchaAI pour la résolution proprement dite.

Puis-je utiliser Playwright avec tous les types CAPTCHA ?

Oui. CaptchaAI gère la résolution via l'API - Playwright a juste besoin d'extraire la clé du site et d'injecter le jeton. Cela fonctionne pour reCAPTCHA, Turnstile, hCaptcha et tous les autres types pris en charge.

Playwright est-il meilleur que Selenium pour l'automatisation du CAPTCHA ?

L'attente automatique intégrée de Playwright et une meilleure conception de l'API rendent les flux de travail CAPTCHA plus fiables. L'intégration CaptchaAI est identique pour les deux.

Guides connexes

  • Gestion du CAPTCHA Selenium avec Python
  • Résolution de CAPTCHA par le marionnettiste avec Node.js
  • Gestion des CAPTCHA de connexion automatisée
Les commentaires sont désactivés pour cet article.