Eğitimler

Iframe CAPTCHA Çıkarma: İç İçe Çerçevelerdeki CAPTCHA'ları Çözme

CAPTCHA'lar genellikle bir veya daha fazla iframe'in içine gömülür. CAPTCHA widget'ı, kendisi de kalıcı bir iframe'in içinde olan bir ödeme iframe'inin içinde yer alabilir. Bu CAPTCHA'ları çözmek için iframe ağacında gezinmeniz, site anahtarını çıkarmanız, CaptchaAI aracılığıyla çözmeniz ve belirteci tekrar doğru çerçeve bağlamına yerleştirmeniz gerekir.


iframe CAPTCHA'ları nasıl çalışır?

Tipik bir iç içe geçmiş yapı:

Main page
  └── iframe#payment-frame (cross-origin)
        └── iframe[src*="recaptcha/api2/anchor"] (Google-hosted)
              └── reCAPTCHA widget

Site anahtarı dış iframe'de (widget'ı oluşturan) bulunur. En içteki Google iframe görsel zorluktur; onunla doğrudan etkileşimde bulunmazsınız. İhtiyacınız olan şey data-sitekey özelliği veya iframe src'deki k= parametresidir.


Python: Selenyum iframe geçişi

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import re
import time

API_KEY = "YOUR_API_KEY"
driver = webdriver.Chrome()
driver.get("https://example.com/checkout")

# Step 1: Switch into the outer iframe
wait = WebDriverWait(driver, 15)
outer_iframe = wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "iframe#payment-frame"))
)
driver.switch_to.frame(outer_iframe)

# Step 2: Find the reCAPTCHA iframe and extract sitekey
recaptcha_iframe = wait.until(
    EC.presence_of_element_located(
        (By.CSS_SELECTOR, 'iframe[src*="recaptcha/api2/anchor"]')
    )
)
src = recaptcha_iframe.get_attribute("src")
sitekey = re.search(r"k=([A-Za-z0-9_-]+)", src).group(1)
page_url = driver.current_url
print(f"Sitekey: {sitekey}")
print(f"Page URL: {page_url}")

# Step 3: Solve with CaptchaAI
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url,
    "json": "1"
})
task_id = resp.json()["request"]

token = None
for _ in range(24):
    time.sleep(5)
    poll = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": "1"
    }).json()
    if poll["status"] == 1:
        token = poll["request"]
        break
    if poll["request"] != "CAPCHA_NOT_READY":
        raise Exception(poll["request"])

print(f"Token: {token[:50]}...")

# Step 4: Inject token (still inside the outer iframe)
driver.execute_script("""
    document.querySelector('textarea[name="g-recaptcha-response"]').value = arguments[0];
    if (typeof grecaptcha !== 'undefined') {
        grecaptcha.getResponse = function() { return arguments[0]; };
    }
""", token)

# Step 5: Switch back to main page
driver.switch_to.default_content()
print("Token injected, switched back to main frame")

Beklenen çıktı:

Sitekey: 6Le-SITEKEY-abc123
Page URL: https://example.com/checkout
Token: 03AGdBq26ZfPxL...
Token injected, switched back to main frame

JavaScript: Puppeteer çerçeve işleme

Puppeteer birinci sınıf çerçeve desteğine sahiptir; manuel geçişe gerek yoktur.

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

