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) | |
| 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=blsavec extraction des images. - Site protégé par reCAPTCHA :
method=userrecaptchaavec 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=blsavecinstructionset les champsimage_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=userrecaptchaavecgooglekeyetpageurl. - Interroger le résultat jusqu'à obtenir le token.
- Injecter le token dans
g-recaptcha-responseou 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
- résoudre BLS CAPTCHA pas à pas — la procédure d'intégration BLS complète
- résoudre reCAPTCHA v2 via l'API — le tutoriel reCAPTCHA v2 complet
- le défi reCAPTCHA en grille expliqué — le fonctionnement des défis en grille
- erreurs BLS CAPTCHA et dépannage — les correctifs propres à BLS