Use Cases

Skrip Otomatisasi CAPTCHA dengan CaptchaAI

Enam skrip di bawah ini menjawab satu masalah spesifik: Anda butuh otomatisasi CAPTCHA yang jalan hari ini, bukan minggu depan setelah membaca seluruh dokumentasi API dari awal. Setiap skrip memakai API CaptchaAI apa adanya — kirim task ke in.php, polling res.php, pakai token hasilnya — dan bisa langsung disalin ke proyek Anda tanpa perlu dirombak dulu. Cocok untuk automation engineer freelance yang mengerjakan scraping harga, tim data startup yang membangun pipeline otomatisasi, maupun QA engineer yang menguji form ber-CAPTCHA.

Ringkasan cepat sebelum masuk ke kode:

  • Skrip 1–2 — reCAPTCHA v2 dan Cloudflare Turnstile, pola submit-polling standar.
  • Skrip 3 — CAPTCHA gambar dari file lokal atau URL.
  • Skrip 4 — batch solving paralel pakai ThreadPoolExecutor.
  • Skrip 5 — solver universal Node.js untuk semua method di atas.
  • Skrip tambahan — cek saldo akun CaptchaAI Anda.

Pilih Skrip Sesuai Kebutuhan

Skrip Tipe CAPTCHA Kapan dipakai
Skrip 1 reCAPTCHA v2 Form login atau registrasi standar
Skrip 2 Cloudflare Turnstile Situs yang memakai proteksi Cloudflare
Skrip 3 CAPTCHA gambar Ekstraksi teks dari file lokal atau URL gambar
Skrip 4 Semua tipe (paralel) Scraping banyak halaman produk sekaligus
Skrip 5 (Node.js) Semua tipe di atas Stack JavaScript/Express

Kelima skrip ini independen satu sama lain — kalau kebutuhan Anda spesifik pada satu tipe CAPTCHA, langsung lompat ke skrip yang sesuai, tidak perlu diikuti berurutan.

Skrip 1: Selesaikan reCAPTCHA v2 dengan Python

Skrip ini mengirim site key dan URL halaman ke in.php, lalu polling res.php setiap 5 detik sampai token siap. Task ID dicetak begitu submit berhasil, jadi Anda bisa melacak status secara manual kalau polling berjalan lebih lama dari biasanya.

#!/usr/bin/env python3
"""Solve reCAPTCHA v2 and print the token."""
import requests
import time
import sys

API_KEY = "YOUR_API_KEY"

def solve_recaptcha_v2(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": site_key,
        "pageurl": page_url
    })
    if not resp.text.startswith("OK|"):
        print(f"Error: {resp.text}", file=sys.stderr)
        sys.exit(1)

    task_id = resp.text.split("|")[1]
    print(f"Task ID: {task_id}")

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY":
            print(".", end="", flush=True)
            continue
        if result.text.startswith("OK|"):
            print()
            return result.text.split("|")[1]
        print(f"\nError: {result.text}", file=sys.stderr)
        sys.exit(1)

    print("\nTimeout", file=sys.stderr)
    sys.exit(1)

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print(f"Usage: {sys.argv[0]} <site_key> <page_url>")
        sys.exit(1)
    token = solve_recaptcha_v2(sys.argv[1], sys.argv[2])
    print(token)

Penggunaan:

python solve_recaptcha.py "6Le-wvkS..." "https://example.com/form"

Skrip 2: Selesaikan Cloudflare Turnstile dengan Python

Pola yang sama berlaku untuk Turnstile — bedanya cuma di parameter method (turnstile) dan sitekey. Skrip ini sengaja dibuat ringkas, tanpa retry eksplisit, jadi paling cocok dipakai sebagai starting point yang Anda kembangkan sendiri sesuai kebutuhan produksi.

#!/usr/bin/env python3
"""Solve Cloudflare Turnstile and print the token."""
import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_turnstile(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": site_key,
        "pageurl": page_url
    })
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)
    raise TimeoutError()

