API Tutorials

Özel CAPTCHA türleri: sıra dışı doğrulamaları CaptchaAI ile çözme

Her CAPTCHA'nın adı bilinen, hazır bir çözücüsü yoktur. Bir kaydırıcıyı doğru noktaya sürüklemenizi, bir görseli düzgün yöne döndürmenizi ya da tamamen siteye özgü bir JavaScript widget'ını tamamlamanızı isteyen doğrulamalarla karşılaştığınızda tek bir yöntem neredeyse her seferinde iş görür: ekranın görüntüsünü alın, base64'e çevirin ve ne yapılması gerektiğini düz metin talimatı olarak CaptchaAI'nin OCR uç noktasına gönderin. Aşağıda bu deseni bir kez kuruyor, ardından kaydırıcı, döndürme, sıralı seçim, ses ve özel widget türlerine tek tek uyguluyoruz.

İstanbul'daki bir e-ticaret ekibinin kendi ödeme akışını test ederken karşılaştığı türden — reCAPTCHA'ya da Turnstile'a benzemeyen — siteye özel bir doğrulama, bu yaklaşımın tipik hedefidir. Doğrulamanın adını bilmeniz gerekmez; ekranda ne gördüğünüzü bir cümleyle tarif edebilmeniz yeterlidir. Yöntem özetle şu dört adımdan oluşur:

  • Doğrulama bileşeninin ekran görüntüsünü alın ve base64'e çevirin.
  • Ne yapılması gerektiğini tek cümlelik düz metin talimatı olarak yazın.
  • Görseli ve talimatı birlikte in.php uç noktasına gönderin.
  • res.php üzerinden sonucu sorgulayın ve dönen değeri ilgili arayüz öğesine uygulayın.

Özel CAPTCHA türlerini tanıma

Elinizdeki doğrulamanın hangi kategoriye girdiğini bilmek, doğru talimatı yazmanın ilk adımıdır. En sık karşılaşılan özel türler ve her biri için izlenecek yaklaşım:

Tür Nasıl çalışır Yaklaşım
Kaydırıcı (slider) Parçayı doğru konuma sürükleme Ekran görüntüsü + metin talimatı
Yapboz (puzzle) Eksik parçayı yuvasına oturtma GeeTest tarzı çözümle örtüşebilir
Ses (audio) Sesi dinleyip yazma Ses dosyasını gönderme
Görsel döndürme Görseli doğru yöne çevirme Ekran görüntüsü + talimat
Sıralı seçim Öğeleri belirli sırayla tıklama Görsel ızgara yaklaşımı
Matematik Aritmetik işlemi çözme calc=1 parametresi
Siteye özel widget Siteye özgü JS bileşeni Ekran görüntüsü + metin talimatı

Tüm görsel CAPTCHA'lar için ortak yöntem

Kurmanız gereken tek çekirdek fonksiyon budur. Sonraki tüm türler bu fonksiyonu çağırır — yani entegrasyonu bir kez kurar, her yerde kullanırsınız. Fonksiyon üç işi sırayla yapar:

  1. Görselin base64 halini ve talimatı in.php uç noktasına gönderir.
  2. Dönen görev kimliğini (task_id) alır.
  3. Çözüm hazır olana kadar res.php uç noktasını sorgular.
import requests
import base64
import time
import os

API_KEY = os.environ["CAPTCHAAI_API_KEY"]


def solve_custom_captcha(image_b64, instructions):
    """Solve any visual CAPTCHA using image + text instructions."""
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "textinstructions": instructions,
        "json": 1,
    }, timeout=30)

    result = resp.json()
    if result.get("status") != 1:
        raise RuntimeError(result.get("request"))

    task_id = result["request"]

    time.sleep(10)
    for _ in range(30):
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get",
            "id": task_id, "json": 1,
        }, timeout=15)
        data = resp.json()
        if data.get("status") == 1:
            return data["request"]
        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("Solve timeout")

CAPCHA_NOT_READY yanıtı bir hata değildir; işlemin hâlâ sürdüğü anlamına gelir. Döngü bu yanıtı gördüğünde beklemeyi sürdürür ve yalnızca gerçek bir hata kodunda ya da zaman aşımında durur.


Kaydırıcı (slider) konumu CAPTCHA'ları

Kaydırıcı doğrulamalarında amaç, tutamacı hedef piksel konumuna taşımaktır. Widget'ın ekran görüntüsünü çözücüye gönderip yalnızca X ofset değerini isteyin; dönen sayıyı Selenium'un ActionChains yapısıyla sürükleme hareketine çevirin.

# slider_captcha.py
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains


