Integrations

Apify + CaptchaAI: Integrasi Platform Cloud Scraping

Apify adalah platform cloud scraping yang menjalankan aktor Crawlee. Berikut cara menambahkan penyelesaian CaptchaAI CAPTCHA ke aktor Apify Anda.


Pengaturan Aktor

Skema Masukan

{
    "title": "CAPTCHA Scraper Input",
    "type": "object",
    "properties": {
        "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "editor": "requestListSources"
        },
        "captchaaiApiKey": {
            "title": "CaptchaAI API Key",
            "type": "string",
            "isSecret": true
        },
        "maxConcurrency": {
            "title": "Max Concurrency",
            "type": "integer",
            "default": 3
        }
    },
    "required": ["startUrls", "captchaaiApiKey"]
}

Kode Aktor

const { Actor } = require('apify');
const { PlaywrightCrawler } = require('crawlee');

Actor.main(async () => {
    const input = await Actor.getInput();
    const { startUrls, captchaaiApiKey, maxConcurrency = 3 } = input;

    const solver = new CaptchaAISolver(captchaaiApiKey);

    const crawler = new PlaywrightCrawler({
        maxConcurrency,
        requestHandlerTimeoutSecs: 180,

        async requestHandler({ request, page, log }) {
            await page.goto(request.url, { waitUntil: 'networkidle' });

            // Check for CAPTCHA
            const sitekey = await page.evaluate(() => {
                const el = document.querySelector('[data-sitekey]');
                return el ? el.getAttribute('data-sitekey') : null;
            });

            if (sitekey) {
                log.info(`Solving CAPTCHA on ${request.url}`);
                const token = await solver.solve(sitekey, request.url);

                // Inject and submit
                await page.evaluate((t) => {
                    document.querySelector('[name="g-recaptcha-response"]').value = t;
                    const cb = document.querySelector('.g-recaptcha')?.getAttribute('data-callback');
                    if (cb && window[cb]) window[cb](t);
                }, token);

                await page.click('button[type="submit"]');
                await page.waitForNavigation({ timeout: 15000 });
            }

            // Extract data
            const title = await page.title();
            const items = await page.$$eval('.item', els =>
                els.map(el => ({
                    name: el.querySelector('.name')?.textContent?.trim(),
                    price: el.querySelector('.price')?.textContent?.trim(),
                    url: el.querySelector('a')?.href,
                }))
            );

            // Push to Apify dataset
            await Actor.pushData({
                url: request.url,
                title,
                items,
                scrapedAt: new Date().toISOString(),
            });

            log.info(`Scraped ${items.length} items from ${request.url}`);
        },
    });

    await crawler.run(startUrls);
});


class CaptchaAISolver {
    constructor(apiKey) {
        this.apiKey = apiKey;
    }

    async solve(sitekey, pageurl) {
        const params = new URLSearchParams({
            key: this.apiKey,
            method: 'userrecaptcha',
            googlekey: sitekey,
            pageurl: pageurl,
            json: '1',
        });

        const submitResp = await fetch('https://ocr.captchaai.com/in.php', {
            method: 'POST',
            body: params,
        });
        const submitResult = await submitResp.json();

        if (submitResult.status !== 1) {
            throw new Error(`Submit: ${submitResult.request}`);
        }

        const taskId = submitResult.request;
        await new Promise(r => setTimeout(r, 15000));

        for (let i = 0; i < 24; i++) {
            const pollResp = await fetch(
                `https://ocr.captchaai.com/res.php?key=${this.apiKey}&action=get&id=${taskId}&json=1`
            );
            const result = await pollResp.json();

            if (result.status === 1) return result.request;
            if (result.request !== 'CAPCHA_NOT_READY') {
                throw new Error(`Solve: ${result.request}`);
            }
            await new Promise(r => setTimeout(r, 5000));
        }

        throw new Error('Timeout');
    }
}

Variabel Lingkungan di Apify

Simpan kunci CaptchaAI Anda dengan aman:

  1. Buka Pengaturan aktor -> Variabel lingkungan
  2. Tambahkan: CAPTCHAAI_API_KEY = kunci Anda (tandai sebagai rahasia)
  3. Akses dalam kode: process.env.CAPTCHAAI_API_KEY
// Alternative: use env var instead of input
const apiKey = input.captchaaiApiKey || process.env.CAPTCHAAI_API_KEY;

Proxy Apify + CaptchaAI

const crawler = new PlaywrightCrawler({
    proxyConfiguration: await Actor.createProxyConfiguration({
        groups: ['RESIDENTIAL'],
    }),
    // ... rest of config
});

Pertanyaan Umum

Bisakah saya menggunakan CaptchaAI di tingkat gratis Apify?

Ya. CaptchaAI adalah panggilan API eksternal yang berfungsi pada paket Apify apa pun. Biaya Anda adalah harga paket berbasis thread CaptchaAI (penyelesaian tanpa batas per thread) ditambah biaya komputasi Apify.

Haruskah saya menggunakan proxy Apify atau parameter proxy CaptchaAI?

Gunakan proxy Apify untuk permintaan scraping dan CaptchaAI tanpa proxy untuk penyelesaian. Ini adalah pendekatan paling hemat biaya untuk sebagian besar kasus penggunaan.

Bagaimana cara menangani batas waktu aktor Apify dengan penyelesaian CAPTCHA?

Setel requestHandlerTimeoutSecs ke setidaknya 180 detik untuk memberikan waktu penyelesaian CAPTCHA.


Panduan Terkait

  • Integrasi Perayapan + CaptchaAI
  • Membangun Framework Scraping Kustom

Terapkan aktor pemecah CAPTCHA — dapatkan CaptchaAI.

Komentar dinonaktifkan untuk artikel ini.