reCAPTCHA v2 reste l'un des points de blocage les plus courants sur les flux de connexion, d'inscription, de paiement et de soumission de formulaire. Si votre automatisation tombe sur la case à cocher ou le défi image reCAPTCHA v2, vous pouvez le résoudre via l'API en quatre étapes : extraire le sitekey et le pageurl de la page, les envoyer au solveur reCAPTCHA v2 de CaptchaAI, récupérer le résultat puis injecter le token dans le flux protégé.
Ce guide est destiné aux développeurs qui cherchent une intégration qui fonctionne, pas un panorama théorique.
Pas sûr de la version de reCAPTCHA ? Lisez d'abord Comment identifier la version de reCAPTCHA.
Ce qu'il vous faut avant de commencer
| Prérequis | Détails |
|---|---|
| Clé API CaptchaAI | Disponible sur captchaai.com/api.php. 32 caractères. |
| URL complète | L'URL exacte où le widget reCAPTCHA v2 est chargé. |
| sitekey | La clé publique liée à l'instance du widget sur cette page. |
| Client HTTP | requests, axios, fetch, curl — au choix. |
| Threads actifs | Votre compte doit disposer de threads disponibles. |
Étape 1 : extraire sitekey et pageurl
pageurl est l'URL complète de la page où apparaît la reCAPTCHA. Toujours fournie avec https://.
Pour le sitekey, trois pistes :
1. Dans le HTML — cherchez <div class="g-recaptcha" data-sitekey="..."> :
<div class="g-recaptcha" data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"></div>
2. Dans l'URL de l'iframe — https://www.google.com/recaptcha/api2/anchor?ar=1&k=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&... — le paramètre k= est le sitekey.
3. Dans le trafic réseau — DevTools → Network, filtrez par recaptcha, le paramètre k apparaît dans n'importe quelle requête.
Étape 2 : soumettre la tâche
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://example.com/login"
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": SITEKEY,
"pageurl": PAGEURL,
"json": 1,
}).json()
assert submit["status"] == 1, submit
task_id = submit["request"]
print("task id:", task_id)
Équivalent Node.js :
const r = await fetch("https://ocr.captchaai.com/in.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: SITEKEY,
pageurl: PAGEURL,
json: "1",
}),
});
const { status, request: taskId } = await r.json();
if (status !== 1) throw new Error(taskId);
reCAPTCHA invisible ? Ajoutez
invisible=1. Détails dans Comment fonctionne la reCAPTCHA invisible.
Étape 3 : interroger le résultat
reCAPTCHA v2 prend habituellement 15–60 secondes. Patientez 20 s, puis interrogez toutes les 5 s.
import time
time.sleep(20)
while True:
res = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if res.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if res.get("status") == 1:
token = res["request"]
print("token:", token[:60], "…")
break
raise RuntimeError(res)
Le token renvoyé est une longue chaîne qui commence en général par 03AGdBq25....
Étape 4 : injecter le token dans la page
La méthode dépend du site. Le plus courant : le textarea g-recaptcha-response :
document.querySelector('textarea[name="g-recaptcha-response"]').value = token;
document.querySelector("form").submit();
Selenium :
driver.execute_script(
"document.querySelector('[name=\"g-recaptcha-response\"]').value = arguments[0];",
token,
)
driver.find_element(By.CSS_SELECTOR, "form").submit()
Playwright :
await page.evaluate((t) => {
document.querySelector('[name="g-recaptcha-response"]').value = t;
}, token);
await page.click('button[type="submit"]');
Si le widget a un data-callback, appelez aussi cette fonction :
const callback = document.querySelector(".g-recaptcha").dataset.callback;
if (callback && window[callback]) window[callback](token);
Exemple complet (Python)
import time
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://example.com/login"
def solve_recaptcha_v2():
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": SITEKEY, "pageurl": PAGEURL, "json": 1,
}).json()
if submit["status"] != 1:
raise RuntimeError(submit)
task_id = submit["request"]
time.sleep(20)
for _ in range(40):
res = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1,
}).json()
if res.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if res.get("status") == 1:
return res["request"]
raise RuntimeError(res)
raise TimeoutError("solve timed out")
if __name__ == "__main__":
token = solve_recaptcha_v2()
print("token:", token[:80])
Erreurs fréquentes et solutions
| Erreur | Cause | Action |
|---|---|---|
ERROR_GOOGLEKEY |
sitekey vide ou invalide | Réextraire le sitekey depuis la page actuelle |
ERROR_PAGEURL |
pageurl manquant |
Envoyer l'URL complète avec schéma |
ERROR_ZERO_BALANCE |
Aucun thread | Recharger ou attendre |
ERROR_CAPTCHA_UNSOLVABLE |
Le site a durci le défi | Réessayer après quelques secondes ; voir erreurs courantes de résolution reCAPTCHA v2 |
| Le site rejette le token | Token périmé | À utiliser dans les ~110 s suivant la réception |
Quand ça ne fonctionne pas
- Token reçu mais le site bloque toujours — le formulaire a son propre handler. Trouvez le callback et appelez-le au lieu de simplement remplir le textarea.
- Il faut conserver la même empreinte — envoyez les mêmes cookies et
User-Agentqu'au moment de la demande. - reCAPTCHA dépendante du proxy — ajoutez
proxyetproxytypeà la soumission pour que le solveur utilise votre pool d'IPs.
Étapes suivantes
- Démarrage rapide CaptchaAI : votre première résolution de CAPTCHA en 5 minutes
- How To Identify Recaptcha Version
- Comment résoudre Cloudflare Turnstile via l'API
- reCAPTCHA v2 courant, résolution des erreurs et correctifs