const API_KEY = 'YOUR_API_KEY';

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  await page.goto('https://example.com/checkout', {
    waitUntil: 'networkidle2'
  });

  // Step 1: Find the payment iframe
  const paymentFrameHandle = await page.waitForSelector('iframe#payment-frame');
  const paymentFrame = await paymentFrameHandle.contentFrame();

  // Step 2: Find reCAPTCHA iframe inside the payment frame
  const recaptchaFrameHandle = await paymentFrame.waitForSelector(
    'iframe[src*="recaptcha/api2/anchor"]'
  );
  const src = await paymentFrame.evaluate(
    el => el.getAttribute('src'), recaptchaFrameHandle
  );

  const sitekey = src.match(/k=([A-Za-z0-9_-]+)/)[1];
  const pageUrl = page.url();
  console.log(`Sitekey: ${sitekey}`);

  // Step 3: Solve with CaptchaAI
  const submitResp = await axios.post('https://ocr.captchaai.com/in.php', null, {
    params: {
      key: API_KEY,
      method: 'userrecaptcha',
      googlekey: sitekey,
      pageurl: pageUrl,
      json: 1
    }
  });
  const taskId = submitResp.data.request;

  let token = null;
  for (let i = 0; i < 24; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const pollResp = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
    });
    if (pollResp.data.status === 1) {
      token = pollResp.data.request;
      break;
    }
    if (pollResp.data.request !== 'CAPCHA_NOT_READY') {
      throw new Error(pollResp.data.request);
    }
  }

  console.log(`Token: ${token.substring(0, 50)}...`);

  // Step 4: Inject token into the payment frame
  await paymentFrame.evaluate((tkn) => {
    const textarea = document.querySelector(
      'textarea[name="g-recaptcha-response"]'
    );
    textarea.value = tkn;

    const callback = document.querySelector('.g-recaptcha')
      ?.getAttribute('data-callback');
    if (callback && typeof window[callback] === 'function') {
      window[callback](tkn);
    }
  }, token);

  console.log('Token injected into payment iframe');
})();

Derinlemesine yuvalanmış iframe'ler

Üç veya daha fazla yuvalama seviyesi için çerçeve anahtarlarını zincirleyin:

Selenyum

# Main → iframe-1 → iframe-2 → CAPTCHA
driver.switch_to.frame(driver.find_element(By.ID, "iframe-1"))
driver.switch_to.frame(driver.find_element(By.ID, "iframe-2"))
# Now extract sitekey from this context

# To go back up one level:
driver.switch_to.parent_frame()

# To go back to main:
driver.switch_to.default_content()

Puppeteer

const frame1 = await (await page.$('iframe#iframe-1')).contentFrame();
const frame2 = await (await frame1.$('iframe#iframe-2')).contentFrame();
// Extract sitekey from frame2

Yaygın hatalar

hata Ne olur? Düzeltme
Ana sayfa URL'sini pageurl olarak kullanma Jeton site tarafından reddedildi CAPTCHA widget'ını oluşturan çerçevenin URL'sini kullanın
Ana çerçeveye geri dönülmüyor Sonraki eylemler başarısız oluyor Enjeksiyondan sonra switch_to.parent_frame() veya switch_to.default_content()'yi arayın
Site anahtarını yanlış iframe'den çıkarma ERROR_WRONG_GOOGLEKEY Site anahtarı, dahili Google meydan okuma iframe'inde değil, .g-recaptcha'yi içeren iframe'dedir
Çapraz kökenli iframe JS'yi engelliyor Konsolda SecurityError Kaynaklar arası bir iframe içinde execute_script yapamazsınız; bunun yerine site anahtarını src özelliğinden çıkarın

SSS

İframe çapraz kökenlidir. Yine de site anahtarını çıkarabilir miyim?

Evet. Site anahtarı, iframe öğesinin ana çerçeveden okunabilen src özelliğinde veya data-sitekey özelliğindedir. Hiçbir zaman çapraz köken iframe içinde JavaScript çalıştırmanıza gerek kalmaz.

pageurl için ana sayfa URL'sini mi yoksa iframe URL'sini mi kullanmalıyım?

reCAPTCHA widget'ını yükleyen sayfanın URL'sini kullanın. Bu genellikle üst düzey sayfa değil, iframe'in kendi URL'sidir. Onaylamak için sitenin reCAPTCHA yapılandırmasını kontrol edin.

Belirteci hangi kareye enjekte edeceğimi nasıl bileceğim?

Belirteci textarea[name="g-recaptcha-response"] öğesini içeren çerçeveye enjekte edin; bu her zaman .g-recaptcha div'i oluşturan çerçevedir.


CaptchaAI ile CAPTCHA'ları istediğiniz iframe derinliğinde çözün

API anahtarınızı şu adresten alın:captchaai.com.


İlgili kılavuzlar

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