token = solve_turnstile("0x4AAAAA...", "https://example.com")
print(token)

Skrip 3: Selesaikan CAPTCHA Gambar dari File atau URL

Untuk CAPTCHA berbasis gambar, skrip ini menerima path file lokal maupun URL gambar, meng-encode-nya ke base64, lalu mengirimkannya lewat method base64. Batas polling dipangkas ke 30 percobaan (150 detik) karena CAPTCHA gambar biasanya selesai lebih cepat dibanding reCAPTCHA atau Turnstile.

#!/usr/bin/env python3
"""Solve an image CAPTCHA from a file or URL."""
import requests
import base64
import time
import sys

API_KEY = "YOUR_API_KEY"

def solve_image(image_source):
    # Load image
    if image_source.startswith("http"):
        img_data = requests.get(image_source).content
    else:
        with open(image_source, "rb") as f:
            img_data = f.read()

    img_b64 = base64.b64encode(img_data).decode()

    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "base64",
        "body": img_b64
    })
    task_id = resp.text.split("|")[1]

    for _ in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)
    raise TimeoutError()

if __name__ == "__main__":
    text = solve_image(sys.argv[1])
    print(text)

Penggunaan:

python solve_image.py captcha.png
python solve_image.py "https://example.com/captcha.jpg"

Skrip 4: Solver CAPTCHA Batch secara Paralel

Kalau Anda perlu menyelesaikan puluhan CAPTCHA sekaligus — misalnya saat scraping banyak halaman produk secara bersamaan — jalankan skrip ini. ThreadPoolExecutor menjaga sejumlah max_workers CAPTCHA berjalan paralel, error di satu task tidak menghentikan task lain, dan hasilnya dikembalikan per URL dengan status ok atau failed.

Contoh nyata di lapangan: agensi pemantauan harga e-commerce yang menjalankan scraper dari region AWS ap-southeast-1 (Singapura) atau GCP asia-southeast2 (Jakarta) biasanya menyamakan max_workers dengan jumlah thread pada paket CaptchaAI mereka. Paket STANDARD ($30/bulan, 15 thread) sudah cukup untuk lima worker paralel dengan slack, karena thread yang baru saja selesai langsung bisa dipakai ulang untuk task berikutnya — beda dari skema pay-per-solve, dengan thread-based pricing biaya bulanan tetap sama walau volume solve naik, selama tidak melebihi jumlah thread yang dibeli.

Catatan kepatuhan: kalau skrip ini dipakai untuk scraping, pastikan Anda hanya mengambil data yang memang berwenang Anda proses — sejalan dengan UU Pelindungan Data Pribadi (UU 27/2022).

#!/usr/bin/env python3
"""Solve multiple CAPTCHAs concurrently."""
import requests
import time
from concurrent.futures import ThreadPoolExecutor, as_completed

API_KEY = "YOUR_API_KEY"

def solve_one(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": site_key, "pageurl": page_url
    })
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)
    raise TimeoutError()

def solve_batch(tasks, max_workers=5):
    """
    tasks: list of (site_key, page_url) tuples
    Returns: list of tokens
    """
    results = []
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = {
            executor.submit(solve_one, sk, url): (sk, url)
            for sk, url in tasks
        }
        for future in as_completed(futures):
            sk, url = futures[future]
            try:
                token = future.result()
                results.append({"url": url, "token": token, "status": "ok"})
            except Exception as e:
                results.append({"url": url, "error": str(e), "status": "failed"})
    return results

# Example
tasks = [
    ("6Le-wvkS...", "https://example.com/page1"),
    ("6Le-wvkS...", "https://example.com/page2"),
    ("6Le-wvkS...", "https://example.com/page3"),
]
results = solve_batch(tasks)
for r in results:
    print(f"{r['url']}: {r['status']}")

Skrip 5: Solver CAPTCHA Universal untuk Node.js

