BLS CAPTCHA'yı otomatik çözmenin yolu üç adımdan ibarettir: 3×3 ızgaradaki dokuz görüntüyü ve üstteki sayısal talimat kodunu çıkarın, ikisini birlikte CaptchaAI API'ye gönderin, dönen hücre indekslerini işaretleyip formu gönderin. Kodun anlamını sizin çözmeniz gerekmez — model, hangi hücrelerin talimatla eşleştiğini bir dizi olarak döndürür. Aşağıda çıkarma, gönderme ve tıklama adımlarını Python ve Node.js örnekleriyle uçtan uca göreceksiniz.
BLS CAPTCHA nasıl çalışır ve talimat kodu ne anlatır?
BLS doğrulaması, dokuz görselden oluşan bir 3×3 ızgara ve bu ızgaranın üstünde duran sayısal bir talimat kodu etrafında kurulur. Hücreler soldan sağa, yukarıdan aşağıya numaralandırılır:
1 2 3
4 5 6
7 8 9
Ekranda gördüğünüz üç parçayı şöyle ayırabilirsiniz:
- 3×3 ızgara — 9 görüntü hücresi; her biri ayrı bir görsel içerir.
- Sayısal talimat kodu — hangi hücrelerin seçileceğini belirten üç veya daha fazla haneli bir sayı (ör. 664, 123, 546).
- Yanıt — talimatla eşleşen hücre indekslerinin (1-9) bir dizisi; API bunu size döndürür.
Standart onay kutusu doğrulamalarından farkı, tek bir tık yerine görsel içeriğe göre birden çok hücre seçimi istemesidir. Türkiye'de bu ızgara tipini en çok Schengen vize başvurusu için kullanılan BLS randevu portallarında görürsünüz; aşağıdaki akış yalnızca bu CAPTCHA türünü çözmeye odaklanır ve kodu sizin yorumlamanızı gerektirmez.
Adım 1: Izgara görüntülerini ve talimat kodunu çıkarın
İlk iş, dokuz hücreyi base64'e çevirmek ve talimat metnindeki sayıyı yakalamaktır. Çıkarma sırasında üç ayrıntı önemlidir:
- Görsel
data:imageolarak gömülüyse veri URI'sini doğrudan kullanın. srcbir URL ise görüntüyü sunucu tarafında indirip base64'e dönüştürün — çapraz menşe kısıtlaması bu yolla çözülür.- Talimat çoğu zaman "Select all boxes with number 664" gibi bir cümlenin içindedir; üç veya daha fazla haneli sayıyı bir düzenli ifadeyle ayıklamak en güvenli yöntemdir.
Python (Selenium)
import base64
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/bls-protected-page")
# Find the grid container
grid_cells = driver.find_elements(By.CSS_SELECTOR, ".captcha-grid img")
images = []
for cell in grid_cells:
src = cell.get_attribute("src")
if src.startswith("data:image"):
images.append(src)
else:
# Download and convert to base64
import requests
img_data = requests.get(src).content
b64 = base64.b64encode(img_data).decode()
images.append(f"data:image/png;base64,{b64}")
# Extract the instruction code
instruction_el = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction")
instruction_code = instruction_el.text.strip()
# e.g., "664" or parsed from "Select all boxes with number 664"
import re
code_match = re.search(r'(\d{3,})', instruction_code)
instruction = code_match.group(1) if code_match else instruction_code
print(f"Instruction: {instruction}")
print(f"Images extracted: {len(images)}")
JavaScript (Puppeteer)
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com/bls-protected-page');
// Extract grid images as base64
const images = await page.evaluate(() => {
const cells = document.querySelectorAll('.captcha-grid img');
return Array.from(cells).map(img => {
const canvas = document.createElement('canvas');
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
canvas.getContext('2d').drawImage(img, 0, 0);
return canvas.toDataURL('image/png');
});
});
// Extract instruction code
const instruction = await page.evaluate(() => {
const el = document.querySelector('.captcha-instruction');
const match = el.textContent.match(/(\d{3,})/);
return match ? match[1] : el.textContent.trim();
});
console.log(`Instruction: ${instruction}, Images: ${images.length}`);
Adım 2: Görüntüleri ve talimat kodunu CaptchaAI'ye gönderin
BLS çözücü, in.php uç noktasına gönderilen istekte şu alanları bekler:
| Alan | Değer |
|---|---|
method |
bls |
instructions |
Adım 1'de ayıklanan talimat kodu (ör. 664) |
image_base64_1 … image_base64_9 |
Dokuz hücrenin base64 verisi |
json |
1 (yanıtı JSON olarak almak için) |
Görevi gönderdikten sonra bir görev kimliği alırsınız; sonucu res.php üzerinden periyodik olarak sorgulayın. Yanıt hazır olduğunda, seçilmesi gereken hücrelerin indekslerini içeren bir dizi döner.
Python
import requests
import time
import json
API_KEY = "YOUR_API_KEY"
# Prepare submission data
data = {
"key": API_KEY,
"method": "bls",
"instructions": instruction,
"json": "1",
}
# Add all 9 images
files = {}
for i, img in enumerate(images):
files[f"image_base64_{i+1}"] = (None, img)
# Submit
resp = requests.post(
"https://ocr.captchaai.com/in.php",
data=data,
files=files
).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
print(f"Task ID: {task_id}")
# Poll for result
for _ in range(20):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": "1"
}).json()
if result["status"] == 1:
solution = json.loads(result["request"])
print(f"Selected cells: {solution}") # e.g., [1, 4, 7, 8]
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
JavaScript
const axios = require('axios');
const FormData = require('form-data');
const form = new FormData();
form.append('key', 'YOUR_API_KEY');
form.append('method', 'bls');
form.append('instructions', instruction);
form.append('json', '1');
images.forEach((img, i) => {
form.append(`image_base64_${i + 1}`, img);
});
const submit = await axios.post('https://ocr.captchaai.com/in.php', form, {
headers: form.getHeaders(),
});
const taskId = submit.data.request;
// Poll
let solution = null;
for (let i = 0; i < 20; i++) {
await new Promise(r => setTimeout(r, 5000));
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (poll.data.status === 1) {
solution = JSON.parse(poll.data.request);
break;
}
}
console.log('Selected cells:', solution); // e.g., [2, 4, 7]
Adım 3: Dönen hücreleri tıklayın ve formu gönderin
CaptchaAI 1 tabanlı indeksler döndürür (ör. [1, 4, 7, 8]). Dizinin her elemanından 1 çıkarıp ilgili hücre öğesine tıklayın, ardından doğrulama formunu gönderin. İndeks-hücre eşlemesini ters çevirmemek burada tek kritik ayrıntıdır.
# Selenium — click the cells returned by CaptchaAI
grid_cells = driver.find_elements(By.CSS_SELECTOR, ".captcha-grid .cell")
for cell_index in solution:
# cell_index is 1-based
grid_cells[cell_index - 1].click()
# Submit the form
submit_btn = driver.find_element(By.CSS_SELECTOR, ".captcha-submit")
submit_btn.click()
// Puppeteer
const cells = await page.$$('.captcha-grid .cell');
for (const idx of solution) {
await cells[idx - 1].click();
}
await page.click('.captcha-submit');
Tam iş akışını tek fonksiyonda toplayın
Üç adımı üretimde tek bir yardımcı fonksiyonda birleştirmek, hata yönetimini ve yeniden denemeyi belirgin biçimde kolaylaştırır. Aşağıdaki fonksiyon çıkarma, gönderme, sorgulama ve tıklama adımlarını sırayla yürütür:
def solve_bls_captcha(driver, api_key):
"""Extract, solve, and submit a BLS CAPTCHA."""
import base64, requests, time, json, re
# 1. Extract images
grid_cells = driver.find_elements(By.CSS_SELECTOR, ".captcha-grid img")
images = []
for cell in grid_cells:
src = cell.get_attribute("src")
if src.startswith("data:image"):
images.append(src)
else:
img_data = requests.get(src).content
b64 = base64.b64encode(img_data).decode()
images.append(f"data:image/png;base64,{b64}")
# 2. Extract instruction
el = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction")
match = re.search(r'(\d{3,})', el.text)
instruction = match.group(1)
# 3. Submit to CaptchaAI
data = {"key": api_key, "method": "bls", "instructions": instruction, "json": "1"}
files = {f"image_base64_{i+1}": (None, img) for i, img in enumerate(images)}
resp = requests.post("https://ocr.captchaai.com/in.php", data=data, files=files).json()
task_id = resp["request"]
# 4. Poll
for _ in range(20):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get", "id": task_id, "json": "1"
}).json()
if result["status"] == 1:
solution = json.loads(result["request"])
break
# 5. Click cells
clickable = driver.find_elements(By.CSS_SELECTOR, ".captcha-grid .cell")
for idx in solution:
clickable[idx - 1].click()
return solution
Sık sorulan sorular
BLS CAPTCHA çözmek için 9 görüntünün hepsini göndermem gerekir mi?
Evet. Çözücü ızgaranın tamamını birlikte değerlendirir; image_base64_1 ile image_base64_9 arasındaki dokuz alanın hepsi dolu olmalıdır. Eksik gönderim tipik olarak ERROR_BAD_PARAMETERS döndürür.
BLS CAPTCHA çözümü ne kadar sürer?
Genellikle birkaç saniye içinde tamamlanır. Örnek kod 5 saniyede bir sorgular; gerçek süre ağ gecikmesine ve anlık yüke göre değişir. Kısa bir üst zaman aşımı belirlemek üretimde iş kuyruğunuzu öngörülebilir tutar.
BLS otomasyonu için hangi CaptchaAI planı yeterli?
Düşük hacim için BASIC ($15/ay, 5 thread) çoğu senaryoya yeter. Eşzamanlı iş arttıkça STANDARD ($30/ay, 15 thread) veya ADVANCE ($90/ay, 50 thread) planına geçin. Ücret thread başınadır; her thread ay boyunca sınırsız çözüm yapar.
Yanlış hücreler dönerse ne yapmalıyım?
Önce hücre-indeks eşlemesini doğrulayın: indeksler 1 tabanlıdır ve hücreler soldan sağa, yukarıdan aşağıya sıralanır. Sorun sürerse ızgarayı yeniden çıkarıp taze görsellerle yeni bir görev gönderin.
CaptchaAI BLS ızgara CAPTCHA'leri için ne kadar güvenilir?
CaptchaAI, BLS ızgara CAPTCHA'leri için yüksek bir başarı oranı bildirir. Sonuçlar görüntü kalitesine ve portalın zaman içinde değişen tasarımına göre farklılık gösterebilir.
Üretimde güvenilirlik ve maliyet
Otomasyonu prototipten üretime taşırken maliyet ve dayanıklılık birlikte planlanmalıdır.
İpucu: Talimat kodunu her zaman düzenli ifadeyle ayıklayın. Portallar kodu bazen görünür bir sayı yerine bir cümlenin içine gömer; sabit bir konuma güvenmek üretimde kırılgan bir çözümdür.
Dikkat edilecek noktalar:
- Zaman aşımı ve sorgulama: Örnekler 5 saniyede bir, en fazla 20 kez sorgular. Yoğun saatlerde sonuç gecikebilir; sabit bir üst sınır koyup zaman aşımını ayrı bir durum olarak yakalayın.
- Yeniden deneme:
ERROR_BAD_PARAMETERSveya boş bir yanıt gelirse aynı görevi tekrar sorgulamak yerine ızgarayı yeniden çıkarıp yeni bir görev gönderin. - Eşzamanlılık ve maliyet: CaptchaAI thread başına ücretlendirir, çözüm başına değil. Küçük bir kuyruk için BASIC ($15/ay, 5 thread) yeterlidir; daha yüksek hacimde PREMIUM ($170/ay, 100 thread) gibi planlara çıkabilirsiniz. Fiyatlar USD'dir ve TL kurundan bağımsız olarak sabittir — bu, aylık bütçe planlayan Türk ekipler için öngörülebilirlik sağlar.
- KVKK uyumu: BLS portallarından toplanan kişisel veriler KVKK kapsamına girer. Otomasyonu yalnızca yetkili olduğunuz iş akışlarında çalıştırın.
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
ERROR_BAD_PARAMETERS |
Eksik resimler veya talimat yok | 9 görüntünün tamamının geçerli base64 veri URI'leri olduğundan emin olun |
| Yanlış hücreler seçildi | Yanlış hücre-indeks eşlemesi | Hücrelerin soldan sağa, yukarıdan aşağıya 1-9 arasında numaralandırıldığını doğrulayın |
| Resimler yüklenmiyor | Çapraz menşe kısıtlaması | Görüntüleri sunucu tarafında indirin ve base64'e dönüştürün |
| Talimat kodu boş | Talimat resimde gizli | Talimat metnini çıkarın veya talimat görüntüsünü OCR yapın |
Sürekli CAPCHA_NOT_READY |
Sonuç henüz hazır değil | Sorgulama aralığını koruyun; 20 denemeden sonra görevi baştan gönderin |
BLS CAPTCHA'leri CaptchaAI ile çözün
API anahtarınızı captchaai.com üzerinden alın, örnek kodu iş akışınıza ekleyin ve ilk BLS ızgaranızı birkaç dakikada çözün.