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

Tự động hóa trình duyệt di động Giải quyết CAPTCHA bằng CaptchaAI

Tự động hóa trình duyệt trên thiết bị di động gặp phải các CAPTCHA giống như trên máy tính để bàn — hộp kiểm reCAPTCHA, thử thách Cloudflare, lưới hình ảnh — nhưng cũng phải đối mặt với các vấn đề đặc biệt dành riêng cho thiết bị di động như bố cục phản hồi, tương tác chỉ bằng cảm ứng và các dấu vân tay Tác nhân người dùng khác nhau.CaptchaAIxử lý việc giải quyết bất kể bối cảnh thiết bị.

Hướng dẫn này bao gồm hai cách tiếp cận: Selenium với Chrome dành cho Android thông qua ADB và mô phỏng di động của Playwright trên máy tính để bàn.

Kịch bản thế giới thực

Bạn đang tự động hóa việc gửi biểu mẫu trên trang web được tối ưu hóa cho thiết bị di động phục vụ reCAPTCHA v2. Trang web phát hiện Tác nhân người dùng trên thiết bị di động và hiển thị bố cục CAPTCHA dành riêng cho thiết bị di động. Bạn cần giải CAPTCHA và gửi biểu mẫu từ ngữ cảnh trình duyệt trên thiết bị di động.

Cách tiếp cận 1: Mô phỏng Playwright trên thiết bị di động (Python)

Mô phỏng thiết bị của Playwright là cách đơn giản nhất để tự động hóa trình duyệt di động bằng tính năng giải CAPTCHA — không cần thiết bị vật lý:

# playwright_mobile_captcha.py
import asyncio
import httpx
from playwright.async_api import async_playwright

API_KEY = "YOUR_API_KEY"

async def solve_recaptcha(sitekey: str, pageurl: str) -> str:
    """Submit reCAPTCHA v2 to CaptchaAI and poll for result."""
    async with httpx.AsyncClient(timeout=180) as client:
        # Submit task
        resp = await client.get(
            "https://ocr.captchaai.com/in.php",
            params={
                "key": API_KEY,
                "method": "userrecaptcha",
                "googlekey": sitekey,
                "pageurl": pageurl,
                "json": "1",
            },
        )
        result = resp.json()
        if result["status"] != 1:
            raise Exception(f"Submit failed: {result['request']}")

        task_id = result["request"]

        # Poll for result
        for _ in range(30):
            await asyncio.sleep(5)
            poll = await client.get(
                "https://ocr.captchaai.com/res.php",
                params={
                    "key": API_KEY,
                    "action": "get",
                    "id": task_id,
                    "json": "1",
                },
            )
            poll_result = poll.json()
            if poll_result["status"] == 1:
                return poll_result["request"]
            if poll_result["request"] != "CAPCHA_NOT_READY":
                raise Exception(f"Solve failed: {poll_result['request']}")

        raise Exception("Polling timeout")

async def main():
    async with async_playwright() as p:
        # Launch with iPhone 13 emulation
        iphone = p.devices["iPhone 13"]
        browser = await p.chromium.launch(headless=False)
        context = await browser.new_context(**iphone)
        page = await context.new_page()

        await page.goto("https://example.com/mobile-form")
        await page.wait_for_selector(".g-recaptcha", timeout=10000)

        # Extract sitekey
        sitekey = await page.get_attribute(".g-recaptcha", "data-sitekey")
        pageurl = page.url
        print(f"Found sitekey: {sitekey}")

        # Solve via CaptchaAI
        token = await solve_recaptcha(sitekey, pageurl)
        print(f"Token received: {token[:50]}...")

        # Inject token
        await page.evaluate(f"""
            document.getElementById('g-recaptcha-response').value = '{token}';
            document.getElementById('g-recaptcha-response').style.display = '';
        """)

        # Trigger callback if it exists
        await page.evaluate(f"""
            try {{
                const clients = ___grecaptcha_cfg.clients;
                Object.keys(clients).forEach(k => {{
                    Object.keys(clients[k]).forEach(j => {{
                        if (clients[k][j] && clients[k][j].callback) {{
                            clients[k][j].callback('{token}');
                        }}
                    }});
                }});
            }} catch(e) {{}}
        """)

        # Submit form
        await page.click('button[type="submit"]')
        await page.wait_for_load_state("networkidle")
        print("Form submitted successfully")

        await browser.close()

asyncio.run(main())

Cách tiếp cận 2: Selenium với Mô phỏng di động (JavaScript)

Sử dụng Selenium với mô phỏng di động Giao thức DevTools của Chrome cho quy trình làm việc của Node.js:

// selenium_mobile_captcha.js
const { Builder, By, until } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const axios = require('axios');

const API_KEY = 'YOUR_API_KEY';

