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
- Comment résoudre le rappel Recaptcha V2 à l'aide de l'API
- Zapier Captchaai No Code Automatisation
- Gestion du tourniquet Recaptcha V2 sur le même site
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 :
- Gestion des CAPTCHA dans l'automatisation des applications mobiles avec Appium
- Résolution de CAPTCHA React Native WebView
- Extraction des paramètres reCAPTCHA de la source de la page