Tutoriels

Automatisation du navigateur mobile Résolution de CAPTCHA avec CaptchaAI

L'automatisation des navigateurs mobiles rencontre les mêmes CAPTCHA que les ordinateurs de bureau (cases à cocher reCAPTCHA, défis Cloudflare, grilles d'images) mais se heurte également à des bizarreries spécifiques aux mobiles telles que des mises en page réactives, des interactions tactiles uniquement et différentes empreintes digitales d'agent utilisateur.CaptchaAIgère la résolution quel que soit le contexte de l'appareil.

Ce didacticiel couvre deux approches : Selenium avec Chrome pour Android via ADB et l'émulation mobile de Playwright sur ordinateur.

Scénario du monde réel

Vous automatisez les soumissions de formulaires sur un site Web optimisé pour les mobiles qui dessert reCAPTCHA v2. Le site détecte les agents utilisateurs mobiles et affiche une mise en page CAPTCHA spécifique aux mobiles. Vous devez résoudre le CAPTCHA et soumettre le formulaire à partir d'un contexte de navigateur mobile.

Approche 1 : émulation mobile de dramaturge (Python)

L'émulation d'appareil de Playwright est le moyen le plus simple d'automatiser les navigateurs mobiles avec la résolution CAPTCHA – aucun appareil physique requis :

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

Approche 2 : Sélénium avec émulation mobile (JavaScript)

Utilisez Selenium avec l'émulation mobile du protocole Chrome DevTools pour les flux de travail 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);

Considérations spécifiques aux mobiles

Facteur Bureau Mobile Impact sur CAPTCHA
Agent utilisateur Bureau Chrome/Firefox Safari mobile/Chrome Certains sites proposent différentes configurations CAPTCHA par appareil
Fenêtre 1920 × 1080+ 390×844 Le widget CAPTCHA peut s'afficher différemment
Événements tactiles Événements de souris Événements tactiles Certains CAPTCHA valident le type d'interaction
Réseau Haut débit 4G/5G Des délais d'attente plus longs peuvent être nécessaires

Dépannage

Problème Parce que Corriger
CAPTCHA ne s'affiche pas dans l'émulation mobile Le site détecte l'émulation via navigator.platform Définir le remplacement de la plate-forme dans le protocole DevTools
Zone de texte g-recaptcha-response introuvable La mise en page mobile utilise un rendu CAPTCHA différent Rechercher une zone de texte par attribut de nom au lieu de ID
L'injection de jetons fonctionne mais le formulaire échoue toujours Le serveur valide la cohérence User-Agent Assurez-vous que le même agent utilisateur est utilisé pour la résolution et la soumission du formulaire.
Chargements de pages lents en émulation Pages gourmandes en ressources Utilisez l'indicateur Chrome --disable-images pour accélérer le chargement

FAQ

Dois-je utiliser de vrais appareils mobiles ou une émulation ?

L'émulation est plus rapide pour le développement et les appareils CI/CD. Real via Appium ou ADB sont meilleurs pour les scénarios de production où les empreintes digitales sont importantes.

CaptchaAI a-t-il besoin de savoir qu'il s'agit d'un CAPTCHA mobile ?

Non. CaptchaAI résout en fonction de la clé du site et de l'URL de la page. La distinction entre mobile et ordinateur de bureau n'affecte pas le processus de résolution.

Puis-je combiner l’émulation mobile avec un proxy ?

Oui. Playwright et Selenium prennent en charge la configuration du proxy ainsi que l'émulation mobile. Transmettez également le proxy à CaptchaAI pour des raisons de cohérence.

Articles connexes

Prochaines étapes

Commencez à automatiser les flux CAPTCHA mobiles -récupérez votre clé API CaptchaAIet intégrez-le à votre pile d'automatisation mobile.

Guides associés :

Les commentaires sont désactivés pour cet article.