Use Cases

Penanganan Bot CAPTCHA Otomatisasi dengan CaptchaAI

Bot yang berhenti begitu muncul CAPTCHA bukan bot otomatisasi — itu skrip yang masih butuh manusia untuk mengklik kotak centang tengah malam. Baik bot Anda mengisi formulir kontak, mendaftarkan akun baru, menarik data dari portal internal, atau memesan slot booking, satu tantangan reCAPTCHA yang tidak tertangani cukup untuk menghentikan seluruh alur kerja. CaptchaAI menutup celah itu: satu API yang menyelesaikan CAPTCHA secara terprogram, sehingga bot Anda tetap berjalan tanpa campur tangan manusia.

Panduan ini memberikan kerangka bot yang bisa dipakai ulang di Python dan Node.js, plus tiga contoh siap pakai: pengisian formulir, alur booking multi-langkah, dan entri data dengan CAPTCHA gambar.

Kapan Bot Anda Akan Bertemu CAPTCHA

CAPTCHA muncul di titik-titik yang cukup bisa diprediksi dalam alur otomatisasi. Kenali dulu polanya sebelum menulis kode:

Skenario CAPTCHA yang khas Metode CaptchaAI
Pengiriman formulir reCAPTCHA v2 method=userrecaptcha
Pendaftaran akun reCAPTCHA v2/v3 method=userrecaptcha
Portal entri data Gambar CAPTCHA method=base64
Pemesanan/reservation Cloudflare Turnstile method=turnstile
Akses gerbang API Cloudflare Challenge method=cloudflare_challenge

Tim otomatisasi di Indonesia — agensi price-monitoring, freelancer scraping di Upwork atau Fastwork, sampai startup data internal — biasanya menjalankan bot semacam ini dari server di region AWS ap-southeast-1 (Singapura) atau GCP asia-southeast2 (Jakarta). Latensi ke endpoint CaptchaAI tetap rendah dari kedua region itu, jadi timeout polling di bawah tidak perlu diperpanjang hanya karena server berada di Asia Tenggara.

Bangun Kerangka Bot yang Bisa Dipakai Ulang

Alih-alih menulis ulang logika pengiriman dan polling di setiap skrip, satu kelas CaptchaBot bisa menangani seluruh siklus dalam empat langkah tetap:

  1. Kirim task ke in.php beserta method dan parameter CAPTCHA-nya
  2. Simpan task_id yang dikembalikan
  3. Polling res.php setiap beberapa detik sampai statusnya berubah
  4. Kembalikan token begitu status OK, siap dipasang ke field formulir

Kerangka berikut jadi fondasi untuk semua contoh di bawah.

import requests
import time
import logging

logger = logging.getLogger(__name__)

class CaptchaBot:
    def __init__(self, api_key):
        self.api_key = api_key
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        })

    def solve(self, method, **params):
        """Solve any CAPTCHA type."""
        params["key"] = self.api_key
        params["method"] = method

        resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
        if not resp.text.startswith("OK|"):
            raise Exception(f"Submit error: {resp.text}")

        task_id = resp.text.split("|")[1]
        logger.info(f"Task submitted: {task_id}")

        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.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(f"Error: {result.text}")

        raise TimeoutError("CAPTCHA solve timed out")

    def submit_form(self, url, form_data, captcha_field="g-recaptcha-response",
                    site_key=None, captcha_method="userrecaptcha"):
        """Submit a form with CAPTCHA solving."""
        if site_key:
            if captcha_method == "userrecaptcha":
                token = self.solve(captcha_method, googlekey=site_key, pageurl=url)
            elif captcha_method == "turnstile":
                token = self.solve(captcha_method, sitekey=site_key, pageurl=url)
            form_data[captcha_field] = token

        return self.session.post(url, data=form_data)

Catatan: simpan api_key di environment variable saat dipakai di produksi — contoh di atas menuliskannya langsung di kode hanya supaya alurnya mudah diikuti.

Method solve() menerima parameter apa pun sesuai tipe CAPTCHA-nya — googlekey dan pageurl untuk reCAPTCHA, sitekey untuk Turnstile. submit_form() membungkus semuanya jadi satu pemanggilan: selesaikan CAPTCHA dulu, baru kirim formulir dengan token terpasang di field yang benar.

