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
- Cómo resolver la devolución de llamada de Recaptcha V2 usando Api
- Zapier Captchaai sin automatización de código
- Torniquete Recaptcha V2 Manejo en el mismo sitio
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:
- Manejo de CAPTCHA en la automatización de aplicaciones móviles con Appium
- Reaccionar resolución nativa de CAPTCHA de WebView
- Extracción de parámetros reCAPTCHA de la fuente de la página