Tutorials

n8n + CaptchaAI : flux de travail de résolution de CAPTCHA sans code

Un défi CAPTCHA au milieu d'un workflow n8n bloque tout ce qui suit : le formulaire n'est jamais envoyé et l'exécution se termine en erreur. La réponse tient en trois nœuds HTTP Request et une boucle d'attente, sans extension à installer ni code obligatoire.

Ce guide monte le workflow complet : envoi du défi à l'API CaptchaAI, interrogation du résultat, puis injection du token dans la requête finale.

Pourquoi n8n convient mieux que Zapier à ce workflow

Une résolution CAPTCHA n'est pas instantanée : vous envoyez, vous attendez, vous réinterrogez. Ce schéma réclame une boucle, ce qui manque à la plupart des outils no-code.

Critère n8n Zapier
Boucles et nouvelles tentatives Natif (boucle IF, Loop Over Items) Limité (chemins conditionnels)
Auto-hébergement Oui Non (cloud uniquement)
Nœuds de code JavaScript complet Très limité
Coût Gratuit en auto-hébergé, payant en cloud Payant à la tâche
Prise en main Modérée Rapide

L'auto-hébergement pèse aussi côté conformité : sur une instance OVHcloud ou Scaleway, URL cibles et logs d'exécution restent dans votre périmètre RGPD.

Ce qu'il faut préparer

  • Une instance n8n cloud ou auto-hébergée (version 1.x pour le nœud Wait).
  • Une clé API CaptchaAI. Facturation en dollars US, par thread simultané : BASIC ($15/mois, 5 threads) couvre quelques workflows en parallèle, STANDARD ($30/mois, 15 threads) une agence multi-clients.
  • Le sitekey et l'URL exacte de la page ciblée, sur vos propres environnements.
  • Types couverts : reCAPTCHA v2 et v3, Turnstile, GeeTest v3, CAPTCHA image/OCR.

Le schéma général du workflow

Manual Trigger / Cron
    ↓
HTTP Request: Submit CAPTCHA
    ↓
Wait: 10 seconds
    ↓
Loop: Poll until solved
    ├── HTTP Request: Get result
    ├── IF: status == 1? → Exit loop
    └── Wait: 5 seconds → Loop again
    ↓
HTTP Request: Use token

Nœud 1 : envoyer le défi CAPTCHA

Ajoutez un nœud HTTP Request en POST sur https://ocr.captchaai.com/in.php, corps en Form URL Encoded.

Paramètres du corps :

Nom Valeur
key {{ $credentials.captchaaiApiKey }} ou votre clé en dur
method userrecaptcha
googlekey 6Le-SITEKEY
pageurl https://example.com
json 1

La réponse porte l'identifiant de tâche :

{
  "status": 1,
  "request": "71823456"
}

Nœud 2 : temporiser avant la première interrogation

Ajoutez un nœud Wait, réglé sur 10 en Seconds.

Interroger l'API dès la seconde suivante ne sert à rien : la tâche n'est pas encore traitée et vous ne récoltez que CAPCHA_NOT_READY.

Nœud 3 : interroger le résultat jusqu'à la résolution

Deux voies : le nœud Loop Over Items, ou la sortie « false » d'un IF renvoyée vers un nœud précédent.

Option A : boucle IF, sans code

Ajoutez un nœud HTTP Request dédié à l'interrogation :

  • Méthode GET sur https://ocr.captchaai.com/res.php
  • Paramètres de requête : key, action=get, id={{ $json.request }}, json=1

Reliez-le à un nœud IF comparant {{ $json.status }} (Value 1) à 1 (Value 2) avec l'opération Equal :

  • Sortie true → la suite du workflow, token en main.
  • Sortie false → nœud Wait de 5 s, puis retour sur le nœud d'interrogation.

Option B : un seul nœud Code

Pour plafonner les tentatives et lever une erreur explicite :

const apiKey = 'YOUR_API_KEY';
const taskId = $input.first().json.request;

for (let i = 0; i < 24; i++) {
  await new Promise(r => setTimeout(r, 5000));

  const resp = await fetch(
    `https://ocr.captchaai.com/res.php?key=${apiKey}&action=get&id=${taskId}&json=1`
  );
  const data = await resp.json();

  if (data.status === 1) {
    return [{ json: { token: data.request, taskId } }];
  }
  if (data.request !== 'CAPCHA_NOT_READY') {
    throw new Error(`CaptchaAI error: ${data.request}`);
  }
}