Contoh: Bot Pengisian Formulir

Kasus paling umum: formulir kontak atau pendaftaran yang dijaga reCAPTCHA v2. Kelas di atas menanganinya dalam tiga baris:

bot = CaptchaBot("YOUR_API_KEY")

# Submit a contact form protected by reCAPTCHA
result = bot.submit_form(
    url="https://example.com/contact",
    form_data={
        "name": "John Doe",
        "email": "john@example.com",
        "message": "Inquiry about your service"
    },
    site_key="6Le-wvkS...",
    captcha_method="userrecaptcha"
)

print(f"Form submitted: {result.status_code}")

Ganti site_key dan url dengan milik formulir target Anda sendiri — nilai di atas hanya contoh.

Contoh: Bot untuk Alur Booking Multi-Langkah

Alur booking atau reservasi biasanya butuh beberapa permintaan berurutan sebelum CAPTCHA muncul di langkah konfirmasi. Pola berikut menjaga session tetap hidup dari awal sampai akhir:

def appointment_booking_bot(date, time_slot, user_info):
    bot = CaptchaBot("YOUR_API_KEY")

    # Step 1: Load booking page
    page = bot.session.get("https://example.com/book")

    # Step 2: Select date and time
    resp = bot.session.post("https://example.com/book/select", data={
        "date": date,
        "time": time_slot
    })

    # Step 3: Fill personal info with CAPTCHA
    result = bot.submit_form(
        url="https://example.com/book/confirm",
        form_data={
            "name": user_info["name"],
            "email": user_info["email"],
            "phone": user_info["phone"],
            "date": date,
            "time": time_slot
        },
        site_key="6Le-wvkS...",
        captcha_method="userrecaptcha"
    )

    return result.status_code == 200

# Run
success = appointment_booking_bot(
    date="2025-02-15",
    time_slot="10:00",
    user_info={"name": "John Doe", "email": "john@example.com", "phone": "555-0100"}
)

Karena session dipakai ulang di setiap langkah, cookie dan state dari langkah sebelumnya tetap terbawa sampai konfirmasi akhir — penting untuk situs yang memvalidasi urutan request.

Contoh: Bot Entri Data dengan CAPTCHA Gambar

Portal entri data lama sering masih memakai CAPTCHA gambar klasik, bukan reCAPTCHA. Method base64 menyelesaikannya langsung dari gambar yang diunduh, tanpa perlu site key:

import base64

def data_entry_bot(entries, captcha_image_url):
    bot = CaptchaBot("YOUR_API_KEY")

    for entry in entries:
        # Load the form page
        page = bot.session.get("https://portal.example.com/entry")

        # Download and solve image CAPTCHA
        img = bot.session.get(captcha_image_url)
        img_b64 = base64.b64encode(img.content).decode()
        captcha_text = bot.solve("base64", body=img_b64)

        # Submit entry
        resp = bot.session.post("https://portal.example.com/entry", data={
            **entry,
            "captcha": captcha_text
        })

        logger.info(f"Entry submitted: {resp.status_code}")
        time.sleep(random.uniform(2, 5))

Jeda acak (random.uniform(2, 5)) antar entri meniru ritme pengisian manusia dan mengurangi risiko rate limit di portal yang memantau frekuensi submission.

Versi Node.js: Kerangka Bot yang Sama di JavaScript

Tim yang lebih nyaman di ekosistem JavaScript bisa memakai kerangka yang sama persis, hanya di-port ke axios:

const axios = require("axios");

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

  async solve(method, params) {
    params.key = this.apiKey;
    params.method = method;

    const submit = await axios.get("https://ocr.captchaai.com/in.php", {
      params,
    });
    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: this.apiKey, 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);
    }
  }

  async submitForm(url, formData, siteKey, method = "userrecaptcha") {
    const token = await this.solve(method, {
      googlekey: siteKey,
      pageurl: url,
    });
    formData["g-recaptcha-response"] = token;

    return axios.post(url, new URLSearchParams(formData));
  }
}

// Usage
const bot = new CaptchaBot("YOUR_API_KEY");
const result = await bot.submitForm(
  "https://example.com/submit",
  { name: "John", email: "john@example.com" },
  "6Le-wvkS..."
);

