Comparisons

BLS CAPTCHA ou reCAPTCHA en grille : quel solveur choisir

Une seule distinction gouverne tout le reste : BLS CAPTCHA se résout en envoyant les images une par une, reCAPTCHA en grille en récupérant un token. Les deux affichent des vignettes à sélectionner selon une consigne texte, mais tout ce qui suit — méthode API, besoin d'un navigateur, effort de code — découle de là. BLS CAPTCHA est une implémentation sur mesure, présente uniquement sur les portails de rendez-vous de visa de BLS International (bien connus des lecteurs francophones du Maghreb) ; reCAPTCHA est le produit de Google, déployé partout. Ce comparatif vous aide à choisir la bonne méthode CaptchaAI.


BLS CAPTCHA ou reCAPTCHA en grille : la différence en un coup d'œil

Voici tout ce qui change côté intégration.

Caractéristique BLS CAPTCHA reCAPTCHA en grille
Fournisseur BLS International (sur mesure) Google
Format Images distinctes séparées (3 à 9) Image unique découpée en grille (3 × 3 ou 4 × 4)
Vignettes dynamiques Non — jeu d'images fixe Oui — de nouvelles vignettes apparaissent en fondu après la sélection
Analyse comportementale Minime Poussée (souris, timing, IP)
Système de score Aucun Analyse de risque à chaque requête
Méthode API method=bls method=userrecaptcha
Paramètres requis instructions, image_base64_1..9 googlekey, pageurl
Format de réponse Indices d'images (par ex. 1,3,5) Chaîne de token
Résolution par token Non — il faut résoudre les images directement Oui — la méthode token gère la grille en interne
Navigateur requis Oui (extraction depuis le DOM) Facultatif (la méthode token s'en passe)
Où on le rencontre Portails de rendez-vous de visa BLS uniquement Des millions de sites dans le monde
Temps de résolution indicatif 5 à 15 s 10 à 30 s

Les durées ci-dessus sont indicatives et reposent sur des mesures observées ; elles varient selon l'environnement, le volume et le moment de la journée.


Quel solveur choisir selon votre scénario

Le CAPTCHA en face impose la méthode :

  • Portail de visa BLS : method=bls avec extraction des images.
  • Site protégé par reCAPTCHA : method=userrecaptcha avec le sitekey.
  • Site BLS à reCAPTCHA imbriqué : vérifiez lequel protège l'action ; certains portails utilisent les deux.
  • CAPTCHA image inconnu : contrôlez d'abord la marque BLS, sinon testez reCAPTCHA ou l'OCR.

Exemple concret. Un candidat au visa au Maroc automatise, sur son propre compte, la vérification de disponibilité d'un rendez-vous BLS. La page affiche un BLS CAPTCHA à la connexion, puis un reCAPTCHA en grille à la validation : la détection route alors method=bls vers l'un, method=userrecaptcha vers l'autre.

Cadrez toujours ce type d'automatisation dans votre propre démarche, sur un environnement autorisé.


Résoudre BLS CAPTCHA avec CaptchaAI

Le principe tient en cinq étapes :

  • Extraire le texte de consigne affiché au-dessus de la grille.
  • Extraire chaque image du DOM et l'encoder en base64.
  • Envoyer method=bls avec instructions et les champs image_base64_1..9.
  • Interroger le résultat jusqu'à recevoir les indices (par ex. 1,3,5).
  • Cliquer les images correspondantes dans le bon ordre.

En Python

import requests
import base64
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example-bls-site.com/appointment")

# Step 1: Extract instruction text
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
# Example: "Select all images with a motorcycle"

# Step 2: Extract and encode each image
images = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
image_data = {}
for i, img in enumerate(images, 1):
    # Get image source and convert to base64
    src = img.get_attribute("src")
    if src.startswith("data:image"):
        b64 = src.split(",")[1]
    else:
        img_bytes = requests.get(src).content
        b64 = base64.b64encode(img_bytes).decode()
    image_data[f"image_base64_{i}"] = b64

# Step 3: Submit to CaptchaAI
payload = {
    "key": "YOUR_API_KEY",
    "method": "bls",
    "instructions": instruction,
    **image_data
}
resp = requests.post("https://ocr.captchaai.com/in.php", data=payload)
task_id = resp.text.split("|")[1]

# Step 4: Poll for result
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        indices = result.text.split("|")[1]  # e.g., "1,3,5"
        break

# Step 5: Click the correct images
for idx in indices.split(","):
    images[int(idx) - 1].click()
    time.sleep(0.3)  # Small delay between clicks

En Node.js

const axios = require("axios");
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({ headless: "new" });
  const page = await browser.newPage();
  await page.goto("https://example-bls-site.com/appointment");

  // Extract instruction text
  const instruction = await page.$eval(
    ".captcha-instruction",
    (el) => el.textContent,
  );

  // Extract images as base64
  const imageElements = await page.$$(".captcha-image img");
  const imageData = {};
  for (let i = 0; i < imageElements.length; i++) {
    const src = await imageElements[i].evaluate((el) => el.src);
    let b64;
    if (src.startsWith("data:image")) {
      b64 = src.split(",")[1];
    } else {
      const resp = await axios.get(src, { responseType: "arraybuffer" });
      b64 = Buffer.from(resp.data).toString("base64");
    }
    imageData[`image_base64_${i + 1}`] = b64;
  }

  // Submit to CaptchaAI
  const formData = new URLSearchParams({
    key: "YOUR_API_KEY",
    method: "bls",
    instructions: instruction,
    ...imageData,
  });
  const submitResp = await axios.post(
    "https://ocr.captchaai.com/in.php",
    formData.toString(),
  );
  const taskId = submitResp.data.split("|")[1];

  // Poll for result
  let indices;
  for (let i = 0; i < 30; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: "YOUR_API_KEY", action: "get", id: taskId },
    });
    if (result.data.startsWith("OK|")) {
      indices = result.data.split("|")[1];
      break;
    }
  }

  // Click correct images
  for (const idx of indices.split(",")) {
    await imageElements[parseInt(idx) - 1].click();
    await new Promise((r) => setTimeout(r, 300));
  }

  await browser.close();
})();

