Use Cases

Headless Tarayıcı CAPTCHA Sorunları ve Çözümleri

Kısa cevap: headless tarayıcınız sürekli CAPTCHA'ya takılıyorsa en güvenilir yol, doğrulamayı gizlemeye çalışmak değil, çıktığı anda API ile çözmektir. Headless Chrome, Firefox ve WebKit; siteler tarafından JavaScript sinyalleriyle rutin olarak fark edilir, düşük güven puanı alır ve normal tarayıcılara göre çok daha sık doğrulama görür. Aşağıda önce sorunun kaynağını, ardından üretimde çalışan çözümleri sırayla ele alıyoruz.

Headless tarayıcılar neden daha çok CAPTCHA tetikler?

Anti-bot sistemleri (reCAPTCHA, Cloudflare, DataDome) tek bir sinyale değil, birkaç ipucunun birleşimine bakar. Headless bir tarayıcı, varsayılan yapılandırmasıyla bu ipuçlarının çoğunu aynı anda sızdırır:

Tespit sinyali Sitenin baktığı ipucu
WebDriver bayrağı Headless modda açık kalır ve otomasyonu ele verir
Pencere boyutu Headless çoğu zaman 800x600 varsayılanını kullanır
WebGL renderer Headless "SwiftShader" döndürür
Chrome DevTools Protocol (CDP) Açık CDP portu
Eksik eklentiler PDF görüntüleyici, medya eklentileri yok
Permissions API Headless'ta farklı yanıtlar
User-Agent "HeadlessChrome" alt dizesi

Bu sinyaller üst üste geldiğinde site güven puanınızı düşürür ve karşınıza doğrulama çıkarır. İyi haber şu: sinyalleri tek tek nötrlemek sıklığı azaltır, ama asıl işi çözüm katmanı yapar.

Pratikte bu sinyalleri üç gruba ayırabilirsiniz:

  • Otomasyon izleri: WebDriver bayrağı, açık CDP portu ve "HeadlessChrome" User-Agent — kurulumun bot olduğunu doğrudan ele verir.
  • Ortam eksiklikleri: varsayılan 800x600 pencere, eksik eklentiler ve "SwiftShader" WebGL çıktısı — gerçek bir masaüstü profiline benzemez.
  • API tutarsızlıkları: Permissions API'nin headless'ta verdiği farklı yanıtlar davranışsal skoru düşürür.

Tarayıcıya göre sık karşılaşılan sorunlar

Çözüme geçmeden önce, hangi kurulumun hangi belirtiyi ürettiğini bilmek işi hızlandırır. Aşağıdaki tablo en sık görülen sorunları ve doğrudan karşılığını özetler:

Tarayıcı Sorun Çözüm
Headless Chrome Otomasyon bayrağı açık kalıyor Otomasyon anahtarını devre dışı bırakın
Puppeteer Eksik tarayıcı eklentileri Standart yapılandırma eklentisini ekleyin
Selenium enable-automation anahtarı excludeSwitches: ["enable-automation"]
Playwright WebKit test profili işaretleniyor Chromium kanalını standart yamalarla kullanın
Hepsi Tutarsız pencere boyutu 1920x1080 ayarlayın veya rastgeleleştirin

Belirtiyi tespit ettikten sonra iki tamamlayıcı yaklaşım kalır: çıkan doğrulamayı API ile çözmek ve sinyalleri azaltarak sıklığı düşürmek. İkisini birlikte kullanın.

Çözüm 1: CAPTCHA'ları CaptchaAI API ile çözün

CAPTCHA'lar hiç çıkmasın diye uğraşmak yerine, göründükleri anda çözün. CaptchaAI doğrulamayı sunucu tarafında çözdüğü için hangi headless tarayıcıyı kullandığınızın bir önemi yoktur — Selenium, Puppeteer ya da Playwright fark etmez. Kütüphaneden bağımsız olarak akış hep aynı dört adımdır:

  • Sayfadan sitekey değerini okuyun.
  • in.php'ye görevi gönderin ve görev kimliğini alın.
  • res.php'yi periyodik olarak sorgulayıp sonucu bekleyin.
  • Dönen token'ı forma enjekte edip gönderin.

