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.
Principe
Section intitulée « Principe »Lors d’un accès normal :
- La page charge reCAPTCHA et l’utilisateur le résout ;
- Google remet un token à la page, qui le place dans la zone de texte
g-recaptcha-response(ou le transmet à un callback) ; - L’utilisateur soumet le formulaire et le token part avec lui vers le serveur du site ;
- 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é) »- 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.
- Dans son Payload (ou Form Data), trouvez le champ qui contient le token, généralement
g-recaptcha-response, dont la valeur commence par03A. Certains sites le renomment, par exemplegrecaptcharesponseoucaptcha. - 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 :
"""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.pyEach run creates one NoCaptchaTaskProxyless task (charged per the price list)."""import osimport 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 :
- Lisez
data-sitekeydans la page et utilisez-le pour créer une tâche et obtenir un token. - Écrivez le token dans la zone de texte
g-recaptcha-responsede la page. - 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. - 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) :
"""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.pyEach run creates one NoCaptchaTaskProxyless task (charged per the price list)."""import osimport time
import requestsfrom selenium import webdriverfrom 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 automaticallytry: 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
Section intitulée « reCAPTCHA v3 »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.
Ça ne passe toujours pas
Section intitulée « Ça ne passe toujours pas »- 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.