Aller au contenu
ÉtatTableau de bord

Guides

Utiliser un token pour valider un reCAPTCHA

Cette page a été traduite automatiquement à partir de la version chinoise et peut contenir des erreurs. La version chinoise fait foi.

Le gRecaptchaResponse renvoyé par YesCaptcha est la même valeur que Google remet à la page une fois le captcha résolu. Une fois que vous l’avez, vous devez le soumettre au site cible (et non à Google ni à YesCaptcha), comme le ferait un navigateur ; le site le vérifie auprès de Google, puis vous laisse passer. Deux méthodes sont possibles : envoyer directement la requête, ou renseigner le token dans la page dans un navigateur réel puis la soumettre.

Lors d’un accès normal :

  1. La page charge reCAPTCHA et l’utilisateur le résout ;
  2. Google remet un token à la page, qui le place dans la zone de texte g-recaptcha-response (ou le transmet à un callback) ;
  3. L’utilisateur soumet le formulaire et le token part avec lui vers le serveur du site ;
  4. Le serveur du site vérifie le token auprès de Google, puis laisse passer l’utilisateur.

Avec YesCaptcha, nous nous occupons des étapes 1 et 2 : vous créez une tâche avec websiteURL et websiteKey, vous obtenez le token, puis vous continuez à partir de l’étape 3.

Méthode 1 : envoyer directement la requête (recommandé)

Section intitulée « Méthode 1 : envoyer directement la requête (recommandé) »
  1. Faites une fois l’opération à la main dans un navigateur : ouvrez le panneau Network avec F12, résolvez le captcha, soumettez, puis repérez la requête qui envoie le formulaire.
  2. Dans son Payload (ou Form Data), trouvez le champ qui contient le token, généralement g-recaptcha-response, dont la valeur commence par 03A. Certains sites le renomment, par exemple grecaptcharesponse ou captcha.
  3. Envoyez la même requête depuis votre programme, en remplaçant la valeur du champ par le token renvoyé par YesCaptcha. Les autres champs, les cookies et les en-têtes doivent aussi correspondre à ceux du navigateur, car les sites les vérifient souvent également.

Un exemple complet sur la page de démonstration de Google : obtenir un token, puis le renvoyer à la page de démonstration dans le champ g-recaptcha-response :

recaptcha_requests.py
"""Solve reCAPTCHA v2 on Google's demo page and submit the token with plain HTTP (no browser).
Run: pip install requests
export YESCAPTCHA_CLIENT_KEY=your_client_key
python recaptcha_requests.py
Each run creates one NoCaptchaTaskProxyless task (charged per the price list).
"""
import os
import time
import requests
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]
API = "https://api.yescaptcha.com"
WEBSITE_URL = "https://www.google.com/recaptcha/api2/demo"
WEBSITE_KEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
def call(method, payload):
data = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30).json()
if data.get("errorId"):
raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
return data
def get_token():
task = {"type": "NoCaptchaTaskProxyless", "websiteURL": WEBSITE_URL, "websiteKey": WEBSITE_KEY}
task_id = call("createTask", {"task": task})["taskId"]
for _ in range(36): # poll every 5 seconds, for up to about 3 minutes
time.sleep(5)
result = call("getTaskResult", {"taskId": task_id})
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
raise TimeoutError(task_id)
token = get_token()
print("token:", token[:40], "...")
# Submit the token the same way the browser does: the demo form posts the field
# "g-recaptcha-response" back to the page. Check your own site's request in DevTools > Network.
page = requests.post(WEBSITE_URL, data={"g-recaptcha-response": token}, timeout=30)
print("passed" if "Verification Success" in page.text else "not passed", page.status_code)

Méthode 2 : le renseigner dans le navigateur (Selenium, etc.)

Section intitulée « Méthode 2 : le renseigner dans le navigateur (Selenium, etc.) »

