Tutoriales

Automatización del navegador móvil CAPTCHA Resolución con CaptchaAI

La automatización del navegador móvil encuentra los mismos CAPTCHA que el escritorio (casillas de verificación reCAPTCHA, desafíos de Cloudflare, cuadrículas de imágenes), pero también enfrenta peculiaridades específicas de los dispositivos móviles, como diseños receptivos, interacciones solo táctiles y diferentes señales del navegador del agente de usuario.CaptchaAImaneja la resolución independientemente del contexto del dispositivo.

Este tutorial cubre dos enfoques: Selenium con Chrome para Android a través de ADB y la emulación móvil de Playwright en el escritorio.

Escenario del mundo real

Está automatizando el envío de formularios en un sitio web optimizado para dispositivos móviles que sirve reCAPTCHA v2. El sitio detecta agentes de usuario móviles y presenta un diseño CAPTCHA específico para dispositivos móviles. Debe resolver el CAPTCHA y enviar el formulario desde el contexto de un navegador móvil.

Método 1: emulación móvil de dramaturgo (Python)

La emulación de dispositivos de Playwright es la forma más sencilla de automatizar los navegadores móviles con resolución CAPTCHA; no se requiere ningún dispositivo físico:

# 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())

Enfoque 2: Selenium con emulación móvil (JavaScript)

Utilice Selenium con la emulación móvil del protocolo Chrome DevTools para flujos de trabajo de 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);

Consideraciones específicas para dispositivos móviles

factores Escritorio Móvil Impacto en CAPTCHA
Agente de usuario Escritorio Chrome/Firefox Safari móvil/Chrome Algunos sitios ofrecen diferentes configuraciones de CAPTCHA por dispositivo
Ventana gráfica 1920×1080+ 390×844 El widget CAPTCHA puede mostrarse de forma diferente
Eventos táctiles Eventos del mouse Eventos táctiles Algunos CAPTCHA validan el tipo de interacción
Red Banda ancha 4G/5G Es posible que se necesiten tiempos de espera más largos

Solución de problemas

problema causa Solución
CAPTCHA no se procesa en la emulación móvil El sitio detecta emulación a través de navigator.platform Establecer anulación de plataforma en el protocolo DevTools
Área de texto g-recaptcha-response no encontrada El diseño móvil utiliza una representación CAPTCHA diferente Busque área de texto por atributo de nombre en lugar de ID
La inyección de token funciona pero el formulario aún falla El servidor valida la coherencia entre el usuario y el agente Asegúrese de que se utilice el mismo agente de usuario para resolver y enviar formularios.
Cargas de página lentas en emulación Páginas con muchos recursos Utilice la bandera de Chrome --disable-images para acelerar la carga

Preguntas frecuentes

¿Debo utilizar dispositivos móviles reales o una emulación?

La emulación es más rápida para el desarrollo y los dispositivos CI/CD. Real a través de Appium o ADB son mejores para escenarios de producción donde las señales del navegador son importantes.

¿CaptchaAI necesita saber que es un CAPTCHA móvil?

No. CaptchaAI resuelve según la clave del sitio y la URL de la página. La distinción entre dispositivos móviles y computadoras de escritorio no afecta el proceso de resolución.

¿Puedo combinar la emulación móvil con un proxy?

Sí. Tanto Playwright como Selenium admiten la configuración de proxy junto con la emulación móvil. Pase el proxy a CaptchaAI también para mantener la coherencia.

Artículos relacionados

Próximos pasos

Comience a automatizar los flujos CAPTCHA móviles:obtenga su clave API CaptchaAIe intégrelo con su pila de automatización móvil.

Guías relacionadas:

Los comentarios están deshabilitados para este artículo.