Karşılaştırmalar

CAPTCHA Otomasyonu için WebDriver ve Chrome DevTools Protokolü

Otomasyon için Chrome'u iki protokol kontrol eder: WebDriver (W3C standardı, Selenium tarafından kullanılır) ve Chrome DevTools Protokolü (CDP, Puppeteer/Playwright tarafından kullanılır). Her birinin farklı algılama profilleri, yetenekleri ve CAPTCHA işleme özellikleri vardır.


Protokol Mimarisi

WebDriver (Selenium):
  Script ──HTTP──▶ ChromeDriver ──DevTools──▶ Chrome
  (JSON Wire)        (bridge)      (internal)

CDP (Puppeteer/Playwright):
  Script ──WebSocket──▶ Chrome
  (direct)               (no middle layer)

Bire Bir Karşılaştırma

Özellik Web Sürücüsü CDP
Protokol HTTP + JSON WebSocket
Standart W3C standardı Chrome'a özel
Algılama yüzeyi Yüksek (navigator.userAgent = true) Daha düşük (düzeltilebilir)
Ağa müdahale Hayır (Selenium Wire gerekir) Dahili (Fetch, Network)
JavaScript değerlendirmesi executeScript (sarılmış) Runtime.evaluate (doğrudan)
Değişiklik iste Hayır Evet
Yanıt değişikliği Hayır Evet
Bağlantı yükü Komut başına HTTP Kalıcı WebSocket
Çapraz tarayıcı Chrome, Firefox, Safari, Kenar Yalnızca Chrome/Chromium
Gizlilik potansiyeli Düşük (her zaman web sürücüsü bayrağını ayarlar) Yüksek (bayrak yamalanabilir)

Algılama Farklılıkları

Web Sürücüsü Algılama (Selenyum)

// What sites check for Selenium
navigator.userAgent                    // true (set by ChromeDriver)
document.$cdc_asdjflasutopfhvcZLmcfl  // ChromeDriver internal variable
window.callSelenium                    // Older Selenium versions
window._selenium                      // Selenium internals
document.__webdriver_evaluate          // WebDriver namespace
# Even with flag removal, ChromeDriver leaves traces
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

driver = webdriver.Chrome(options=options)

# Still detectable via $cdc variables in document

CDP Tespiti (Puppeteer)

// Puppeteer sets webdriver flag too, but it's fully patchable
await page.evaluateOnNewDocument(() => {
  Object.defineProperty(navigator, 'webdriver', {
    get: () => undefined,
  });
  // No $cdc variables to worry about
  // No Selenium-specific traces
});

CAPTCHA Çözümü: Web Sürücüsü Yaklaşımı

# Selenium (WebDriver) + CaptchaAI
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

API_KEY = "YOUR_API_KEY"
API_URL = "https://ocr.captchaai.com"

options = webdriver.ChromeOptions()
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=options)

driver.get("https://example.com/form")
time.sleep(2)

# Extract sitekey
sitekey = driver.execute_script(
    "return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)

# Solve via CaptchaAI
resp = requests.post(f"{API_URL}/in.php", data={
    "key": API_KEY, "method": "userrecaptcha",
    "googlekey": sitekey, "pageurl": driver.current_url, "json": 1,
})
task_id = resp.json()["request"]

for _ in range(60):
    time.sleep(5)
    resp = requests.get(f"{API_URL}/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": 1,
    })
    data = resp.json()
    if data["request"] != "CAPCHA_NOT_READY":
        break

token = data["request"]

# Inject token
driver.execute_script(f"""
    document.querySelector('#g-recaptcha-response').value = '{token}';
    document.querySelectorAll('[name="g-recaptcha-response"]')
        .forEach(el => {{ el.value = '{token}'; }});
""")

driver.find_element(By.CSS_SELECTOR, "form").submit()
driver.quit()

CAPTCHA Çözümü: CDP Yaklaşımı

// Puppeteer (CDP) + CaptchaAI
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer (varsayılan yapılandırma)");
const https = require("https");

puppeteer.use(StealthPlugin());

const API_KEY = "YOUR_API_KEY";
const API_URL = "https://ocr.captchaai.com";

function solveCaptcha(siteUrl, sitekey) {
  // Submit + poll (simplified)
  return new Promise(async (resolve, reject) => {
    const submitResp = await httpPost(`${API_URL}/in.php`, {
      key: API_KEY, method: "userrecaptcha",
      googlekey: sitekey, pageurl: siteUrl, json: "1",
    });

    const taskId = submitResp.request;

    for (let i = 0; i < 60; i++) {
      await new Promise((r) => setTimeout(r, 5000));
      const result = await httpGet(
        `${API_URL}/res.php?key=${API_KEY}&action=get&id=${taskId}&json=1`
      );
      if (result.request !== "CAPCHA_NOT_READY") {
        return resolve(result.request);
      }
    }
    reject(new Error("Timeout"));
  });
}

(async () => {
  const browser = await puppeteer.launch({
    headless: "new",
    args: ["--no-sandbox", "--window-size=1920,1080"],
  });

  const page = await browser.newPage();

  // CDP: Enable network interception
  const cdp = await page.createCDPSession();
  await cdp.send("Network.enable");

  // Monitor CAPTCHA-related requests
  cdp.on("Network.requestWillBeSent", (params) => {
    if (params.request.url.includes("recaptcha")) {
      console.log(`CAPTCHA request: ${params.request.url}`);
    }
  });

  await page.goto("https://example.com/form", { waitUntil: "networkidle0" });

  const sitekey = await page.evaluate(() =>
    document.querySelector("[data-sitekey]")?.getAttribute("data-sitekey")
  );

  if (sitekey) {
    const token = await solveCaptcha(page.url(), sitekey);

    // CDP: Inject via Runtime.evaluate (lower-level than page.evaluate)
    await cdp.send("Runtime.evaluate", {
      expression: `
        document.querySelector('#g-recaptcha-response').value = '${token}';
        document.querySelector('form').submit();
      `,
    });
  }

  await browser.close();
})();