Lorsque vous pilotez un navigateur réel avec Selenium, Playwright ou un outil similaire :

  1. Lisez data-sitekey dans la page et utilisez-le pour créer une tâche et obtenir un token.
  2. Écrivez le token dans la zone de texte g-recaptcha-response de la page.
  3. Si la page définit un callback (data-callback="..."), appelez-le en lui passant le token ; sur certains sites, le bouton d’envoi ne devient cliquable qu’après l’exécution du callback.
  4. Soumettez le formulaire.
// Step 2: write the token (run in the page)
document.getElementById('g-recaptcha-response').value = 'TOKEN';
// Step 3: call the callback if there is one, e.g. data-callback="onSuccess"
onSuccess('TOKEN');

Lorsque la page contient plusieurs reCAPTCHA, l’id de la zone de texte peut être de la forme g-recaptcha-response-1. Si vous ne la trouvez pas, résolvez le captcha à la main une fois, puis cherchez 03A dans le panneau Elements pour voir où le résultat est placé. Pour trouver le callback, voir Trouver les paramètres reCAPTCHA.

Exemple complet (Selenium 4) :

recaptcha_selenium.py
"""Solve reCAPTCHA v2 on Google's demo page in a real browser with Selenium 4:
get a token from YesCaptcha, put it into the page, then submit the form.
Run: pip install requests selenium
export YESCAPTCHA_CLIENT_KEY=your_client_key
python recaptcha_selenium.py
Each run creates one NoCaptchaTaskProxyless task (charged per the price list).
"""
import os
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]
API = "https://api.yescaptcha.com"
WEBSITE_URL = "https://www.google.com/recaptcha/api2/demo"
def call(method, payload):
data = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30).json()
if data.get("errorId"):
raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
return data
def get_token(website_url, website_key):
task = {"type": "NoCaptchaTaskProxyless", "websiteURL": website_url, "websiteKey": website_key}
task_id = call("createTask", {"task": task})["taskId"]
for _ in range(36):
time.sleep(5)
result = call("getTaskResult", {"taskId": task_id})
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
raise TimeoutError(task_id)
driver = webdriver.Chrome() # Selenium 4 downloads a matching chromedriver automatically
try:
driver.get(WEBSITE_URL)
site_key = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-sitekey")
token = get_token(WEBSITE_URL, site_key)
# Put the token where reCAPTCHA keeps it ...
driver.execute_script(
"document.getElementById('g-recaptcha-response').value = arguments[0];", token
)
# ... and, if the page uses a callback (data-callback="..."), call it:
callback = driver.find_element(By.CSS_SELECTOR, "[data-sitekey]").get_attribute("data-callback")
if callback:
driver.execute_script(f"window[{callback!r}](arguments[0]);", token)
driver.find_element(By.ID, "recaptcha-demo-submit").click()
time.sleep(2)
print("passed" if "Verification Success" in driver.page_source else "not passed")
finally:
driver.quit()

reCAPTCHA v3 n’a pas de case à cocher. La page appelle grecaptcha.execute(clé du site, {action: '...'}) quand elle a besoin d’un token, puis place ce token dans sa propre requête (le nom du champ dépend du site ; les plus courants sont g-recaptcha-response, token et recaptchaToken). La démarche est la même que pour la méthode 1 : repérez dans Network la requête qui contient le token et reproduisez-la ; lors de la création de la tâche, pageAction doit correspondre à l’action de la page.

  • Le token a expiré : soumettez-le dès que vous l’obtenez, sans dépasser 60 secondes.
  • Vous avez soumis un autre champ que celui vérifié par le site, ou il manque d’autres champs ou des cookies : comparez point par point avec la requête du navigateur.
  • Le site vérifie aussi l’IP, le User-Agent, etc. : utilisez un type avec votre propre proxy (par exemple NoCaptchaTask) et soumettez via le même proxy.
  • Score v3 insuffisant : vérifiez pageAction, ou utilisez un type à score élevé fixe, voir reCAPTCHA v3.
  • Le système anti-fraude du site examine aussi d’autres signaux de comportement. Si le taux de réussite par token est faible, passez à la reconnaissance d’images avec de vrais clics dans le navigateur, ou utilisez l’extension de navigateur.