Alur intinya tetap sama di kedua bahasa: kirim → simpan task ID → polling → pakai token. Hanya sintaksisnya yang beda.

Mengatasi Masalah Umum

Masalah yang paling sering muncul saat bot CAPTCHA berjalan di produksi, dan cara mengatasinya cepat:

Masalah Solusi
Token CAPTCHA ditolak situs Pastikan token dipakai dalam 120 detik setelah res.php mengembalikannya — token yang didiamkan lebih lama biasanya sudah kedaluwarsa
Bot tetap diblokir walau token valid Lengkapi header request dan tambahkan jeda antar aksi; token CAPTCHA saja tidak menutupi sinyal browser lain
Formulir menolak submission meski token benar Periksa HTML formulir untuk kolom tersembunyi seperti token CSRF yang belum diikutsertakan
Task macet di CAPCHA_NOT_READY lebih dari 60 detik Cek dashboard CaptchaAI untuk status task, dan pertimbangkan menambah thread bila banyak task antre bersamaan
Banyak permintaan berturut-turut kena rate limit Tambahkan jeda antar batch dan gunakan egress jaringan yang diotorisasi untuk trafik bervolume tinggi

Pertanyaan Umum

CAPTCHA apa saja yang bisa ditangani bot dengan CaptchaAI?

Untuk tipe yang didukung penuh: reCAPTCHA v2/v3 (termasuk Enterprise), Cloudflare Turnstile, Cloudflare Challenge, GeeTest v3, CAPTCHA gambar, dan grid image — kerangka bot di atas tinggal memanggil method yang sesuai. hCaptcha dan FunCaptcha (Arkose Labs) belum didukung, dan GeeTest v4 masih berstatus segera hadir. CaptchaFox, Friendly Captcha, dan Lemin sudah tersedia dalam versi beta.

Bagaimana bot tahu jenis CAPTCHA yang harus diselesaikan dan method apa yang dipanggil?

Kelas CaptchaBot di atas menerima parameter method secara eksplisit (userrecaptcha, turnstile, base64) — bot Andalah yang mendeteksi jenis tantangan dari elemen halaman (atribut sitekey, class Turnstile, atau elemen gambar) lalu meneruskan method yang cocok ke solve(). Untuk situs dengan beberapa jenis CAPTCHA berbeda, cara paling praktis adalah membuat mapping sederhana antara selector halaman dan nama method.

Berapa biaya menjalankan banyak bot otomatisasi sekaligus?

CaptchaAI menagih per thread yang berjalan bersamaan, bukan per solve — makin banyak bot yang jalan paralel, makin banyak thread yang Anda butuhkan, tapi setiap thread punya solve tanpa batas. Untuk beberapa bot kecil yang jalan bergantian, paket BASIC ($15/bulan, 5 thread) atau STANDARD ($30/bulan, 15 thread) biasanya cukup. Untuk bot bervolume tinggi yang jalan paralel penuh, paket ADVANCE ($90/bulan, 50 thread) ke atas lebih masuk akal secara biaya per solve.

Token CAPTCHA sudah valid tapi bot tetap diblokir situs, kenapa?

CaptchaAI hanya menangani lapisan CAPTCHA — begitu token diterima, tugasnya selesai. Kalau situs masih memblokir setelah itu, penyebabnya biasanya sinyal browser lain: header yang tidak lengkap, tidak ada jeda antar request, atau konfigurasi browser otomatis yang mudah dikenali sistem deteksi situs. Gabungkan CaptchaAI dengan konfigurasi browser standar seperti undetected-chromedriver atau puppeteer-extra untuk menutup celah itu.

Apakah bot otomatisasi yang mengambil data pengguna aman secara hukum di Indonesia?

Ini bukan nasihat hukum, tapi prinsip umumnya jelas: kumpulkan hanya data yang Anda punya kewenangan untuk diproses, dan perhatikan UU Pelindungan Data Pribadi (UU 27/2022) serta UU ITE saat bot menyentuh data pengguna. CaptchaAI menyelesaikan lapisan CAPTCHA di alur kerja Anda; kepatuhan pengumpulan datanya tetap tanggung jawab tim Anda sendiri.

Panduan Terkait

Komentar dinonaktifkan untuk artikel ini.