CaptchaNo
[ INTÉGRATION ]

Solveur de captcha pour
Selenium

Résolvez le défi pendant l'exécution au lieu de faire échouer la tâche. Un exemple Python fonctionnel, et les trois points qui décident si votre token est accepté.

Selenium · Python
import time
import requests

CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}

def solve(task: dict) -> dict:
    """Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
    r = requests.post(
        "https://api.captchano.com/v1/solve",
        params={"wait": 60},
        json=task,
        headers=HEADERS,
        timeout=75,
    )
    data = r.json()
    # A solve can outlast the 60 s wait: poll the task until it finishes.
    while data.get("status") in ("queued", "solving"):
        time.sleep(5)
        data = requests.get(
            f"https://api.captchano.com/v1/task/{data['id']}",
            headers=HEADERS,
            timeout=30,
        ).json()
    if data.get("status") != "ready":
        raise RuntimeError(data.get("error") or data)
    return data["solution"]

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com/login")

sitekey = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-sitekey")
solution = solve({"type": "recaptcha_v2", "sitekey": sitekey, "url": driver.current_url})

driver.execute_script(
    "document.getElementById('g-recaptcha-response').value = arguments[0]",
    solution["token"],
)
driver.find_element(By.CSS_SELECTOR, "form").submit()

Ce qui décide si le token est accepté

  1. Transmettez votre proxy. Le token doit être généré derrière la même IP de sortie que celle qui le soumet. Pour les systèmes qui notent la session, c'est obligatoire, pas une simple optimisation.
  2. Utilisez le même user agent. Turnstile et plusieurs systèmes anti-bot lient le token à un user agent. Nous renvoyons celui utilisé pour que vous puissiez le reproduire exactement.
  3. Demandez-le au dernier moment. Les tokens expirent au bout d'environ 120 secondes. Demandez-en un quand vous êtes prêt à soumettre.

Appel bloquant ou polling

L'exemple utilise ?wait=60 : l'appel renvoie la résolution terminée et votre étape Selenium reste linéaire. Si vous préférez ne pas garder une connexion ouverte, retirez le paramètre, conservez l'id renvoyé et interrogez GET /v1/task/{id} toutes les cinq secondes. Un token que vous avez payé reste récupérable pendant dix minutes : une connexion interrompue ne vous fait donc pas perdre la résolution.

Coût

$0.00598 par résolution réussie de reCAPTCHA v2, les résolutions échouées n'étant jamais facturées. Consultez les tarifs pour chaque type de défi, ou la référence de l'API pour le format complet des requêtes.

[ INTÉGRATION DANS LE FLUX ]

Comment la résolution s'intègre à Selenium

Selenium pilote un vrai navigateur : le défi s'affiche donc exactement comme un utilisateur le verrait. Lisez la sitekey dans le DOM, demandez un token, puis réinjectez-le avec execute_script avant de cliquer sur le bouton d'envoi.

  1. 01
    Charger la page

    Ouvrez la cible avec le proxy et le user agent depuis lesquels vous enverrez le formulaire.

  2. 02
    Lire la sitekey

    Utilisez find_element sur [data-sitekey] et lisez l'attribut, ainsi que data-callback s'il est présent.

  3. 03
    Résoudre

    Envoyez en POST le type, la sitekey et driver.current_url à /v1/solve?wait=60, avec le même proxy et le même user agent.

  4. 04
    Injecter et envoyer

    Utilisez execute_script pour remplir le champ de réponse et déclencher le callback, puis cliquez sur le bouton d'envoi.

Injecter le token dans la page

driver.execute_script renseigne le champ caché g-recaptcha-response ou cf-turnstile-response et, si la page en utilise un, appelle le callback du widget.

[ PIÈGES ]

Là où les intégrations échouent le plus souvent

Callback jamais déclenché

De nombreuses pages activent le bouton d'envoi depuis le callback du widget. Remplir uniquement le champ laisse le bouton désactivé.

Champ caché introuvable

La textarea de réponse est créée au rendu du widget. Attendez l'iframe du widget avant d'injecter.

Proxy différent

Le proxy de Selenium est défini au démarrage du driver. Transmettez la même chaîne de proxy à la résolution pour que le token et l'envoi partagent la même IP.

[ FAQ ]

FAQ captcha Selenium

Selenium peut-il résoudre un reCAPTCHA tout seul ?

Non. Selenium contrôle le navigateur mais ne peut pas répondre à un défi image, et les navigateurs automatisés ont plus de chances de s'en voir présenter un. Vous demandez un token à une API de résolution et vous l'injectez, comme le fait l'exemple de cette page.

Cela fonctionne-t-il avec undetected-chromedriver ou Selenium Grid ?

Oui. L'intégration se contente de lire le DOM et d'exécuter du JavaScript : elle fonctionne donc avec n'importe quelle session WebDriver, locale ou distante, tant que vous transmettez le même proxy et le même user agent à la résolution.

Où placer le token pour Turnstile ?

Turnstile utilise un input caché nommé cf-turnstile-response dans le formulaire. Définissez sa valeur et appelez le callback indiqué dans data-callback si la page en déclare un.

Comment gérer un captcha qui n'apparaît que de temps en temps ?

Vérifiez la présence du widget après chaque navigation et n'appelez l'API que s'il est présent. Vous êtes facturé par résolution réussie : la vérification ne coûte donc rien.

[ À LIRE ENSUITE ]

Guides utiles

Prêt à développer ?

Commencez par un essai gratuit de 3 jours, puis payez par résolution réussie à mesure que votre trafic augmente. Aucune carte requise pour l'essai.

Voir nos offres
Vous êtes un agent IA ? Voir les options de configuration →