Troubleshooting

Penurunan Tingkat Keberhasilan Solve CAPTCHA: Diagram Alir Diagnosis

Solve rate anjlok mendadak hampir selalu karena tiga hal: sitekey berubah, token ditolak situs target, atau ada rate limiting baru. Diagram alir dan tiga langkah berikut menemukan penyebabnya dalam hitungan menit.

Contoh umum di tim automation Indonesia: job price monitoring dari server AWS ap-southeast-1 yang stabil di atas 95% tiba-tiba anjlok ke bawah 70% semalam tanpa perubahan kode — penyebabnya ada di salah satu cabang diagram alir berikut.

Ringkasan tiga penyebab tersebut:

  • Sitekey berubah — situs target deploy ulang halaman dengan sitekey baru, token lama otomatis ditolak
  • Token ditolak situs target — API CaptchaAI melapor sukses, tapi form di situs tetap menolak token saat submit
  • Rate limiting baru — situs baru menerapkan pembatasan request, biasanya hanya kelihatan di jam-jam tertentu

Tingkat Keberhasilan Normal per Tipe CAPTCHA

Bandingkan angka Anda dengan kisaran normal berikut. Kalau cuma satu tipe yang turun, penyebabnya spesifik ke tipe itu, bukan ke seluruh pipeline.

Angka pada tabel ini bersumber dari pengamatan dan laporan pengguna CaptchaAI, bukan SLA tertulis. Hasil aktual dapat bervariasi tergantung region server, volume request, dan jam pengujian — pakai sebagai kisaran acuan, bukan patokan mutlak.

Jenis CAPTCHA Kisaran Normal Ambang Peringatan
reCAPTCHA v2 95-99% Di bawah 90%
reCAPTCHA v3 90-98% Di bawah 85%
Cloudflare Turnstile 99–100% Di bawah 95%
GeeTest v3 99-100% Di bawah 95%
BLS 99-100% Di bawah 95%
Gambar/OCR 90-98% Di bawah 85%

Diagram Alir: Cari Akar Masalah dalam 4 Cabang

Ikuti cabang sesuai gejala Anda — jangan mulai dari pertengahan diagram, karena cabang "token digenerate tapi ditolak situs" sering terlihat mirip dengan gejala rate limiting padahal akar masalahnya beda.

Success rate dropped
│
├── Are tokens being generated?
│   ├── NO → Check API errors
│   │   ├── ERROR_WRONG_GOOGLEKEY → Sitekey changed. Re-extract.
│   │   ├── ERROR_BAD_PARAMETERS → Check required params
│   │   ├── ERROR_NO_SLOT → Retry with backoff
│   │   └── Other errors → See error decision tree
│   │
│   └── YES → Tokens generated but rejected by target site
│       │
│       ├── Token expired before use?
│       │   └── YES → Submit token faster (< 60-120s)
│       │
│       ├── Token used for wrong domain?
│       │   └── YES → Check pageurl matches submission domain
│       │
│       ├── reCAPTCHA v3 score too low?
│       │   └── YES → Check action parameter, attach cookies/UA/proxy
│       │
│       ├── Site changed CAPTCHA type?
│       │   └── YES → Re-detect CAPTCHA type
│       │
│       └── Site added additional checks?
│           └── YES → Check for sinyal browser, cookies, headers

Langkah 1: Ukur Solve Rate Anda Saat Ini

Kumpulkan angka pastinya dulu dengan class SuccessTracker berikut.

import requests
import time
from collections import defaultdict

class SuccessTracker:
    """Track solve success rates over time."""

    def __init__(self):
        self.stats = defaultdict(lambda: {"attempts": 0, "success": 0, "errors": defaultdict(int)})

    def record(self, method, success, error_code=None):
        self.stats[method]["attempts"] += 1
        if success:
            self.stats[method]["success"] += 1
        elif error_code:
            self.stats[method]["errors"][error_code] += 1

    def report(self):
        for method, data in self.stats.items():
            rate = data["success"] / data["attempts"] * 100 if data["attempts"] > 0 else 0
            print(f"\n{method}:")
            print(f"  Attempts: {data['attempts']}")
            print(f"  Success: {data['success']} ({rate:.1f}%)")
            if data["errors"]:
                print("  Errors:")
                for err, count in sorted(data["errors"].items(), key=lambda x: -x[1]):
                    print(f"    {err}: {count}")

tracker = SuccessTracker()

Langkah 2: Gagal di API atau Ditolak Situs?

Pisahkan dua skenario yang gejalanya mirip tapi solusinya beda.

Jalankan diagnose_api_failures() dengan minimal 20 percobaan, bukan 2-3. Pola error baru kelihatan jelas di sampel yang cukup besar — dua kegagalan berturut-turut bisa saja kebetulan.

Kategori A: Kegagalan di Level API

API mengembalikan kesalahan, bukan token.