async function solveCaptcha(sitekey, pageurl) {
  // Submit task
  const submitResp = await axios.get('https://ocr.captchaai.com/in.php', {
    params: {
      key: API_KEY,
      method: 'userrecaptcha',
      googlekey: sitekey,
      pageurl: pageurl,
      json: '1',
    },
  });

  if (submitResp.data.status !== 1) {
    throw new Error(`Submit failed: ${submitResp.data.request}`);
  }

  const taskId = submitResp.data.request;

  // Poll for result
  for (let i = 0; i < 30; 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) return pollResp.data.request;
    if (pollResp.data.request !== 'CAPCHA_NOT_READY') {
      throw new Error(`Solve failed: ${pollResp.data.request}`);
    }
  }
  throw new Error('Polling timeout');
}

async function main() {
  // Configure mobile emulation
  const mobileEmulation = {
    deviceMetrics: { width: 390, height: 844, pixelRatio: 3.0 },
    userAgent:
      'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) ' +
      'AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1',
  };

  const options = new chrome.Options();
  options.setMobileEmulation(mobileEmulation);

  const driver = await new Builder()
    .forBrowser('chrome')
    .setChromeOptions(options)
    .build();

  try {
    await driver.get('https://example.com/mobile-form');
    await driver.wait(until.elementLocated(By.css('.g-recaptcha')), 10000);

    // Extract sitekey
    const captchaEl = await driver.findElement(By.css('.g-recaptcha'));
    const sitekey = await captchaEl.getAttribute('data-sitekey');
    const pageurl = await driver.getCurrentUrl();

    console.log(`Sitekey: ${sitekey}`);

    // Solve CAPTCHA
    const token = await solveCaptcha(sitekey, pageurl);
    console.log(`Token: ${token.substring(0, 50)}...`);

    // Inject token
    await driver.executeScript(`
      document.getElementById('g-recaptcha-response').value = arguments[0];
    `, token);

    // Submit form
    await driver.findElement(By.css('button[type="submit"]')).click();
    console.log('Form submitted');
  } finally {
    await driver.quit();
  }
}

main().catch(console.error);

Những cân nhắc dành riêng cho thiết bị di động

Yếu tố Máy tính để bàn Điện thoại di động Tác động đến CAPTCHA
Tác nhân người dùng Chrome máy tính để bàn/Firefox Safari di động/Chrome Một số trang web cung cấp các cấu hình CAPTCHA khác nhau tùy theo thiết bị
Chế độ xem 1920×1080+ 390×844 Tiện ích CAPTCHA có thể hiển thị khác
Sự kiện chạm Sự kiện chuột Sự kiện chạm Một số CAPTCHA xác thực loại tương tác
Mạng Băng thông rộng 4G/5G Có thể cần thời gian chờ lâu hơn

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
CAPTCHA không hiển thị trong mô phỏng di động Trang web phát hiện mô phỏng thông qua navigator.platform Đặt ghi đè nền tảng trong Giao thức DevTools
Không tìm thấy vùng văn bản g-recaptcha-response Bố cục trên thiết bị di động sử dụng kết xuất CAPTCHA khác nhau Tìm kiếm vùng văn bản theo thuộc tính tên thay vì ID
Việc chèn mã thông báo hoạt động nhưng biểu mẫu vẫn không thành công Máy chủ xác thực tính nhất quán của Tác nhân người dùng Đảm bảo sử dụng cùng một Tác nhân người dùng để giải quyết và gửi biểu mẫu
Tải trang chậm trong mô phỏng Các trang nặng về tài nguyên Sử dụng cờ Chrome --disable-images để tăng tốc độ tải

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

Tôi nên sử dụng thiết bị di động thực hay mô phỏng?

Quá trình mô phỏng nhanh hơn để phát triển và các thiết bị CI/CD. Real thông qua Appium hoặc ADB sẽ tốt hơn cho các tình huống sản xuất có vấn đề về dấu vân tay.

CaptchaAI có cần biết đó là CAPTCHA trên thiết bị di động không?

Không. CaptchaAI giải quyết dựa trên khóa trang và URL trang. Sự khác biệt giữa thiết bị di động và máy tính để bàn không ảnh hưởng đến quá trình giải quyết.

Tôi có thể kết hợp mô phỏng di động với proxy không?

Vâng. Cả Playwright và Selenium đều hỗ trợ cấu hình proxy cùng với tính năng mô phỏng trên thiết bị di động. Chuyển proxy cho CaptchaAI để đảm bảo tính nhất quán.

bài viết liên quan

Các bước tiếp theo

Bắt đầu tự động hóa các luồng CAPTCHA trên thiết bị di động —lấy khóa API CaptchaAI của bạnvà tích hợp với ngăn xếp tự động hóa di động của bạn.

Hướng dẫn liên quan:

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