Selenium (Python)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import time

API_KEY = "YOUR_API_KEY"

options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=options)

driver.get("https://staging.example.com/qa-login")

# Check for CAPTCHA
recaptcha = driver.find_elements("class name", "g-recaptcha")
if recaptcha:
    site_key = recaptcha[0].get_attribute("data-sitekey")

    # Solve via CaptchaAI
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": site_key, "pageurl": driver.current_url
    })
    task_id = resp.text.split("|")[1]

    while True:
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        token = result.text.split("|")[1]
        break

    # Inject token
    driver.execute_script(
        f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
    )
    driver.find_element("css selector", "form").submit()

Puppeteer (Node.js)

const puppeteer = require("puppeteer");
const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto("https://staging.example.com/qa-login");

// Check for CAPTCHA
const siteKey = await page
  .$eval(".g-recaptcha", (el) => el.getAttribute("data-sitekey"))
  .catch(() => null);

if (siteKey) {
  const submit = await axios.get("https://ocr.captchaai.com/in.php", {
    params: {
      key: API_KEY,
      method: "userrecaptcha",
      googlekey: siteKey,
      pageurl: page.url(),
    },
  });
  const taskId = submit.data.split("|")[1];

  let token;
  while (true) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId },
    });
    if (result.data === "CAPCHA_NOT_READY") continue;
    token = result.data.split("|")[1];
    break;
  }

  await page.evaluate((t) => {
    document.getElementById("g-recaptcha-response").innerHTML = t;
  }, token);
  await page.click('button[type="submit"]');
}

Bu katman devrede olduğunda, headless tarayıcınız bir doğrulamaya çarptığında akış durmaz; token gelir, forma enjekte edilir ve iş devam eder.

Çözüm 2: CAPTCHA sıklığını azaltın

Doğrulamayı her zaman API ile çözebilseniz de, ne kadar seyrek çıkarsa hem çözüm süresinden hem de bütçeden tasarruf edersiniz. Birkaç basit yapılandırma, en kaba tespit sinyallerini kapatır. Aşağıdaki üç ayar çoğu kurulumda en yüksek etkiyi verir:

  • Otomasyon bayrağını nötrleyerek en bariz botu işaretini kaldırın.
  • Pencere boyutunu gerçekçi bir masaüstü çözünürlüğüne sabitleyin.
  • Topluluk eklentileriyle headless'a özgü sinyalleri standart bir profille örtün.

Otomasyon bayrağını nötrleyin

# Selenium
options.add_argument("--no-sandbox")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
// Puppeteer
await page.evaluateOnNewDocument(() => {
  Object.defineProperty(navigator, "webdriver", { get: () => false });
});

Gerçekçi pencere boyutu ayarlayın

Varsayılan 800x600 penceresi başlı başına bir işaret fişeğidir. Yaygın bir masaüstü çözünürlüğüne sabitleyin:

# Selenium
driver.set_window_size(1920, 1080)
// Puppeteer
await page.setViewport({ width: 1920, height: 1080 });

Standart yapılandırma eklentilerini kullanın

Topluluk eklentileri, headless'a özgü birkaç sinyali standart bir profille örter:

# Puppeteer
npm install puppeteer-extra puppeteer (varsayılan yapılandırma)
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer (varsayılan yapılandırma)");
puppeteer.use(StealthPlugin());
# Selenium
pip install undetected-chromedriver
import undetected_chromedriver as uc
driver = uc.Chrome(headless=True)

Çözüm 3: Cloudflare doğrulama akışını işleyin

Cloudflare doğrulama sayfaları tek bir token'dan fazlasını ister; sonraki isteklerinizi geçirebilmek için qa_session_cookie çerezine de ihtiyacınız olur. CaptchaAI cloudflare_challenge yöntemiyle bu akışı uçtan uca yürütür:

# CaptchaAI handles full Cloudflare doğrulama akışıs
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "cloudflare_challenge",
    "pageurl": "https://example.com",
    "proxy": "http://user:pass@proxy:port",
    "proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]

