Votre tâche revient avec ERROR_WRONG_GOOGLEKEY alors que le sitekey semble parfaitement copié ? Ce code signifie que la valeur googlekey envoyée à l'API ne correspond pas au reCAPTCHA de la page cible. Neuf fois sur dix, la clé a été extraite au mauvais endroit ou un paramètre manque à l'appel. Voici comment isoler la cause exacte et la corriger.
Ce que signale réellement l'erreur
Reliez chaque origine à son symptôme observable :
| Cause | Comment la repérer |
|---|---|
| Sitekey erroné extrait | La clé ne correspond pas au code source de la page |
| Clé Enterprise envoyée en standard | Il manque le paramètre enterprise=1 |
| Clé reCAPTCHA invisible mal typée | Il manque le paramètre invisible=1 |
| Sitekey dynamique renouvelé | La clé a tourné depuis l'extraction |
| Clé d'une autre page | Extraite d'un iframe ou d'un autre domaine |
| Sitekey codé en dur devenu obsolète | La clé était valide auparavant |
Le bon réflexe : diagnostiquer avant de renvoyer la tâche
Avant de relancer un envoi, isolez la cause en quatre gestes plutôt qu'en multipliant les tentatives à l'aveugle :
- Rechargez la page cible et relisez le sitekey directement dans le HTML rendu.
- Comparez cette valeur, caractère par caractère, avec celle transmise dans
googlekey. - Vérifiez que
pageurlpointe vers l'URL exacte qui affiche le reCAPTCHA. - Contrôlez le type de clé : Enterprise et invisible imposent chacun leur drapeau.
Neuf ERROR_WRONG_GOOGLEKEY sur dix se règlent à cette étape, sans toucher au reste du code.
Extraire le bon sitekey reCAPTCHA
Trois approches complémentaires permettent de récupérer la vraie clé. Commencez par la plus rapide, puis passez à la suivante dès que la page ne charge son reCAPTCHA qu'après coup, en JavaScript.
Méthode 1 : lecture du code source
import re
import requests
def extract_sitekey(page_url):
"""Extract reCAPTCHA sitekey from page source."""
resp = requests.get(page_url, timeout=15)
html = resp.text
# Pattern 1: data-sitekey attribute
match = re.search(r'data-sitekey="([^"]+)"', html)
if match:
return match.group(1)
# Pattern 2: grecaptcha.render call
match = re.search(r"grecaptcha\.render\([^,]+,\s*\{[^}]*sitekey['\"]?\s*:\s*['\"]([^'\"]+)", html)
if match:
return match.group(1)
# Pattern 3: grecaptcha.execute call
match = re.search(r"grecaptcha\.execute\(['\"]([^'\"]+)", html)
if match:
return match.group(1)
# Pattern 4: reCAPTCHA script src
match = re.search(r"recaptcha/api\.js\?render=([^&\"]+)", html)
if match:
return match.group(1)
return None
sitekey = extract_sitekey("https://example.com/login")
print(f"Sitekey: {sitekey}")
Méthode 2 : les outils de développement du navigateur
- Ouvrez la page cible dans Chrome.
- Appuyez sur F12, puis ouvrez l'onglet Éléments.
- Faites Ctrl+F et recherchez
sitekey. - Repérez l'attribut
data-sitekey="...". - Copiez la valeur (chaîne alphanumérique de 40 caractères).
Méthode 3 : l'onglet Réseau
- Ouvrez F12, puis l'onglet Réseau.
- Filtrez sur
recaptcha. - Cherchez les requêtes vers
google.com/recaptcha/api2/anchor. - Relevez le paramètre
k=dans l'URL : c'est le sitekey.
Si plusieurs requêtes anchor apparaissent, la page héberge plusieurs widgets : reliez chaque k= au formulaire que vous ciblez réellement.
Valider le sitekey avant l'envoi
Un contrôle de format évite d'envoyer une clé vide ou tronquée :
import re
def validate_sitekey(sitekey):
"""Validate sitekey format before API call."""
if not sitekey:
raise ValueError("Sitekey is empty")
# Standard format: 40 alphanumeric + hyphens/underscores
if not re.match(r'^[a-zA-Z0-9_-]{20,60}$', sitekey):
raise ValueError(f"Invalid sitekey format: {sitekey}")
return True
# Use before solving
sitekey = extract_sitekey("https://example.com/login")
validate_sitekey(sitekey)
Ce garde-fou rejette une chaîne vide ou tronquée avant l'appel : vous transformez un ERROR_WRONG_GOOGLEKEY distant en une erreur locale, explicite dès l'extraction.
reCAPTCHA Enterprise : le paramètre à ne pas oublier
Une clé Enterprise ressemble à une clé standard mais exige le paramètre enterprise. Sans lui, l'API la traite comme du reCAPTCHA classique.
import requests
# Standard reCAPTCHA — loads via recaptcha/api.js
# Enterprise reCAPTCHA — loads via recaptcha/enterprise.js
def detect_enterprise(page_url):
"""Detect if page uses reCAPTCHA Enterprise."""
resp = requests.get(page_url, timeout=15)
return "recaptcha/enterprise.js" in resp.text
# Submit with enterprise flag
is_enterprise = detect_enterprise("https://example.com")
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": "https://example.com",
"json": 1,
}
if is_enterprise:
data["enterprise"] = 1
resp = requests.post("https://ocr.captchaai.com/in.php", data=data)
Exemple concret : préproduction contre production
De nombreux portails européens — banques, administrations, e-commerce — chargent reCAPTCHA Enterprise avec un sitekey différent en préproduction et en production. Extrayez la clé sur la recette puis visez l'URL de production, et l'API renvoie ERROR_WRONG_GOOGLEKEY : les deux clés n'ont pas le même domaine. Extrayez toujours le sitekey depuis l'URL exacte transmise dans pageurl.
reCAPTCHA invisible : le détecter et le signaler
Le reCAPTCHA invisible se déclenche sans case à cocher. Repérez-le, puis ajoutez le drapeau invisible=1 :
def detect_invisible(html):
"""Detect invisible reCAPTCHA."""
indicators = [
'data-size="invisible"',
"grecaptcha.execute(",
"recaptcha/api.js?render=",
]
return any(i in html for i in indicators)
# Submit with invisible flag
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": "https://example.com",
"invisible": 1,
"json": 1,
}
Trois indices trahissent un reCAPTCHA invisible :
- l'attribut
data-size="invisible"sur le conteneur ; - un appel
grecaptcha.execute(sans case à cocher visible ; - un script chargé via
recaptcha/api.js?render=.
Dès qu'un seul apparaît, ajoutez invisible=1 : sans ce drapeau, la clé est refusée.
Clés chargées en JavaScript
Certaines pages n'exposent le sitekey qu'après exécution du JavaScript : le HTML brut renvoie alors une clé vide. Passez par un navigateur pour laisser le rendu se terminer :
from selenium import webdriver
from selenium.webdriver.common.by import By
def extract_dynamic_sitekey(url):
"""Extract sitekey from JavaScript-rendered page."""
driver = webdriver.Chrome()
driver.get(url)
# Wait for reCAPTCHA to load
import time
time.sleep(3)
# Try data-sitekey attribute
elements = driver.find_elements(By.CSS_SELECTOR, "[data-sitekey]")
if elements:
sitekey = elements[0].get_attribute("data-sitekey")
driver.quit()
return sitekey
# Try iframe src parameter
iframes = driver.find_elements(By.CSS_SELECTOR, "iframe[src*='recaptcha']")
for iframe in iframes:
src = iframe.get_attribute("src")
import re
match = re.search(r'[?&]k=([^&]+)', src)
if match:
driver.quit()
return match.group(1)
driver.quit()
return None
Un time.sleep(3) fixe reste fragile : sur une connexion lente ou un portail chargé, remplacez-le par une attente explicite (WebDriverWait) sur la présence de l'élément [data-sitekey]. Vous évitez ainsi d'extraire une clé encore vide.
Rattacher la clé au bon domaine
Un sitekey est lié au domaine déclaré côté Google. Une clé valide sur un hôte renvoie ERROR_WRONG_GOOGLEKEY sur un autre, même quand la différence tient au schéma ou au sous-domaine :
| Ce que vous envoyez | Ce que la page attend | Résultat |
|---|---|---|
pageurl en http:// |
Page servie en https:// |
Clé rejetée |
| Domaine racine | Sous-domaine réel du widget | Clé rejetée |
| Page voisine sans reCAPTCHA | URL exacte du formulaire | Clé rejetée |
Alignez toujours pageurl sur l'adresse précise où le reCAPTCHA s'affiche.
Tableau de dépannage
| Symptôme | Cause probable | Correctif |
|---|---|---|
| La clé paraît bonne mais l'erreur persiste | Sitekey Enterprise | Ajoutez enterprise=1 |
| La clé change d'une visite à l'autre | Sitekey dynamique | Ré-extrayez la clé à chaque tâche |
| Plusieurs sitekeys sur la page | Mauvaise sélection | Reliez la clé au bon formulaire |
| Clé issue d'un iframe CDN | Clé d'un mauvais domaine | Extrayez depuis la page principale, pas l'iframe |
| Sitekey extrait vide | Page rendue en JavaScript | Passez par Selenium pour l'extraction |
Checklist avant chaque envoi
Passez ces points en revue avant de soumettre la tâche :
- le sitekey provient du HTML rendu, pas d'un cache ni d'un autre onglet ;
pageurlcorrespond exactement à l'URL du formulaire ;- le drapeau
enterprise=1est présent si la page chargerecaptcha/enterprise.js; - le drapeau
invisible=1est présent pour un widget sans case à cocher ; - côté RGPD, vous ne collectez que les données strictement nécessaires à la démarche.
FAQ
Pourquoi l'erreur apparaît-elle alors que le CAPTCHA se résout dans mon navigateur ?
Parce que le navigateur envoie la clé qui correspond à la page, alors que votre script peut transmettre une clé périmée ou oublier un drapeau enterprise / invisible. Ré-extrayez la clé depuis l'URL de pageurl.
Le paramètre pageurl doit-il correspondre exactement à la page du CAPTCHA ?
Oui. Le sitekey est rattaché à un domaine ; un mauvais hôte ou schéma déclenche l'erreur. Utilisez l'adresse réelle où s'affiche le reCAPTCHA, pas une page voisine.
CaptchaAI prend-il en charge reCAPTCHA Enterprise ?
Oui. reCAPTCHA v2 et v3, standard comme Enterprise, sont pris en charge. Ajoutez enterprise=1 à la requête quand la page charge recaptcha/enterprise.js.
Faut-il ré-extraire le sitekey à chaque exécution ?
Pas systématiquement : un cache de quelques minutes à quelques heures suffit. Ré-extrayez dès que la résolution commence à échouer, car certains sites renouvellent leur clé.
Que faire si la page affiche plusieurs reCAPTCHA ?
Ciblez le widget rattaché au formulaire que vous soumettez. Relevez son data-sitekey (ou son paramètre k=) précis plutôt que le premier trouvé, sinon la clé ne correspondra pas à l'action.
Guides connexes
Repartez avec le bon sitekey — résolvez avec CaptchaAI.