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:
- Kirim task ke
in.phpbesertamethoddan parameter CAPTCHA-nya - Simpan
task_idyang dikembalikan - Polling
res.phpsetiap beberapa detik sampai statusnya berubah - 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_keydi 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.