Résoudre reCAPTCHA en grille avec CaptchaAI

Aucune image à extraire : vous travaillez avec le sitekey et un token.

  • Relever le sitekey dans l'attribut data-sitekey.
  • Envoyer method=userrecaptcha avec googlekey et pageurl.
  • Interroger le résultat jusqu'à obtenir le token.
  • Injecter le token dans g-recaptcha-response ou l'envoyer par HTTP POST.

En Python

import requests
import time

# Step 1: Extract sitekey from page
# <div class="g-recaptcha" data-sitekey="6Le-wvkS..."></div>
sitekey = "6Le-wvkSAAAAAPBMRTvw..."
page_url = "https://example.com/form"

# Step 2: Submit to CaptchaAI
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url
})
task_id = resp.text.split("|")[1]

# Step 3: Poll for token
for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

# Step 4: Inject token (no clicking needed)
# Option A: Hidden field injection
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# Option B: Pure HTTP submission
requests.post(page_url, data={"g-recaptcha-response": token, "other_field": "value"})

En Node.js

const axios = require("axios");

async function solveRecaptchaGrid(sitekey, pageUrl) {
  // Submit
  const submitResp = await axios.get("https://ocr.captchaai.com/in.php", {
    params: {
      key: "YOUR_API_KEY",
      method: "userrecaptcha",
      googlekey: sitekey,
      pageurl: pageUrl,
    },
  });
  const taskId = submitResp.data.split("|")[1];

  // Poll for token
  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: "YOUR_API_KEY", action: "get", id: taskId },
    });
    if (result.data.startsWith("OK|")) {
      return result.data.split("|")[1];
    }
  }
  throw new Error("Solve timed out");
}

Sans session de navigateur, vous lancez plusieurs résolutions en parallèle. La capacité se mesure en threads : l'offre BASIC ($15/mois, 5 threads) en fait tourner cinq de front, avec des résolutions illimitées par thread.


L'effort d'intégration comparé

L'écart se lit directement en lignes de code.

Aspect BLS reCAPTCHA en grille
Extraction des images Manuelle, image par image, depuis le DOM Inutile — gérée en interne
Gestion des consignes Extraire le texte d'instruction de la page Inutile
Encodage base64 Obligatoire pour chaque image Inutile
Application de la réponse Cliquer les images selon les indices renvoyés Injecter le token (champ caché ou HTTP POST)
Automatisation du navigateur Obligatoire — pas d'alternative headless Facultative — de simples requêtes HTTP suffisent
Reprise sur erreur Réextraire les images Redemander un token
Résolution simultanée Limitée — images liées à la session Facile — demandes de token sans état
Lignes de code (ordre de grandeur) 40 à 60 lignes 15 à 25 lignes

En résumé :

  • BLS vous enferme dans le navigateur : images liées à la session, reprise coûteuse, parallélisme limité.
  • reCAPTCHA en grille reste sans état : moins de code, débit élevé, parallélisation triviale.

Dépannage

Problème Correctif BLS Correctif reCAPTCHA en grille
Réponse erronée renvoyée Vérifiez que la consigne correspond à ce qu'affiche la page Vérifiez le sitekey et l'URL de la page
Les images ne se chargent pas Ajoutez User-Agent et cookies lors de la récupération des URL Sans objet — aucune image à récupérer
Token rejeté Cliquez les indices dans le bon ordre sur la page Injectez dans g-recaptcha-response et exécutez le callback
Résolution trop lente Réduisez le nombre d'images : n'envoyez que celles visibles Utilisez un proxy proche du site cible

Questions fréquentes

BLS CAPTCHA repose-t-il sur la technologie de Google ?

Non. BLS CAPTCHA est une implémentation propriétaire, développée sur mesure pour les services de visa de BLS International ; reCAPTCHA est le produit de Google. Les deux ne partagent ni le format, ni la méthode : vous ne pouvez pas résoudre BLS avec la méthode token.

Combien coûte la résolution de ces CAPTCHA avec CaptchaAI ?

La facturation se fait au thread, pas à la résolution : chaque plan inclut un nombre illimité de résolutions par thread, sans surcoût par type de CAPTCHA. BLS et reCAPTCHA en grille consomment donc la même capacité. L'offre BASIC ($15/mois, 5 threads) permet cinq résolutions simultanées ; montez en gamme quand votre débit l'exige.

CaptchaAI prend-il en charge hCaptcha sur les portails qui l'utilisent ?

Non — hCaptcha n'est pas encore pris en charge, pas plus que FunCaptcha (Arkose Labs). Ce comparatif porte sur BLS CAPTCHA et reCAPTCHA en grille, tous deux pris en charge. Si un portail bascule vers hCaptcha, ces méthodes ne s'appliquent pas.

Que faire si la grille reCAPTCHA renvoie de nouvelles vignettes après ma sélection ?

C'est le comportement dynamique de reCAPTCHA : des vignettes réapparaissent en fondu tant que la sélection n'est pas jugée complète. Avec la méthode token, vous n'avez rien à gérer manuellement : vous récupérez un token valide en fin de traitement.


Guides associés

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