API Tutorials

Izgara Görüntüsü CAPTCHA'sını Otomatik Olarak Çözme

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:

  1. Izgara görüntüsünü yakalayın.
  2. Görüntüyü CaptchaAI'ye gönderin.
  3. Çözümü sorgulayın.
  4. 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> etiketinde data:image olarak 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:image src'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_READY yanı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.


İlgili kılavuzlar

Bu makale için yorumlar devre dışı bırakılmıştır.