Skrip login Anda jalan mulus di lingkungan uji, lalu berhenti total begitu masuk produksi: sebuah widget CAPTCHA muncul di atas tombol kirim, dan otomatisasi Anda kehabisan cara. Solusinya bukan meniru perilaku manusia di dalam widget, melainkan memisahkan tanggung jawab. CaptchaAI menyelesaikan tantangan CAPTCHA dan mengembalikan token, sementara kode Anda tetap mengurus hal yang memang jadi tugasnya: mengisi kolom, mengirim form, menyimpan cookie, dan melanjutkan ke langkah berikutnya seperti MFA.
Halaman login adalah tempat CAPTCHA paling sering dipasang, karena di situlah bot paling ingin masuk. Panduan ini menunjukkan tiga cara mengotomatiskan login berpelindung CAPTCHA — dari HTTP request murni sampai browser penuh — dan cara menyambungkan token yang dikembalikan CaptchaAI ke dalam alur login Anda.
Kapan cukup HTTP request, kapan butuh browser
Sebelum menulis kode, tentukan dulu lapisan yang Anda butuhkan. Keputusan ini menentukan seberapa cepat dan seberapa ringan otomatisasi Anda.
- HTTP request murni cocok bila halaman login menerima POST standar dan token CAPTCHA bisa disisipkan langsung ke body form. Ini pendekatan paling ringan dan hemat sumber daya — tanpa browser, tanpa memori besar, mudah dijalankan paralel.
- Browser (Selenium atau Puppeteer) diperlukan bila login bergantung pada eksekusi JavaScript, event handler, atau widget yang merender dirinya sendiri di sisi klien. Di sini Anda menyuntikkan token hasil solve ke dalam DOM, lalu memicu submit lewat browser.
Aturan praktisnya: mulai dari HTTP request, dan naik ke browser hanya ketika form login benar-benar menolak bekerja tanpa JavaScript.
Empat jenis CAPTCHA login dan method-nya
Sebagian besar halaman login memakai salah satu dari empat tipe berikut. Kolom method menunjukkan parameter yang Anda kirim ke API CaptchaAI.
| CAPTCHA | Tampilannya di halaman login | Method CaptchaAI |
|---|---|---|
| reCAPTCHA v2 | Kotak centang atau tantangan gambar sebelum tombol kirim | method=userrecaptcha |
| reCAPTCHA v3 | Penilaian skor tak terlihat; skor rendah langsung ditolak | method=userrecaptcha&version=v3 |
| Cloudflare Turnstile | Widget verifikasi di atas form login | method=turnstile |
| CAPTCHA gambar | Gambar teks yang harus diketik ulang | method=base64 |
reCAPTCHA v2/v3, Turnstile, dan CAPTCHA gambar semuanya didukung penuh. Perlu diingat hCaptcha dan FunCaptcha belum didukung, jadi bila login target Anda memakai salah satunya, pola di bawah ini tidak berlaku.
Alur intinya: kirim, simpan task ID, polling, pakai token
Apa pun bahasa dan tools-nya, integrasi CaptchaAI mengikuti empat langkah yang sama: kirim tantangan ke in.php, simpan task ID yang dikembalikan, polling hasilnya di res.php sampai siap, lalu pakai token pada form login. Fungsi solve_recaptcha di setiap contoh berikut membungkus keempat langkah itu, sehingga alur login utama Anda tetap ringkas.
Metode 1: HTTP request murni (tanpa browser)
Untuk form login yang menerima POST standar, sisipkan token ke field g-recaptcha-response bersama username dan password:
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha(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()
# Login flow
session = requests.Session()
login_url = "https://staging.example.com/qa-login"
# Load login page to get cookies and site key
page = session.get(login_url)
# Extract site_key from the page HTML...
site_key = "6Le-wvkS..."
# Solve CAPTCHA
token = solve_recaptcha(site_key, login_url)
# Submit login form
resp = session.post(login_url, data={
"username": "user@example.com",
"password": "your_password",
"g-recaptcha-response": token
})
if resp.url != login_url:
print("Login successful!")
# session now has auth cookies for subsequent requests
Kuncinya ada di requests.Session(): satu objek session yang sama memuat halaman login, menyimpan cookie, lalu mengirim POST. Dengan begitu cookie sesi dari login tetap terpakai untuk request terotentikasi berikutnya.
Metode 2: Selenium dengan Python
Bila halaman login butuh eksekusi JavaScript, jalankan browser sungguhan. Isi kredensial, ambil data-sitekey dari elemen widget, lalu suntikkan token ke DOM sebelum menekan submit:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time
API_KEY = "YOUR_API_KEY"
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=options)
# Navigate to login page
driver.get("https://staging.example.com/qa-login")
wait = WebDriverWait(driver, 10)
# Fill in credentials
username_field = wait.until(EC.presence_of_element_located((By.NAME, "username")))
username_field.send_keys("user@example.com")
driver.find_element(By.NAME, "password").send_keys("your_password")
# Extract site key and solve
recaptcha = driver.find_element(By.CLASS_NAME, "g-recaptcha")
site_key = recaptcha.get_attribute("data-sitekey")
token = solve_recaptcha(site_key, driver.current_url)
# Inject token
driver.execute_script(
f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
)
# Submit
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
wait.until(EC.url_changes(driver.current_url))
print(f"Logged in! Now at: {driver.current_url}")
Pakai kembali fungsi solve_recaptcha dari Metode 1. Selenium hanya bertugas mengisi form dan menyisipkan token; pekerjaan penyelesaian CAPTCHA tetap ditangani API.
Metode 3: Puppeteer dengan Node.js
Pola yang sama berlaku untuk stack JavaScript. Puppeteer membuka halaman, mengetik kredensial, membaca sitekey, lalu menyuntikkan token sebelum navigasi:
const puppeteer = require("puppeteer");
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solveRecaptcha(siteKey, pageUrl) {
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params: {
key: API_KEY,
method: "userrecaptcha",
googlekey: siteKey,
pageurl: pageUrl,
},
});
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);
}
}
(async () => {
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto("https://staging.example.com/qa-login");
// Fill credentials
await page.type("#username", "user@example.com");
await page.type("#password", "your_password");
// Get site key and solve
const siteKey = await page.$eval(".g-recaptcha", (el) =>
el.getAttribute("data-sitekey")
);
const token = await solveRecaptcha(siteKey, page.url());
// Inject and submit
await page.evaluate(
(t) => (document.getElementById("g-recaptcha-response").innerHTML = t),
token
);
await page.click('button[type="submit"]');
await page.waitForNavigation();
console.log("Logged in:", page.url());
await browser.close();
})();
Untuk reCAPTCHA v2 dan v3, field target injeksinya sama-sama g-recaptcha-response. Untuk Cloudflare Turnstile, ganti method solve menjadi turnstile dan sisipkan hasilnya ke field cf-turnstile-response.
Menggabungkan CAPTCHA dengan MFA
Banyak login sensitif menumpuk dua lapisan: CAPTCHA lebih dulu, lalu autentikasi multifaktor. Selesaikan CAPTCHA dan kirim login seperti biasa, lalu deteksi apakah respons mengarah ke halaman verifikasi:
# Step 1: Solve CAPTCHA and submit login
token = solve_recaptcha(site_key, login_url)
resp = session.post(login_url, data={
"username": "user@example.com",
"password": "your_password",
"g-recaptcha-response": token
})
# Step 2: Handle MFA page (if redirected)
if "verify" in resp.url or "mfa" in resp.url:
# Your MFA code logic here
mfa_code = get_mfa_code()
resp = session.post(resp.url, data={"code": mfa_code})
# Step 3: Verify logged in
assert "dashboard" in resp.url
CaptchaAI hanya menangani lapisan CAPTCHA. Kode MFA harus datang dari sumber yang sah dan Anda kendalikan sendiri — misalnya generator TOTP milik akun uji Anda — bukan dari akun orang lain.
Konteks untuk tim automation di Indonesia
Banyak pekerjaan otomatisasi di Indonesia berjalan di tim kecil dan kontraktor freelance yang sangat sadar biaya. Di sini model penagihan CaptchaAI terasa relevan: tagihan dihitung per thread konkuren, bukan per solve. Paket BASIC ($15/bulan, 5 thread) menjalankan hingga lima penyelesaian CAPTCHA sekaligus dengan solve tak terbatas selama bulan berjalan — cocok untuk uji regresi login yang berulang tanpa khawatir biaya membengkak per percobaan.
Bila skrip login Anda berjalan di cloud regional seperti AWS ap-southeast-3 (Jakarta) atau ap-southeast-1 (Singapura), sisihkan sedikit toleransi pada nilai WebDriverWait dan interval polling untuk kondisi jaringan yang bervariasi. Dan satu catatan kepatuhan: otomatiskan hanya login ke akun yang memang Anda miliki atau diberi izin mengaksesnya, sejalan dengan UU Pelindungan Data Pribadi (UU 27/2022) — jangan mengambil data pribadi di balik login milik pihak lain.
Mengatasi masalah umum
| Gejala | Penyebab | Cara mengatasi |
|---|---|---|
| Login kembali ke halaman CAPTCHA | Token kedaluwarsa sebelum terkirim | Selesaikan dan kirim token dalam 60 detik |
| "Kredensial tidak valid" padahal password benar | Token CSRF tidak disertakan | Ambil token CSRF dari HTML halaman login lalu sertakan di payload |
| Sesi hilang tepat setelah login | Cookie tidak dipertahankan | Pakai requests.Session() atau cookie dari instance browser |
| reCAPTCHA v3 tetap menolak walau token valid | Skor terlalu rendah | CaptchaAI mengupayakan skor tinggi; pastikan parameter action cocok |
Pertanyaan umum
Apakah CaptchaAI bisa menangani reCAPTCHA v3 yang tak terlihat di halaman login?
Bisa. reCAPTCHA v3 memakai method userrecaptcha dengan version=v3. Layanan mengupayakan skor setinggi mungkin, tetapi pastikan parameter action yang Anda kirim cocok dengan yang diharapkan halaman login, karena skor dinilai bersama konteks action tersebut.
Berapa lama waktu penyelesaian CAPTCHA login biasanya?
Untuk tipe yang didukung seperti reCAPTCHA v2/v3 dan Turnstile, penyelesaian umumnya berlangsung dalam hitungan detik. Token punya masa berlaku terbatas, jadi kirim ke form login segera setelah diterima — idealnya di bawah 60 detik.
Bisakah satu paket menangani banyak proses login paralel sekaligus?
Ya. Karena penagihan berbasis thread, jumlah login yang bisa Anda proses bersamaan setara dengan jumlah thread paket Anda. BASIC memberi 5 thread; naik ke ADVANCE ($90/bulan, 50 thread) bila menjalankan uji login dalam volume besar secara paralel.
Apakah otomatisasi login seperti ini diperbolehkan?
CaptchaAI hanya menyelesaikan komponen CAPTCHA-nya. Legalitas bergantung pada otorisasi Anda atas akun yang diakses. Gunakan pola ini untuk akun milik sendiri, pengujian QA, atau target yang secara eksplisit mengizinkan otomatisasi.
Panduan terkait
- Menangani CAPTCHA dengan Selenium di Python
- Menyelesaikan CAPTCHA dengan Puppeteer di Node.js
- Penanganan CAPTCHA di Playwright