Cas d'Usage

Automatiser des connexions protégées par CAPTCHA avec CaptchaAI

Les pages de connexion sont l'endroit où les CAPTCHA apparaissent le plus souvent. C'est logique : elles protègent un point d'entrée sensible, souvent exposé aux bots, aux tests agressifs et aux tentatives en masse. Pour automatiser un login, il ne suffit donc pas de remplir un formulaire. Il faut aussi gérer le challenge au bon moment, conserver la session et ne pas perdre les cookies ou les jetons CSRF pendant le processus.

CaptchaAI prend en charge la résolution du challenge pendant que votre script pilote le reste : chargement de page, remplissage des champs, soumission et maintien de la session authentifiée.

Types de CAPTCHA les plus courants sur les pages de connexion

CAPTCHA Comment cela apparaît Méthode CaptchaAI
reCAPTCHA v2 Case à cocher ou défi avant de soumettre method=userrecaptcha
reCAPTCHA v3 Score invisible, bloque les utilisateurs à faible score method=userrecaptcha&version=v3
Cloudflare Turnstile Widget avant le formulaire de connexion method=turnstile
Image CAPTCHA Image texte à saisir method=base64

Méthode 1 : requêtes HTTP sans navigateur

Cette approche convient aux formulaires qui acceptent encore une soumission POST classique sans logique JavaScript trop lourde.

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

# Login flow
session = requests.Session()
login_url = "https://example.com/login"

# Load login page to get cookies and site key
page = session.get(login_url)
# Extract site_key from the page HTML...
site_key = "6Le-wvkS..."

# Solve CAPTCHA
token = solve_recaptcha(site_key, login_url)

# Submit login form
resp = session.post(login_url, data={
    "username": "user@example.com",
    "password": "your_password",
    "g-recaptcha-response": token
})

if resp.url != login_url:
    print("Login successful!")
    # session now has auth cookies for subsequent requests

Méthode 2 : Selenium en Python

Quand la page dépend fortement de JavaScript, le navigateur automatisé devient souvent plus fiable qu'un simple requests.Session().

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time

API_KEY = "YOUR_API_KEY"

options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)

# Navigate to login page
driver.get("https://example.com/login")
wait = WebDriverWait(driver, 10)

# Fill in credentials
username_field = wait.until(EC.presence_of_element_located((By.NAME, "username")))
username_field.send_keys("user@example.com")
driver.find_element(By.NAME, "password").send_keys("your_password")

# Extract site key and solve
recaptcha = driver.find_element(By.CLASS_NAME, "g-recaptcha")
site_key = recaptcha.get_attribute("data-sitekey")

token = solve_recaptcha(site_key, driver.current_url)

# Inject token
driver.execute_script(
    f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
)

# Submit
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
wait.until(EC.url_changes(driver.current_url))
print(f"Logged in! Now at: {driver.current_url}")

Méthode 3 : Puppeteer en Node.js

const puppeteer = require("puppeteer");
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 puppeteer.launch({ headless: "new" });
  const page = await browser.newPage();
  await page.goto("https://example.com/login");

  // Fill credentials
  await page.type("#username", "user@example.com");
  await page.type("#password", "your_password");

  // Get site key and solve
  const siteKey = await page.$eval(".g-recaptcha", (el) =>
    el.getAttribute("data-sitekey")
  );
  const token = await solveRecaptcha(siteKey, page.url());

  // Inject and submit
  await page.evaluate(
    (t) => (document.getElementById("g-recaptcha-response").innerHTML = t),
    token
  );
  await page.click('button[type="submit"]');
  await page.waitForNavigation();

  console.log("Logged in:", page.url());
  await browser.close();
})();

Gérer CAPTCHA et MFA dans le même flux

Certaines pages de connexion affichent d'abord un CAPTCHA, puis redirigent vers une étape MFA. Il faut alors considérer la résolution comme une étape du flux global, pas comme une opération isolée.

# Step 1: Solve CAPTCHA and submit login
token = solve_recaptcha(site_key, login_url)
resp = session.post(login_url, data={
    "username": "user@example.com",
    "password": "your_password",
    "g-recaptcha-response": token
})

# Step 2: Handle MFA page (if redirected)
if "verify" in resp.url or "mfa" in resp.url:
    # Your MFA code logic here
    mfa_code = get_mfa_code()
    resp = session.post(resp.url, data={"code": mfa_code})

# Step 3: Verify logged in
assert "dashboard" in resp.url

Depannage

Probleme Cause probable Correctif
Retour à la page CAPTCHA Token expiré ou mal injecté Résoudre puis soumettre très vite
Identifiants invalides alors qu'ils sont corrects Champ caché ou token CSRF manquant Relevez tous les champs cachés de la page
Session perdue après login Cookies non conservés Réutilisez la session HTTP ou le navigateur
reCAPTCHA v3 bloque encore Score insuffisant ou mauvais action parameter Vérifiez l'action et le contexte de soumission

FAQ

Peut-on automatiser n'importe quelle page de connexion ?

CaptchaAI couvre la partie CAPTCHA, mais votre script doit toujours gérer le formulaire, la session et les étapes d'authentification associées. Le cadre légal dépend évidemment de votre autorisation à accéder au compte et au service.

Faut-il toujours passer par un navigateur ?

Non. Beaucoup de formulaires de connexion acceptent encore un POST classique. Le navigateur est surtout nécessaire quand la page dépend d'exécution JavaScript, de rendu dynamique ou de callbacks front-end.

Comment garder la session après la connexion ?

Conservez les cookies et réutilisez la même session HTTP ou le même navigateur. Sans cela, toute la résolution CAPTCHA ne sert à rien puisque la session authentifiée est perdue juste après le login.

Guides connexes

  • Gestion du CAPTCHA Selenium avec Python
  • Résolution CAPTCHA avec Puppeteer en Node.js
  • Gestion des CAPTCHA avec Playwright
Les commentaires sont désactivés pour cet article.