Utiliser un solveur de CAPTCHA avec Selenium
Utilisez solvethree pour obtenir un jeton reCAPTCHA Enterprise, puis utilisez Selenium pour insérer solution.token dans le formulaire de votre application et l’envoyer. Le SDK résout la tâche ; il ne remplit pas le formulaire du navigateur à votre place.
L’exemple utilise un formulaire HTTPS avec un champ de jeton et un bouton d’envoi. Adaptez ces sélecteurs à l’application que vous testez.
Sur cette page
Préparer le formulaire et l’environnement Python
- 1.
Installer les dépendances
Utilisez Python 3.10 ou une version ultérieure avec Chrome. Installez le paquet
seleniumvia pip, puis installez le SDK Python officiel de solvethree à partir de son fichier wheel téléchargeable. Suivez les instructions d’installation par téléchargement direct dans l’intégration Python ; ne les remplacez pas par une installation supposée depuis un registre de paquets. - 2.
Configurer le profil cible
Configurez le nom d’hôte du formulaire que vous contrôlez dans la console solvethree et assurez-vous que son profil est actif pour votre espace de travail. L’envoi d’un nom d’hôte dans une tâche ne crée pas ce profil. L’exemple demande l’action
login; modifiez-la si votre application utilise une autre action. - 3.
Définir les variables d’environnement
Définissez
TARGET_URLsur l’URL HTTPS complète de votre formulaire,SOLVETHREE_PROXYsur l’URL de votre proxy HTTP ou HTTPS etSOLVETHREE_API_KEYsur la clé API de votre espace de travail. Conservez la clé dans le processus Python, et non dans le JavaScript de la page.
Résoudre d’abord, puis démarrer Chrome avec l’identité renvoyée
Cet exemple Chrome nécessite un proxy autorisant l’accès par liste blanche d’adresses IP, sans nom d’utilisateur ni mot de passe. Il rejette les URL de proxy contenant des identifiants et ne met pas en œuvre la configuration d’un proxy authentifié.
La tâche utilise le nom d’hôte extrait de TARGET_URL, l’action login et un proxy. Une fois que solve renvoie un résultat prêt, Chrome démarre avec ce même proxy et la valeur userAgent renvoyée. Avant la navigation, l’exemple définit également l’en-tête secChUa renvoyé.
# Install selenium and the official solvethree Python SDK first.
import os
from urllib.parse import urlsplit
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from solvethree import Solvethree
target = os.environ["TARGET_URL"] # Your configured HTTPS form page.
proxy_url = os.environ["SOLVETHREE_PROXY"]
proxy = urlsplit(proxy_url)
if proxy.username or proxy.password:
raise ValueError("This Chrome example requires an IP-allowlisted proxy without URL credentials")
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
result = client.solve({"site": urlsplit(target).hostname, "action": "login", "proxy": proxy_url})
solution = result["solution"]
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=" + proxy_url)
options.add_argument("--user-agent=" + solution["userAgent"])
driver = webdriver.Chrome(options=options)
try:
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {
"headers": {"sec-ch-ua": solution["secChUa"]}
})
driver.get(target)
# Adapt the field and button to your application's form contract.
field = WebDriverWait(driver, 20).until(
lambda browser: browser.find_element(By.NAME, "g-recaptcha-response")
)
driver.execute_script("""
arguments[0].value = arguments[1];
arguments[0].dispatchEvent(new Event('input', {bubbles:true}));
""", field, solution["token"])
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
# Check your application's success response here.
finally:
driver.quit()Solvethree.solve crée la tâche une seule fois et interroge son état jusqu’à ce qu’elle soit prête ou qu’une exception soit levée. Le navigateur n’accède au formulaire qu’ensuite. Le script attend le champ de jeton, affecte solution.token, déclenche un événement de saisie et clique sur le bouton d’envoi. Chrome est fermé dans le bloc finally.
Adapter les hypothèses du formulaire de démonstration
TARGET_URLest la page du formulaire de votre application. Le champsitede la tâche est son nom d’hôte, et non l’URL complète ; les requêtes reCAPTCHA n’utilisent pas de champurloutype.loginest l’action de l’exemple. Remplacez-la par l’action utilisée par l’application et son profil configuré.By.NAMEavecg-recaptcha-responselocalise la zone de texte de démonstration. Utilisez le champ ou le paramètre d’envoi que votre application lit réellement. L’affectation de la valeur et le déclenchement d’un événement de saisie constituent le transfert de la démonstration, et non une fonction de rappel reCAPTCHA universelle.button[type="submit"]identifie le bouton d’envoi de la démonstration. Remplacez-le par un sélecteur non ambigu pour votre formulaire et conservez le comportement requis par l’application concernant la session, la protection CSRF et les fonctions de rappel.
L’attente explicite de 20 secondes de l’exemple vérifie uniquement que la zone de texte existe. Après avoir cliqué sur le bouton d’envoi, ajoutez une attente conditionnelle portant sur le résultat réel de votre application, comme son état de réussite ou une erreur de validation. Utilisez une limite de temps globale pour le parcours dans le navigateur, distincte du délai d’expiration du solveur ; ne remplacez pas les vérifications d’état par des pauses fixes et ne mélangez pas sans précaution les attentes implicites et explicites.
Vérifier l’étape en échec avant d’acheter une autre résolution
- La tâche de résolution échoue avant le démarrage de Chrome.
Inspectez les champs errorCode et error de la tâche arrivée à un état final. Distinguez une tâche en échec d’une erreur de requête HTTP.
Essayez ceci : Corrigez le problème signalé concernant les données d’entrée, le profil ou la connectivité avant de réessayer. Arrêtez d’interroger une tâche en échec ; une nouvelle requête ne corrigera pas des données d’entrée invalides restées inchangées.
- Selenium atteint le délai d’expiration en recherchant la zone de texte.
Vérifiez que Chrome a atteint le formulaire prévu et que la page contient bien le champ nommé utilisé dans la démonstration.
Essayez ceci : Remplacez le localisateur de démonstration par le mécanisme de transfert du jeton de votre application et attendez l’état qui le rend disponible. Un délai plus long ne corrigera pas un sélecteur incorrect.
- Le jeton est prêt, mais l’application rejette l’envoi.
Inspectez d’abord la requête sortante de l’application. Vérifiez qu’elle contient solution.token, et non l’identifiant de la tâche ou une ancienne valeur, et que l’action, le proxy, l’identité du navigateur et la session correspondent au flux prévu.
Essayez ceci : Corrigez le paramètre envoyé ou les exigences de l’application avant de demander un autre jeton. Une tâche prête fournit une solution ; c’est la réponse de l’application qui détermine si la soumission a été acceptée.
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.