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