Eğitimler

CaptchaAI ile Mobil Tarayıcı Otomasyonu CAPTCHA Çözümü

Mobil tarayıcı otomasyonu, masaüstüyle aynı CAPTCHA'larla (reCAPTCHA onay kutuları, Cloudflare zorlukları, görüntü ızgaraları) karşılaşır ancak aynı zamanda duyarlı düzenler, yalnızca dokunma etkileşimleri ve farklı Kullanıcı Aracısı parmak izleri gibi mobil cihazlara özgü tuhaflıklarla da karşı karşıya kalır.CaptchaAIcihaz bağlamından bağımsız olarak çözümü gerçekleştirir.

Bu eğitim iki yaklaşımı kapsamaktadır: ADB aracılığıyla Android için Chrome ile Selenium ve masaüstünde Playwright'ın mobil emülasyonu.

Gerçek Dünya Senaryosu

reCAPTCHA v2'ye hizmet veren, mobil cihazlar için optimize edilmiş bir web sitesinde form gönderimlerini otomatikleştiriyorsunuz. Site, mobil Kullanıcı Aracılarını algılar ve mobile özel bir CAPTCHA düzeni oluşturur. CAPTCHA'yı çözmeniz ve formu mobil tarayıcı bağlamında göndermeniz gerekir.

Yaklaşım 1: Oyun Yazarı Mobil Emülasyonu (Python)

Playwright'ın cihaz emülasyonu, mobil tarayıcıları CAPTCHA çözümüyle otomatikleştirmenin en basit yoludur; fiziksel cihaz gerektirmez:

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

Yaklaşım 2: Mobil Emülasyonlu Selenyum (JavaScript)

Node.js iş akışları için Selenium'u Chrome DevTools Protokolü mobil emülasyonuyla kullanın:

// 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);

Mobile Özel Hususlar

Faktör Masaüstü Mobil CAPTCHA'ya etkisi
Kullanıcı Aracısı Masaüstü Chrome/Firefox Mobil Safari/Chrome Bazı siteler cihaza göre farklı CAPTCHA yapılandırmaları sunar
Görünüm alanı 1920×1080+ 390×844 CAPTCHA widget'ı farklı şekilde oluşturulabilir
Dokunma etkinlikleri Fare olayları Dokunma etkinlikleri Bazı CAPTCHA'lar etkileşim türünü doğrular
Geniş bant 4G/5G Daha uzun zaman aşımları gerekebilir

Sorun giderme

Sorun Sebep Düzeltme
CAPTCHA mobil öykünmede oluşturulmuyor Site, navigator.platform aracılığıyla öykünmeyi algılıyor DevTools Protokolünde platform geçersiz kılmayı ayarlayın
g-recaptcha-response metin alanı bulunamadı Mobil düzende farklı CAPTCHA oluşturma kullanılıyor ID yerine name özelliğine göre textarea arayın
Jeton enjeksiyonu çalışıyor ancak form hâlâ başarısız oluyor Sunucu, Kullanıcı-Aracı tutarlılığını doğrular Çözüm ve form gönderimi için aynı Kullanıcı Aracısının kullanıldığından emin olun
Öykünmede sayfa yavaş yükleniyor Kaynak ağırlıklı sayfalar Yüklemeyi hızlandırmak için --disable-images Chrome bayrağını kullanın

SSS

Gerçek mobil cihazları mı yoksa emülasyonu mu kullanmalıyım?

Emülasyon, geliştirme için daha hızlıdır ve Appium veya ADB aracılığıyla CI/CD. Real cihazları, parmak izinin önemli olduğu üretim senaryoları için daha iyidir.

CaptchaAI'nin bunun mobil bir CAPTCHA olduğunu bilmesi gerekiyor mu?

Hayır. CaptchaAI, site anahtarına ve sayfa URL'sine göre çözer. Mobil ve masaüstü ayrımı çözüm sürecini etkilemez.

Mobil öykünmeyi proxy ile birleştirebilir miyim?

Evet. Hem Playwright hem de Selenium, mobil emülasyonun yanı sıra proxy yapılandırmasını da destekler. Tutarlılık için proxy'yi CaptchaAI'ye de iletin.

İlgili Makaleler

Sonraki Adımlar

Mobil CAPTCHA akışlarını otomatikleştirmeye başlayın -CaptchaAI API anahtarınızı alınve mobil otomasyon yığınınızla entegre edin.

İlgili kılavuzlar:

Bu makale için yorumlar devre dışı bırakılmıştır.