# Result includes qa_session_cookie cookie and user_agent
# Use both to make subsequent requests

Dönen çerez ve user_agent değerini birlikte kullanarak aynı oturumu sürdürün; ikisini ayrı ayrı taşırsanız akış yeniden doğrulama isteyebilir.

Türkiye'den ölçeklenen ekipler için pratik not

Türkiye'deki otomasyon ve veri kazıma ekipleri headless tarayıcıları en çok şu iş yüklerinde kullanıyor:

  • E-ticaret akışlarının uçtan uca QA testleri.
  • Fintech ve ödeme adımı otomasyonlarının doğrulanması.
  • Freelance otomasyon projelerinde tekrarlayan veri toplama işleri.

Bu iş yüklerinde token'ları düzenli olarak enjekte etmeniz gerektiğinde tahmin edilebilir maliyet önem kazanır: CaptchaAI thread bazlı fiyatlandırır, çözüm başına değil. En küçük plan olan BASIC ($15/ay, 5 thread) tek bir QA hattı için yeterlidir; paralel headless işçilerini ölçeklerken thread sayısı arttıkça ADVANCE ($90/ay, 50 thread) gibi üst planlara geçebilirsiniz. Fiyatlar USD üzerinden sabittir, bu da TL oynaklığına karşı öngörülebilir bir aylık gider sağlar.

KVKK ve yetkilendirme

Bir hatırlatma: kişisel veri içeren sayfaları kazırken KVKK kapsamındaki yükümlülükler geçerlidir. CaptchaAI'yi yalnızca yetkiniz olan QA ve veri toplama akışlarında, kendi sahibi olduğunuz ya da izinli olduğunuz hedeflerde kullanın.

Sık sorulan sorular

Headless kurulumlarda en sık karşılaşılan sorulara kısa ve doğrudan yanıtlar:

Headless Chrome neden normal Chrome'dan daha çok CAPTCHA gösteriyor?

Çünkü headless mod, otomasyon bayrağı, eksik eklentiler ve varsayılan pencere boyutu gibi birkaç sinyali aynı anda sızdırır. Bu sinyaller birleşince site güven puanınızı düşürür ve doğrulama gösterir. Sinyalleri nötrlemek sıklığı azaltır, ortaya çıkan doğrulamayı ise API ile çözersiniz.

CaptchaAI hangi headless tarayıcılarla çalışır?

Hepsiyle. Çözüm sunucu tarafında yapıldığı için Selenium, Puppeteer ve Playwright dahil her headless kurulumla çalışır; kütüphaneden bağımsızdır. Tek yapmanız gereken sayfadan sitekey'i okuyup token'ı forma enjekte etmektir.

reCAPTCHA v2 token'ını headless tarayıcıya nasıl enjekte ederim?

Dönen token'ı g-recaptcha-response alanına yazıp formu gönderirsiniz. Yukarıdaki Selenium ve Puppeteer örnekleri tam akışı gösteriyor: in.php'ye görev gönderin, res.php'den sonucu sorgulayın, gelen token'ı enjekte edin.

CaptchaAI hangi CAPTCHA türlerini destekliyor?

reCAPTCHA v2/v3, Cloudflare Turnstile ve Cloudflare Challenge, GeeTest v3, görüntü/OCR, grid ve BLS türlerini destekler; CaptchaFox (beta), Friendly Captcha (beta) ve Lemin (beta) beta aşamasındadır. hCaptcha ve FunCaptcha ise henüz desteklenmiyor.

Headless çözüm maliyeti nasıl hesaplanır?

Maliyet, çözüm başına değil eşzamanlı thread sayısına göre belirlenir ve her planda thread başına sınırsız çözüm bulunur. BASIC ($15/ay, 5 thread) ile başlayıp paralel işçi sayınızı büyüttükçe daha yüksek thread'li planlara geçebilirsiniz.

Özetle: sinyalleri azaltmak headless kurulumunuzu sakinleştirir, ama tek başına yeterli değildir. Güvenilir olan yaklaşım, çıkan doğrulamayı API ile çözen bir katman eklemek ve otomasyonu durdurmadan devam ettirmektir.

İlgili kılavuzlar

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