Hướng Dẫn Thực Hành

Trích xuất CAPTCHA iframe: Giải CAPTCHA trong các khung lồng nhau

CAPTCHA thường được nhúng bên trong một hoặc nhiều iframe. Tiện ích CAPTCHA có thể nằm bên trong iframe thanh toán, chính nó cũng nằm trong iframe phương thức. Để giải các CAPTCHA này, bạn cần điều hướng cây iframe, trích xuất khóa trang web, giải quyết thông qua CaptchaAI và đưa mã thông báo trở lại ngữ cảnh khung chính xác.


Cách hoạt động của iframe CAPTCHA

Một cấu trúc lồng nhau điển hình:

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

Khóa trang web nằm trong iframe bên ngoài (iframe hiển thị tiện ích). Khung nội tuyến trong cùng của Google là thách thức trực quan — bạn không tương tác trực tiếp với nó. Thuộc tính data-sitekey hoặc thông số k= trong iframe src là những gì bạn cần.


Python: Chuyển đổi iframe Selenium

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")

Sản lượng dự kiến:

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

JavaScript: Xử lý khung hình của người múa rối

Puppeteer có hỗ trợ khung hình hạng nhất - không cần chuyển đổi thủ công.

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');
})();

Iframe lồng nhau sâu

Đối với ba cấp độ lồng nhau trở lên, hãy xâu chuỗi các công tắc khung:

Selen

# 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

Những lỗi thường gặp

sai lầm Chuyện gì xảy ra sửa chữa
Sử dụng URL trang chính là pageurl Mã thông báo bị trang web từ chối Sử dụng URL của khung hiển thị tiện ích CAPTCHA
Không chuyển về khung gốc Các hành động tiếp theo không thành công Gọi switch_to.parent_frame() hoặc switch_to.default_content() sau khi tiêm
Trích xuất khóa trang web từ iframe sai ERROR_WRONG_GOOGLEKEY Khóa trang web nằm trên iframe chứa .g-recaptcha, không phải iframe thử thách bên trong Google
JS chặn iframe nhiều nguồn gốc SecurityError trong bảng điều khiển Bạn không thể execute_script bên trong iframe có nguồn gốc chéo - thay vào đó hãy trích xuất khóa trang web từ thuộc tính src

Câu hỏi thường gặp

Iframe có nguồn gốc chéo. Tôi vẫn có thể trích xuất sitekey được không?

Vâng. Khóa trang web nằm trong thuộc tính src hoặc data-sitekey của phần tử iframe, có thể đọc được từ khung chính. Bạn không bao giờ cần phải thực thi JavaScript bên trong iframe có nguồn gốc chéo.

Tôi nên sử dụng URL trang mẹ hay URL iframe cho pageurl?

Sử dụng URL của trang tải tiện ích reCAPTCHA. Đây thường là URL riêng của iframe chứ không phải trang cấp cao nhất. Kiểm tra cấu hình reCAPTCHA của trang web để xác nhận.

Làm cách nào để biết khung nào cần chèn mã thông báo vào?

Đưa mã thông báo vào khung chứa phần tử textarea[name="g-recaptcha-response"] — đây luôn là khung hiển thị div .g-recaptcha.


Giải CAPTCHA ở mọi độ sâu iframe bằng CaptchaAI

Nhận khóa API của bạn tạicaptchaai.com.


Hướng dẫn liên quan

Os comentários estão desativados para este artigo.