def solve_slider_captcha(driver, captcha_selector):
    """Screenshot slider CAPTCHA and solve via CaptchaAI."""
    captcha = driver.find_element(By.CSS_SELECTOR, captcha_selector)
    image_b64 = captcha.screenshot_as_base64

    result = solve_custom_captcha(
        image_b64,
        "What pixel position should the slider be dragged to? "
        "Return only the X offset number."
    )

    try:
        offset = int(result)
    except ValueError:
        return False

    # Drag slider to position
    slider = driver.find_element(By.CSS_SELECTOR, ".slider-handle")
    ActionChains(driver).click_and_hold(slider).move_by_offset(offset, 0).release().perform()

    return True
  • Çözücü yalnızca X ofset sayısını döndürür; sürükleme hareketini Selenium tarafında siz gerçekleştirirsiniz.
  • Sürükleme sonrası doğrulama başarısız olursa ofseti birkaç piksel ayarlayıp yeniden deneyin.

Döndürme (rotation) CAPTCHA'ları

Bu türde görsel yanlış açıyla gösterilir ve düz konuma getirilmesi beklenir. Çözücüden görselin saat yönünde kaç derece döndürüleceğini isteyin; sonucu 90'a bölüp döndürme düğmesine o kadar kez tıklayın.

# rotation_captcha.py


def solve_rotation_captcha(driver, captcha_selector):
    """Solve rotation CAPTCHA."""
    captcha = driver.find_element(By.CSS_SELECTOR, captcha_selector)
    image_b64 = captcha.screenshot_as_base64

    result = solve_custom_captcha(
        image_b64,
        "How many degrees should this image be rotated clockwise "
        "to be in the correct upright orientation? Return only the number."
    )

    try:
        degrees = int(result)
    except ValueError:
        return False

    # Click rotation button the correct number of times
    rotate_btn = driver.find_element(By.CSS_SELECTOR, ".rotate-button")
    clicks = degrees // 90  # Each click rotates 90 degrees

    for _ in range(clicks):
        rotate_btn.click()
        time.sleep(0.3)

    return True

Sıralı seçim CAPTCHA'ları

Bazı doğrulamalar öğelere belirli bir sırayla tıklamanızı ister. Dönen listeyi ayrıştırıp öğelere sırayla tıklarsınız; talimatı net tutmak için çözücüden şu kurallara uygun bir yanıt isteyin:

  1. Konumları soldan sağa ve yukarıdan aşağıya numaralayın.
  2. Numaralandırmayı 1'den başlatın.
  3. Değerleri virgülle ayırın.
# order_captcha.py


def solve_order_captcha(driver, captcha_selector, item_selector):
    """Solve click-in-order CAPTCHA."""
    captcha = driver.find_element(By.CSS_SELECTOR, captcha_selector)
    image_b64 = captcha.screenshot_as_base64

    result = solve_custom_captcha(
        image_b64,
        "What is the correct order? Return as comma-separated "
        "numbers (1-indexed) representing positions left-to-right, top-to-bottom."
    )

    # Parse order
    try:
        order = [int(x.strip()) for x in result.split(",")]
    except ValueError:
        return False

    # Click items in order
    items = driver.find_elements(By.CSS_SELECTOR, item_selector)
    for idx in order:
        if 1 <= idx <= len(items):
            items[idx - 1].click()
            time.sleep(0.5)

    return True

Ses (audio) CAPTCHA'ları

Görsel doğrulamanın yanında ses alternatifi sunan siteler için ses dosyasını indirip base64'e çevirin ve konuşulan karakterleri yazıya dökmesi için talimatla gönderin. Ses desteği base64 yöntemiyle denenebilir; sonuç görsele göre daha değişken olabilir.

# audio_captcha.py
import requests


def solve_audio_captcha(audio_url):
    """Download and solve an audio CAPTCHA."""
    # Download audio
    resp = requests.get(audio_url, timeout=30)
    audio_b64 = base64.b64encode(resp.content).decode("ascii")

    # Submit as image with instructions
    # CaptchaAI may support audio via the base64 method
    result = solve_custom_captcha(
        audio_b64,
        "This is an audio CAPTCHA. Transcribe the spoken characters."
    )
    return result

Ses tarafında doğruluk, kaydın netliğine ve arka plan gürültüsüne bağlı olarak değişir; kritik akışlarda görsel alternatifi öncelemek daha güvenilir sonuç verir.


Tamamen özel widget'lar

Hiçbir kalıba uymayan, tamamen siteye özgü bir bileşenle karşılaştığınızda mantık aynı kalır. Aşağıdaki fonksiyon şu dört adımı tek akışta toplar:

  1. Bileşenin tamamının ekran görüntüsünü alın.
  2. Ekranda görünen talimat metnini yakalayın.
  3. Görsel ve talimatı çözücüye birlikte gönderin.
  4. Dönen yanıtı ilgili giriş alanına yazın.
# custom_widget.py
from selenium import webdriver
from selenium.webdriver.common.by import By