Kalau stack Anda JavaScript, skrip Node.js ini membungkus submit dan polling dalam satu fungsi solve() yang menerima params apa pun — cukup ganti method untuk berpindah antara reCAPTCHA v2 dan Turnstile tanpa menulis ulang logika polling. Import sebagai module lewat require() di proyek Express Anda, atau jalankan langsung dari command line untuk pengujian cepat.

#!/usr/bin/env node
// Solve any CAPTCHA type from the command line
const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

async function solve(params) {
  params.key = API_KEY;
  const submit = await axios.get("https://ocr.captchaai.com/in.php", {
    params,
  });
  if (!submit.data.startsWith("OK|")) throw new Error(submit.data);
  const taskId = submit.data.split("|")[1];

  while (true) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId },
    });
    if (result.data === "CAPCHA_NOT_READY") continue;
    if (result.data.startsWith("OK|")) return result.data.split("|")[1];
    throw new Error(result.data);
  }
}

// Usage examples:
// Solve reCAPTCHA v2
// solve({ method: "userrecaptcha", googlekey: "SITE_KEY", pageurl: "URL" })

// Solve Turnstile
// solve({ method: "turnstile", sitekey: "SITE_KEY", pageurl: "URL" })

module.exports = { solve };

Cek Saldo Akun CaptchaAI

Sebelum menjalankan skrip batch dalam volume besar, cek dulu saldo Anda dengan skrip singkat ini. Berguna juga kalau dipasang sebagai cron job harian yang mengirim notifikasi otomatis saat saldo mulai menipis.

#!/usr/bin/env python3
"""Check CaptchaAI account balance."""
import requests

API_KEY = "YOUR_API_KEY"

resp = requests.get("https://ocr.captchaai.com/res.php", params={
    "key": API_KEY,
    "action": "getbalance"
})
print(f"Balance: ${resp.text}")

Pertanyaan Umum

Berapa thread yang saya butuhkan untuk menjalankan Skrip 4 secara paralel?

Sesuaikan max_workers dengan jumlah thread pada paket CaptchaAI Anda:

Paket Harga/bulan Thread
BASIC $15 5
ADVANCE $90 50
ENTERPRISE $300 200

Paket BASIC cukup untuk uji coba; untuk scraping volume tinggi, ADVANCE atau ENTERPRISE memberi ruang paralel jauh lebih besar tanpa biaya tambahan per solve.

Apakah skrip-skrip ini bisa dipakai untuk hCaptcha atau FunCaptcha?

Belum. CaptchaAI saat ini tidak mendukung hCaptcha maupun FunCaptcha (Arkose Labs), jadi kelima skrip di atas hanya berlaku untuk reCAPTCHA v2, Cloudflare Turnstile, dan CAPTCHA gambar yang memang didukung penuh.

Bagaimana kalau res.php terus mengembalikan CAPCHA_NOT_READY?

Itu wajar untuk beberapa siklus polling pertama — CAPTCHA sedang diproses di sisi worker. Kalau status ini bertahan sampai batas percobaan habis dan skrip melempar TimeoutError, periksa dulu apakah site_key/page_url yang dikirim sudah benar, baru naikkan jumlah percobaan atau jeda antar-polling.

Bisakah skrip ini langsung dipakai di lingkungan production?

Ya, tapi tambahkan pencatatan (logging) dan penanganan kesalahan yang lebih ketat dari versi dasar di atas — Skrip 4 sudah menyertakan penanganan kesalahan per task sebagai contoh polanya. Untuk trafik tinggi, pertimbangkan menyimpan task_id di database supaya polling bisa dilanjutkan walau prosesnya sempat restart.

Berapa biaya menjalankan skrip-skrip ini setiap bulan?

CaptchaAI memakai skema thread-based dengan penyelesaian tanpa batas per thread — mulai BASIC $15/bulan (5 thread) sampai ENTERPRISE $300/bulan (200 thread), atau VIP-1 $1,500/bulan (1,000 thread) untuk volume enterprise. Biaya tidak bertambah per CAPTCHA yang diselesaikan; cek saldo Anda kapan saja dengan skrip di atas.

Panduan Terkait

Komentar dinonaktifkan untuk artikel ini.