def diagnose_api_failures(api_key, method, params, attempts=10):
    """Run test solves and collect error patterns."""
    errors = defaultdict(int)
    successes = 0

    for i in range(attempts):
        try:
            resp = requests.post("https://ocr.captchaai.com/in.php", data={
                "key": api_key, "method": method, "json": 1, **params,
            }, timeout=30)
            result = resp.json()

            if result.get("status") != 1:
                errors[result.get("request", "UNKNOWN")] += 1
                continue

            task_id = result["request"]
            # Quick poll
            time.sleep(15)
            resp = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": api_key, "action": "get",
                "id": task_id, "json": 1,
            }, timeout=15)
            data = resp.json()

            if data.get("status") == 1:
                successes += 1
            else:
                errors[data.get("request", "POLL_ERROR")] += 1

        except Exception as e:
            errors[f"EXCEPTION:{type(e).__name__}"] += 1

        time.sleep(2)

    print(f"\nResults: {successes}/{attempts} success")
    for err, count in sorted(errors.items(), key=lambda x: -x[1]):
        print(f"  {err}: {count}")

Kategori B: Token Ditolak Situs Target

Token valid, tapi situs target menolaknya saat submit — API terlihat "sukses" padahal alurnya gagal.

Penyebab Yang Perlu Diperiksa
Token kedaluwarsa Token dipakai lebih dari 120 detik setelah digenerate
Domain tidak cocok pageurl berbeda dari domain tempat submit
Skor v3 terlalu rendah Situs butuh skor 0.7+, solver hanya dapat 0.3
Parameter action hilang v3 memerlukan parameter action yang sesuai
Situs mengubah parameter Sitekey atau struktur halaman berubah

Langkah 3: Perbaiki Penyebab Paling Umum

Empat perbaikan ini menutup sebagian besar kasus di kategori B, diurutkan dari yang paling sering ditemui.

Perbaiki: Token Kedaluwarsa Sebelum Sempat Dipakai

Jangan simpan token — submit sedetik setelah CaptchaAI mengembalikannya.

def solve_and_use_immediately(api_key, sitekey, pageurl):
    """Solve and use token as fast as possible."""
    # Submit
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1,
    }, timeout=30)
    task_id = resp.json()["request"]

    # Poll aggressively
    for _ in range(24):
        time.sleep(5)
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key, "action": "get",
            "id": task_id, "json": 1,
        }, timeout=15)
        data = resp.json()
        if data.get("status") == 1:
            token = data["request"]
            # USE IMMEDIATELY — don't store for later
            submit_form(token)
            return True

    return False

Perbaiki: Sitekey yang Sudah Basi

Situs sering mengganti sitekey saat deploy ulang halaman. Ekstrak ulang kalau Anda curiga ini penyebabnya.

def solve_with_fresh_params(api_key, pageurl):
    """Re-extract sitekey before each solve."""
    import re

    resp = requests.get(pageurl, timeout=15)
    match = re.search(r'data-sitekey="([^"]+)"', resp.text)
    if not match:
        raise RuntimeError("Could not find sitekey")

    sitekey = match.group(1)
    # Now solve with fresh sitekey
    # ...

Perbaiki: Parameter Action untuk reCAPTCHA v3

v3 menilai skor dari parameter action. Kalau action tidak cocok dengan situs, skornya bisa anjlok walau token valid.

# Check what action the site uses
# Look for: grecaptcha.execute('sitekey', {action: 'submit'})

data = {
    "key": api_key,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": pageurl,
    "version": "v3",
    "action": "submit",  # Must match site's action
    "json": 1,
}

Perbaiki: Rate Limiting yang Tidak Terdeteksi

Kalau solve rate turun hanya di jam-jam sibuk (misalnya jam kerja WIB) lalu pulih sendiri di malam hari, ini biasanya rate limiting di sisi situs target, bukan masalah di CaptchaAI. Dua langkah berikut biasanya cukup:

  • Tambahkan jeda 2–5 detik antar submission pada jam puncak, bukan hanya saat error muncul
  • Sebar job ke beberapa worker atau region server berbeda supaya beban tidak menumpuk di satu jam

Referensi Cepat

Gejala Penyebab Perbaikan
Rate turun dari 98% ke 70% Sitekey atau halaman berubah Ekstrak ulang semua parameter
Token v3 semuanya ditolak Parameter action salah Sesuaikan action dari halaman
Token berfungsi tapi kedaluwarsa Terlalu lambat dipakai Submit dalam 60 detik
Rate berubah-ubah tergantung jam Rate limiting server Tambahkan delay antar submit

Pertanyaan Umum Solve Rate CAPTCHA Turun

Berapa solve rate yang normal?

Tergantung tipe CAPTCHA — lihat tabel di atas. Konsisten di bawah ambangnya berarti ada masalah parameter atau timing.

Kenapa solve rate saya anjlok drastis dalam semalam?

Paling sering situs mengganti sitekey atau struktur halaman. Ekstrak ulang parameternya, lalu test ulang.

Kenapa token v3 saya ditolak padahal statusnya sukses di CaptchaAI?

Biasanya parameter action tidak cocok situs, jadi skornya rendah. Samakan dengan grecaptcha.execute() di source halaman.

Bisakah rate limiting bikin solve rate naik-turun sepanjang hari?

Bisa — penurunan hanya di jam tertentu adalah ciri khas rate limiting server. Tambahkan delay antar submission.

Perlukah saya melaporkan solve yang salah lewat reportbad?

Ya. Endpoint reportbad melaporkan hasil salah, dan CaptchaAI memakainya untuk perbaiki akurasi.


Panduan Terkait


Diagnosis akar masalahnya sekarang, jangan biarkan solve rate terus turun — coba CaptchaAI.

Komentar dinonaktifkan untuk artikel ini.