def handle_custom_widget(driver, widget_selector):
    """Handle an unknown custom CAPTCHA widget."""

    # Step 1: Screenshot the entire widget
    widget = driver.find_element(By.CSS_SELECTOR, widget_selector)
    image_b64 = widget.screenshot_as_base64

    # Step 2: Get any visible instructions
    try:
        instructions_el = widget.find_element(By.CSS_SELECTOR, ".instructions, .prompt, p")
        visible_instructions = instructions_el.text
    except Exception:
        visible_instructions = "Solve this CAPTCHA"

    # Step 3: Submit with descriptive instructions
    result = solve_custom_captcha(
        image_b64,
        f"CAPTCHA instructions: {visible_instructions}. "
        f"Return the answer text."
    )

    # Step 4: Try to submit result
    try:
        input_el = widget.find_element(By.CSS_SELECTOR, "input")
        input_el.clear()
        input_el.send_keys(result)
    except Exception:
        # No input — try clicking based on result
        driver.execute_script("""
            var input = document.querySelector('input[name*="captcha"]');
            if (input) input.value = arguments[0];
        """, result)

    return result

Giriş alanı bulunamazsa fonksiyon, name özniteliğinde captcha geçen alanı JavaScript ile bulup değeri yazan bir yedeğe düşer; bu, standart dışı işaretlemeye sahip widget'larda işe yarar.


Sayfadaki CAPTCHA türünü otomatik algılama

Aynı botu farklı sayfalarda çalıştırıyorsanız, hangi doğrulamanın karşınıza çıktığını sayfanın HTML'ine bakarak önden belirlemek işinizi kolaylaştırır. Aşağıdaki basit desen eşleştirici, tespit ettiği türleri döndürür; siz de akışı doğru çözücüye yönlendirirsiniz.

# detector.py
import re


def detect_captcha_type(page_html):
    """Detect which CAPTCHA type is on a page."""
    checks = {
        "recaptcha_v2": r'data-sitekey.*g-recaptcha',
        "recaptcha_v3": r'recaptcha/api\.js\?render=',
        "turnstile": r'cf-turnstile|challenges\.cloudflare\.com/turnstile',
        "geetest": r'gt\b.*challenge|geetest',
        "bls": r'method.*bls|bls-captcha',
        "image_text": r'captcha.*\.(png|jpg|gif|jpeg)',
        "slider": r'slider.*captcha|slide.*verify',
        "audio": r'audio.*captcha|captcha.*audio',
    }

    detected = []
    for captcha_type, pattern in checks.items():
        if re.search(pattern, page_html, re.IGNORECASE):
            detected.append(captcha_type)

    return detected if detected else ["unknown"]

Kendi sayfalarınız dışında veri toplarken kişisel veri işliyorsanız bunun KVKK kapsamına girdiğini unutmayın; bu tür otomasyonları yetkili QA ve veri toplama akışlarıyla sınırlı tutun.


Sorun giderme

En sık karşılaşılan durumlar ve pratik çözümleri:

Sorun Olası sebep Çözüm
ERROR_CAPTCHA_UNSOLVABLE Görsel bulanık ya da talimat belirsiz Ekran görüntüsü kalitesini ve talimatın netliğini artırın
Yanıt biçimi yanlış Çözücü değer yerine açıklama döndürdü Talimatı daraltın: "Yalnızca sayıyı döndür"
Widget yakalanmıyor Öğe görünür alanın dışında Ekran görüntüsünden önce öğeye kaydırın
Etkileşim başarısız Tıklama koordinatları hatalı Çözümü gerçek arayüz öğeleriyle dikkatlice eşleyin

SSS

Görsel + metin talimatı yöntemi hangi durumlarda en iyi sonucu verir?

Adı belirli bir çözücüye eşlenmeyen, görüntüsü net okunabilen ve talimatı tek cümlede tarif edilebilen doğrulamalarda en iyi sonucu verir. Bulanık görsellerde ya da yalnızca davranış analizine dayanan akışlarda doğruluk düşer.

Kaydırıcı ya da döndürme sonucunu tarayıcıya nasıl uygularım?

Çözücü size bir sayı veya metin döndürür; tarayıcı etkileşimini siz yaparsınız. Kaydırıcıda dönen X ofsetini ActionChains ile sürükleyin, döndürmede dereceyi 90'a bölüp düğmeye o kadar kez tıklayın.

Ses CAPTCHA'sı da aynı uç noktaya gönderilebilir mi?

Evet. Ses dosyasını base64'e çevirip aynı in.php uç noktasına "konuşulan karakterleri yaz" talimatıyla gönderebilirsiniz. Yalnızca ses temelli doğrulamalarda görsele göre daha değişken sonuç beklenebilir.

CaptchaAI görsel tarafında kaç CAPTCHA çeşidini destekliyor?

CaptchaAI görsel/OCR tarafında 27.500'den fazla CAPTCHA çeşidini destekler. Gerçekten yeni ve siteye özgü türler için ekran görüntüsü + metin talimatı yöntemi en geniş kapsamı sağlar.


İlgili kılavuzlar


Ücretsiz hesabınızı açın ve ilk özel CAPTCHA'nızı ekran görüntüsü + talimat yöntemiyle çözün — CaptchaAI ile başlayın.

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