Troubleshooting

ERROR_WRONG_GOOGLEKEY : Guide complet de diagnostic et de réparation

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 :

  1. Rechargez la page cible et relisez le sitekey directement dans le HTML rendu.
  2. Comparez cette valeur, caractère par caractère, avec celle transmise dans googlekey.
  3. Vérifiez que pageurl pointe vers l'URL exacte qui affiche le reCAPTCHA.
  4. 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

  1. Ouvrez la page cible dans Chrome.
  2. Appuyez sur F12, puis ouvrez l'onglet Éléments.
  3. Faites Ctrl+F et recherchez sitekey.
  4. Repérez l'attribut data-sitekey="...".
  5. Copiez la valeur (chaîne alphanumérique de 40 caractères).

Méthode 3 : l'onglet Réseau

  1. Ouvrez F12, puis l'onglet Réseau.
  2. Filtrez sur recaptcha.
  3. Cherchez les requêtes vers google.com/recaptcha/api2/anchor.
  4. 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 ;
  • pageurl correspond exactement à l'URL du formulaire ;
  • le drapeau enterprise=1 est présent si la page charge recaptcha/enterprise.js ;
  • le drapeau invisible=1 est 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.

Les commentaires sont désactivés pour cet article.