throw new Error(`Task ${taskId} timed out`);

Vingt-quatre itérations de 5 s placent le timeout à deux minutes.

Nœud 4 : injecter le token dans le formulaire

Un dernier nœud HTTP Request poste le formulaire sur https://target-site.com/submit, toujours en Form URL Encoded. Aux champs habituels, ajoutez g-recaptcha-response avec la valeur {{ $json.token }}.

Stocker la clé API sans la coder en dur

Passez par le système Credentials de n8n :

  1. Ouvrez Credentials → Add Credential → Header Auth.
  2. Nommez l'entrée CaptchaAI API Key.
  3. Enregistrez la clé, puis référencez le credential depuis les nœuds.

En auto-hébergé, la variable d'environnement suffit :

# In your n8n environment
export CAPTCHAAI_API_KEY="your_key_here"

Vous l'appelez avec {{ $env.CAPTCHAAI_API_KEY }}.

Variante : CAPTCHA image et OCR

Seul le nœud d'envoi change :

  • method devient base64
  • body reçoit l'image encodée en base64

Un nœud Code en amont convertit l'URL de l'image :

const imageUrl = $input.first().json.imageUrl;
const resp = await fetch(imageUrl);
const buffer = Buffer.from(await resp.arrayBuffer());
const base64 = buffer.toString('base64');

return [{ json: { imageBase64: base64 } }];

Surveiller le solde avec un workflow planifié

Un workflow séparé déclenché par un Cron évite l'arrêt silencieux de vos automatisations :

Cron (daily at 9 AM)
    ↓
HTTP Request: GET res.php?action=getbalance
    ↓
IF: balance < 5
    ↓
Slack / Email: "CaptchaAI balance low: $X.XX"

Cas d'usage : la recette nocturne d'une agence lyonnaise

Une agence héberge n8n chez OVHcloud et rejoue chaque nuit les formulaires d'inscription de ses clients. Un Cron démarre le workflow à 3 h, un nœud Split In Batches parcourt les environnements de préproduction, chacun suivant la séquence ci-dessus.

Deux réflexes d'exploitation :

  • Les URL testées appartiennent aux clients, en préproduction : aucune donnée personnelle collectée, donc pas de zone grise RGPD.
  • Le nombre d'environnements traités en parallèle reste aligné sur les threads du plan, jamais l'inverse.

Dépannage

Problème Cause Correctif
La boucle d'interrogation tourne sans fin Aucune limite d'itérations Ajoutez un compteur, sortez après 24 passages
CAPCHA_NOT_READY en continu Première interrogation trop précoce Portez l'attente initiale à 15–20 s
Token absent du nœud suivant Chemin d'expression erroné Vérifiez que {{ $json.token }} correspond à la sortie
Credential introuvable Variable d'environnement non chargée Redémarrez n8n après l'avoir définie

FAQ

Combien de threads pour plusieurs workflows en parallèle ?

Un thread correspond à une résolution en cours. BASIC ($15/mois, 5 threads) absorbe cinq exécutions simultanées ; au-delà, alignez le plan sur le nombre d'éléments traités par Split In Batches.

CaptchaAI prend-il en charge hCaptcha depuis n8n ?

Non, ni hCaptcha ni FunCaptcha. Restent disponibles reCAPTCHA v2 et v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest v3 et les CAPTCHA image/OCR ; CaptchaFox (bêta), Friendly Captcha (bêta) et Lemin (bêta) sont en évaluation, GeeTest v4 à venir.

Comment adapter le workflow à Cloudflare Turnstile ?

Remplacez method par turnstile et transmettez sitekey au lieu de googlekey. La boucle d'interrogation ne bouge pas.

n8n cloud ou auto-hébergé pour ce workflow ?

Les deux fonctionnent, avec les mêmes nœuds. L'auto-hébergement apporte les variables d'environnement et la maîtrise des logs.


Intégrez la résolution CAPTCHA dans vos workflows n8n

Obtenez votre clé API sur captchaai.com et branchez le premier nœud.


Guides associés

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