Envoyer une solution CAPTCHA avec Playwright pour Python
Résolvez d’abord le CAPTCHA, puis créez un contexte Playwright avec le même proxy et l’identité de navigateur renvoyée. Soumettez solution.token via le champ que votre application envoie réellement.
L’exemple ci-dessous soumet un formulaire sur une page que vous contrôlez. Il attend la réponse POST de l’application ; il n’intercepte pas reCAPTCHA et ne dépend pas d’une fonction de rappel CAPTCHA universelle.
Sur cette page
Préparer la cible et l’environnement
Utilisez Python 3.10+, installez Playwright et son navigateur Chromium, puis installez le paquet wheel officiel du SDK Python solvethree. Conservez la clé API de l’espace de travail dans le processus Python, pas dans le JavaScript du navigateur.
TARGET_URL: l’URL complète de la page de votre formulaire. L’exemple en extrait le nom d’hôte pour la demande de résolution.SOLVETHREE_PROXY: l’URL du proxy, avec les identifiants d’authentification si nécessaire. Le même proxy est utilisé pour la résolution et le trafic du navigateur.SOLVETHREE_API_KEY: votre clé API d’espace de travail.
Le nom d’hôte cible doit disposer d’un profil actif accessible à votre espace de travail. Configurez le profil du site avant d’exécuter l’exemple. Remplacez l’action login de l’exemple par celle requise par votre intégration ; l’envoi d’un nom d’hôte et d’une action ne crée pas de profil. La requête utilise reCAPTCHA Enterprise v3 par défaut.
Résoudre, configurer Chromium et soumettre
# Install playwright and the official Python SDK; run playwright install chromium.
import asyncio
import os
from urllib.parse import urlsplit, unquote
from playwright.async_api import async_playwright
from solvethree import Solvethree
async def main():
target = os.environ["TARGET_URL"]
proxy = urlsplit(os.environ["SOLVETHREE_PROXY"])
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
task = {"site": urlsplit(target).hostname, "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
result = await asyncio.to_thread(client.solve, task, timeout=180)
solution = result["solution"]
async with async_playwright() as playwright:
browser = await playwright.chromium.launch()
try:
netloc = proxy.netloc.rsplit("@", 1)[-1]
context = await browser.new_context(
proxy={"server": f"{proxy.scheme}://{netloc}", "username": unquote(proxy.username or ""), "password": unquote(proxy.password or "")},
user_agent=solution["userAgent"], extra_http_headers={"sec-ch-ua": solution["secChUa"]})
page = await context.new_page()
await page.goto(target)
field = page.locator('[name="g-recaptcha-response"]')
await field.wait_for(state="attached")
await field.evaluate("(field, token) => { field.value=token; field.dispatchEvent(new Event('input',{bubbles:true})); }", solution["token"])
async with page.expect_response(lambda r: r.request.method == "POST" and urlsplit(r.url).netloc == urlsplit(target).netloc) as outcome:
await page.get_by_role("button", name="Submit", exact=True).click()
print("Application HTTP status:", (await outcome.value).status)
# Check the application's actual response; adapt form/CSRF/session setup.
await context.close()
finally:
await browser.close()
asyncio.run(main())Solvethree est synchrone. Appeler client.solve via asyncio.to_thread évite que son opération de création et d’interrogation ne bloque la boucle d’événements de Playwright. Cet appel renvoie un résultat prêt ou lève une exception ; le SDK ne dispose pas de client asynchrone natif.
Le contexte du navigateur utilise solution.userAgent et solution.secChUa. L’exemple sépare également le serveur proxy de son nom d’utilisateur et de son mot de passe, et décode les identifiants avant de les transmettre à Playwright. Comme cette tâche utilise un seul proxy, il n’y a pas d’étape de sélection de candidat.
- 1.
Respecter le champ de jeton de l’application
L’exemple attend que le champ soit rattaché au document, lui affecte solution.token et déclenche un événement input. Il n’exige pas que le champ soit visible. Si votre application soumet un autre champ ou lit l’état du jeton ailleurs, adaptez ce transfert à sa requête sortante.
- 2.
Ajouter les prérequis de session du formulaire
L’exemple démarre avec un nouveau contexte de navigateur. Ajoutez la gestion de session, la préparation du formulaire ou le traitement CSRF requis par votre application avant la soumission.
- 3.
Attendre le bon POST
L’attente de réponse est enregistrée avant le clic sur Submit. Son prédicat correspond à une requête POST vers l’emplacement réseau de l’URL cible. Si la page y envoie d’autres requêtes POST, limitez le prédicat à votre point de terminaison de soumission.
Lire la réponse de l’application
L’état HTTP affiché confirme qu’une réponse correspondante est arrivée. Vérifiez le corps de la réponse de l’application ou l’état de la page obtenu pour déterminer si elle a accepté la soumission. Une tâche solvethree prête signifie qu’une solution a été générée, pas que la cible l’a acceptée.
- L’application rejette un jeton prêt.
Examinez la requête sortante du formulaire avant de payer pour une autre résolution.
Essayez ceci : Vérifiez qu’elle contient solution.token plutôt que l’identifiant de tâche ou une ancienne valeur. Vérifiez que la soumission utilise le proxy de la résolution, l’agent utilisateur et les indications client renvoyés, ainsi que la cible prévue.
- L’attente de réponse capture une requête sans rapport.
Comparez l’URL POST capturée avec le véritable point de terminaison du formulaire.
Essayez ceci : Rendez le prédicat de réponse spécifique à ce point de terminaison au lieu de faire correspondre tous les POST vers le même emplacement réseau.
- L’appel de résolution lève une exception avant la soumission par le navigateur.
Distinguez une erreur de requête HTTP d’une tâche ayant atteint un état d’échec terminal.
Essayez ceci : Traitez séparément les réponses HTTP autres que celles de réussite. Pour une tâche en échec, examinez errorCode et error et corrigez la cause plutôt que de réessayer avec des paramètres inchangés. La méthode solve du SDK s’arrête déjà en cas d’échec.
Sources et référence de l’API
Lancez votre première tâche.
Démarrez avec $5 de crédit dans votre espace de travail.