Bir ızgara görüntü CAPTCHA'sını otomatik çözmenin yolu üç adımdır: görüntüyü yakalayın, CaptchaAI'nin OCR uç noktasına (in.php, method=post + recaptcha=1) gönderin ve dönen hücre indekslerini veya koordinatları sayfaya uygulayın. Bu rehber, reCAPTCHA'ya ait olmayan özel ızgara sorgularını Python ve Node.js ile uçtan uca çözer.
Izgara görüntü CAPTCHA'sı büyük bir görseli 3×3 veya 4×4 hücreye böler ve kullanıcıdan bir açıklamaya uyan kareleri seçmesini ister. Google'ın reCAPTCHA'sı bu düzeni kullansa da birçok site kendi bağımsız ızgara doğrulamasını çalıştırır — CaptchaAI'nin method=post akışı tam olarak bu reCAPTCHA dışı ızgaralar için tasarlanmıştır.
Akışın tamamı dört adımdan oluşur:
- Izgara görüntüsünü yakalayın.
- Görüntüyü CaptchaAI'ye gönderin.
- Çözümü sorgulayın.
- Dönen hücreleri veya koordinatları sayfaya uygulayın.
Bu yöntem ne zaman doğru seçim?
Karar noktası basit — sorgunun reCAPTCHA'ya bağlı olup olmadığına bakın:
method=post(ızgara/OCR) kullanın: site görseli tek bir statik resim olarak sunuyorsa ve Google altyapısına bağlı değilse.method=userrecaptcha(token) kullanın: standart reCAPTCHA sorgularında; bu yöntem daha basit ve kararlıdır.
Tipik bir senaryo: Türkiye'deki bir e-ticaret ekibinin, ödeme adımındaki özel ızgara doğrulamasını otomatik regresyon testlerinde çözmesi gerekir. Her sürümde formu elle doldurmak yerine test botu ızgarayı yakalar, CaptchaAI'ye gönderir ve dönen hücreleri tıklayarak akışı uçtan uca doğrular. Kişisel veri işleyen iş akışlarında KVKK kapsamını unutmayın — bu yöntemi yalnızca yetkilendirilmiş QA ve veri toplama süreçlerinde kullanın.
Başlamadan önce: gereksinimler
Başlamadan önce elinizde şunlar olsun:
- CaptchaAI API anahtarı — captchaai.com üzerinden alın.
- Izgara görüntüsü — tam ızgaranın ekran görüntüsü veya base64'ü.
- Çalışma ortamı — Python 3.7+ veya Node.js 14+.
Adım 1: Izgara görüntüsünü yakalayın
Önce çözülecek ızgarayı bir görüntü olarak elde edin. İki yaygın yöntem var.
Yöntem A: CAPTCHA öğesinin ekran görüntüsünü alın
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/protected-form")
# Screenshot just the captcha container
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
captcha_element.screenshot("captcha_grid.png")
Yöntem B: Görüntüyü src özniteliğinden çıkarın
import base64
import requests
captcha_img = driver.find_element(By.CSS_SELECTOR, ".grid-captcha img")
src = captcha_img.get_attribute("src")
if src.startswith("data:image"):
image_b64 = src.split(",")[1]
else:
image_data = requests.get(src).content
image_b64 = base64.b64encode(image_data).decode()
Yöntem seçimi için birkaç ipucu:
- Görüntü bir
<img>etiketindedata:imageolarak gömülüyse Yöntem B tek satırda base64'ü verir. - Izgara canvas'tan veya birden çok katmandan oluşuyorsa Yöntem A'daki ekran görüntüsü daha güvenilirdir.
- Her iki durumda da hücre sınırlarının net göründüğünden ve görüntünün kenarlardan kırpılmadığından emin olun — kenardan kesilen bir kare, çözüm doğruluğunu düşüren en yaygın nedendir.
Adım 2: Görüntüyü CaptchaAI'ye gönderin
Görüntüyü OCR uç noktasına (in.php) gönderin ve dönen görev kimliğini (task_id) saklayın. Uç nokta iki giriş biçimini de kabul eder:
- Dosya yükleme — diskte bir PNG dosyanız olduğunda.
- Base64 — görüntüyü zaten bellekte veya
data:imagesrc'sinde tuttuğunuzda.
Dosya yükleyerek (Python)
import requests
import time
API_KEY = "YOUR_API_KEY"
with open("captcha_grid.png", "rb") as f:
response = requests.post("https://ocr.captchaai.com/in.php",
data={
"key": API_KEY,
"method": "post",
"recaptcha": 1,
"json": 1
},
files={"file": f}
)
data = response.json()
task_id = data["request"]
print(f"Task: {task_id}")
Base64 ile (Python)
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "post",
"body": image_b64,
"recaptcha": 1,
"json": 1
})
task_id = response.json()["request"]
Node.js
const axios = require('axios');
const fs = require('fs');
async function submitGridCaptcha(imagePath) {
const imageB64 = fs.readFileSync(imagePath).toString('base64');
const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'post',
body: imageB64,
recaptcha: 1,
json: 1
}
});
return data.request;
}
Adım 3: Çözümü sorgulayın
Sonuç hazır olana kadar res.php uç noktasını periyodik olarak sorgulayın. CAPCHA_NOT_READY yanıtı gelirken bekleyin; status: 1 çözümünüzün hazır olduğunu gösterir.
def get_grid_solution(task_id):
for _ in range(30):
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.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
raise Exception("Timeout")
solution = get_grid_solution(task_id)
print(f"Solution: {solution}")
# Returns click coordinates or cell indices
Döngünün davranışını üretime taşımadan önce netleştirin:
- Beş saniyede bir en fazla 30 kez dener; bu da yaklaşık iki buçuk dakikalık bir üst sınırdır.
CAPCHA_NOT_READYyanıtı gelirken beklemeye devam eder;status: 1çözümün hazır olduğunu gösterir.- Beklenmeyen bir hata kodunda görevi körlemesine yeniden göndermek yerine önce yanıtı inceleyin ve her denemeyi loglayın.
Adım 4: Çözümü sayfaya uygulayın
CaptchaAI çözümü iki biçimden birinde döndürür; sayfanızın yapısına uyan bloğu kullanın:
- Hücre indeksleri (
2,5,6) — DOM'da ayrı ayrı tıklanabilir hücreler varsa. - Piksel koordinatları (
x=120,y=80) — tek bir görüntü katmanı üzerinde konuma göre tıklamanız gerekiyorsa.
Hücre indeksine göre tıklama
# If solution returns cell indices (e.g., "2,5,6")
selected = [int(i) for i in solution.split(",")]
cells = driver.find_elements(By.CSS_SELECTOR, ".grid-cell")
for idx in selected:
cells[idx - 1].click()
time.sleep(0.2)
driver.find_element(By.CSS_SELECTOR, ".verify-button").click()
Koordinata göre tıklama
from selenium.webdriver.common.action_chains import ActionChains
# If solution returns coordinates (e.g., "x=120,y=80;x=250,y=200")
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
actions = ActionChains(driver)
for coord in solution.split(";"):
parts = dict(p.split("=") for p in coord.split(","))
x, y = int(parts["x"]), int(parts["y"])
actions.move_to_element_with_offset(captcha_element, x, y).click()
actions.perform()
Maliyet: thread bazlı, çözüm başına değil
CaptchaAI çözüm başına değil, eş zamanlı thread başına faturalandırır. Bu, sabit aylık USD gideriyle çalışan test botları için öngörülebilir bir model sunar:
- BASIC ($15/ay, 5 thread) — aynı anda beş ızgara görevini sınırsız çözümle işler.
- STANDARD ($30/ay, 15 thread) — orta ölçekli regresyon paketleri için.
- ADVANCE ($90/ay, 50 thread) — yüksek hacimli, paralel test iş yükleri için.
Günlük kota, CAPTCHA türüne göre ek ücret veya çözüm başı gizli maliyet yoktur. TL kur oynaklığına karşı sabit USD aylık fiyat, gider planlamasını kolaylaştırır.
Sık sorulan sorular
Base64 mü yoksa dosya yükleme mi kullanmalıyım?
İkisi de aynı sonucu verir. Görüntü zaten data:image src'sine gömülüyse base64 daha pratiktir; diskte bir PNG dosyanız varsa doğrudan dosya yükleme daha temizdir.
Izgara çözme CaptchaAI'de ne kadara mal olur?
Faturalandırma thread bazlıdır. BASIC planı ($15/ay, 5 thread) aynı anda beş ızgarayı sınırsız çözümle işler; çözüm başı ücret veya CAPTCHA türüne göre ek ücret yoktur.
Yanlış hücreler seçiliyor, sorun ne?
Neredeyse her zaman çözüm biçimi uyuşmazlığıdır. Yanıtın hücre indeksleri mi (2,5,6) yoksa koordinatlar mı (x=120,y=80) döndürdüğünü kontrol edin ve uygulama kodunda ilgili bloğu seçin.
reCAPTCHA'nın ızgarasını da bu yöntemle çözebilir miyim?
Statik tek görüntüler için evet. Ancak tıklandıkça karelerin yenilendiği dinamik reCAPTCHA ızgaralarında token yöntemini (method=userrecaptcha) kullanın; method=post akışı tek bir sabit görüntüyü çözer.
Görüntü boyutu için bir sınır var mı?
Evet. Dosyayı PNG veya JPEG biçiminde ve 600 KB'nin altında tutun. Çok küçük veya bulanık görseller ERROR_CAPTCHA_UNSOLVABLE döndürebilir; ortalama çözüm süresi 15–30 saniyedir.
Tam çalıştırılabilir örnek
Ortam kurulumu, sorgulama, yeniden denemeler ve hata işlemeyi içeren eksiksiz bir çalışan projeye mi ihtiyacınız var?
Tam çalıştırılabilir örneği GitHub'da inceleyin →
Sık karşılaşılan hatalar ve çözümleri
Izgara çözümünde sorunların büyük çoğunluğu görüntü kalitesinden veya biçim uyuşmazlığından kaynaklanır. Aşağıdaki tablo en sık karşılaşılanları toplar.
| Hata | Neden | Çözüm |
|---|---|---|
ERROR_WRONG_FILE_EXTENSION |
Geçersiz görüntü biçimi | PNG veya JPEG kullanın; base64'ün geçerli olduğunu doğrulayın |
ERROR_CAPTCHA_UNSOLVABLE |
Görüntü çok küçük veya bulanık | Tam çözünürlükte yakalayın |
| Yanlış hücreler seçiliyor | Çözüm biçimi uyuşmazlığı | Yanıtın indeks mi koordinat mı olduğunu denetleyin |
ERROR_TOO_BIG_CAPTCHA_FILESIZE |
Görüntü boyut sınırını aşıyor | 600 KB'nin altına yeniden boyutlandırın |
Bu hataların çoğu tek bir kökten gelir: görüntü kalitesi. Yakalamayı tam çözünürlükte alıp doğru biçimde göndermek, sonraki sorun giderme adımlarının çoğunu gereksiz kılar.