CAPTCHA İş Akışları için Yetenek Karşılaştırması

Ağ Müdahalesi

# WebDriver: Cannot intercept requests natively
# Requires selenium-wire (third-party)
from seleniumwire import webdriver

driver = webdriver.Chrome()
# selenium-wire proxies all traffic through a local proxy
// CDP: Built-in request interception
await cdp.send("Fetch.enable", {
  patterns: [{ urlPattern: "*recaptcha*" }],
});

cdp.on("Fetch.requestPaused", async ({ requestId, request }) => {
  console.log(`Intercepted: ${request.url}`);
  await cdp.send("Fetch.continueRequest", { requestId });
});

Yanıt Değişikliği

// CDP: Can modify responses (WebDriver cannot)
cdp.on("Fetch.requestPaused", async ({ requestId, request }) => {
  if (request.url.includes("captcha-config")) {
    // Return modified response
    await cdp.send("Fetch.fulfillRequest", {
      requestId,
      responseCode: 200,
      body: btoa(JSON.stringify({ enabled: false })),
    });
  } else {
    await cdp.send("Fetch.continueRequest", { requestId });
  }
});

Çerez Manipülasyonu

# WebDriver: Standard cookie API
driver.add_cookie({"name": "session", "value": "abc123"})
cookies = driver.get_cookies()
// CDP: Full cookie control including httpOnly
await cdp.send("Network.setCookie", {
  name: "session",
  value: "abc123",
  domain: "example.com",
  httpOnly: true,
  secure: true,
});

// Get all cookies including httpOnly (WebDriver can't access these)
const { cookies } = await cdp.send("Network.getAllCookies");

Karar Matrisi

Senaryo Önerilen neden
Çoklu tarayıcı testi Web Sürücüsü Çapraz tarayıcı desteği
Maksimum gizlilik CDP Alt algılama yüzeyi
Ağ hata ayıklaması CDP Dahili müdahale
CDP'ye aşina olmayan ekip Web Sürücüsü Daha basit API, daha fazla belge
Yüksek ölçekli kazıma CDP Oturum başına daha düşük ek yük
CI/CD entegrasyonu Web Sürücüsü Daha iyi takım desteği
CAPTCHA ağırlıklı siteler CDP + CaptchaAI Gizlilik + çözüm kombinasyonu
Basit form doldurma Web Sürücüsü + CaptchaAI Uygulaması daha kolay

Hibrit Yaklaşım: WebDriver + CDP

Selenium 4, BiDi (çift yönlü) aracılığıyla CDP komutlarını destekler:

from selenium import webdriver

driver = webdriver.Chrome()

# Use WebDriver for navigation
driver.get("https://example.com")

# Use CDP for QA testi patches
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        });
    """
})

# Use CDP for network events
driver.execute_cdp_cmd("Network.enable", {})

Performans Karşılaştırmaları

Metrik Web Sürücüsü (Selenyum) CDP (Puppeteer) CDP (Oyun Yazarı)
Oturum başlangıcı ~2,5sn ~1,5sn ~1,2sn
Sayfada gezinme ~500ms ek yük ~100ms ek yük ~80ms ek yük
Komut dosyası yürütme Çağrı başına ~200ms ~Çağrı başına 50ms ~Çağrı başına 40ms
Oturum başına bellek ~350MB ~280MB ~260MB
CAPTCHA çözümü (CaptchaAI) 15-30'lar 15-30'lar 15-30'lar

CaptchaAI çözüm süresi aynıdır — tarayıcı protokolünden bağımsız bir API çağrısıdır.


Sorun giderme

Sorun Web Sürücüsü Düzeltmesi CDP Düzeltmesi
Bot olarak algılandı excludeSwitches + seçenekler Gizli eklenti + yamalar
İsteklere müdahale edilemiyor Selenyum teli kullanın Fetch.enable'yi kullanın
Yavaş yürütme execute_script çağrılarını azaltın Toplu CDP komutları
Jeton enjeksiyonu başarısız oluyor iframe bağlamını kontrol edin Runtime.evaluate'yi bağlamla kullanın
Oturum kararsızlığı ChromeDriver'ı güncelleyin WebSocket bağlantısını kontrol edin

SSS

Hangi protokol daha iyi CAPTCHA başarı oranları sağlar?

Başarı oranları aynıdır — CaptchaAI sunucu tarafında çözer. Protokol yalnızca algılama sıklığını (CAPTCHA'ların ne sıklıkta göründüğünü) etkiler.

WebDriver ile CDP'yi karıştırabilir miyim?

Evet. Selenyum 4, execute_cdp_cmd()'yi ortaya çıkarır. Gezinme için WebDriver'ı ve gizli yamalar için CDP'yi kullanın.

Oyun Yazarı her ikisinden de daha mı iyi?

Playwright, CDP'yi dahili olarak kullanır ancak otomatik bekleme ve daha iyi hata işleme özelliklerine sahip daha yüksek düzeyde bir API sağlar. İyi bir orta yol.

CAPTCHA çalışması için Selenium'dan Puppeteer'a geçmeli miyim?

Eğer tespit asıl sorununuzsa, evet. Tarayıcılar arası desteğe ihtiyacınız varsa Selenium + CaptchaAI ile kalın.


İlgili Kılavuzlar


CAPTCHA iş akışınız için doğru otomasyon protokolünü seçin —CaptchaAI anahtarınızı alınve protokolden bağımsız olarak CAPTCHA'ları çözün.

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