Cara Memperbaiki CAPCHA_NOT_READY Saat Melakukan Polling Hasil

capcha_not_ready - How to Fix CAPCHA_NOT_READY When Polling for a Result

Jawaban singkat: CAPCHA_NOT_READY bukanlah sebuah error. Itu adalah cara API memberi tahu Anda bahwa CAPTCHA masih sedang dipecahkan dan Anda bertanya terlalu awal. Tidak ada yang perlu diperbaiki pada permintaan Anda. Anda hanya memerlukan ritme polling yang tepat, dan perulangan yang tahu kapan harus berhenti. Panduan ini membahas keduanya, ditambah perilaku baca-sekali yang mengubah skrip yang berfungsi menjadi membingungkan.

Apa arti CAPCHA_NOT_READY sebenarnya

Ketika Anda mengirimkan CAPTCHA ke /in.php Anda mendapatkan sebuah ID, bukan jawaban. Pemecahan terjadi di latar belakang. Anda lalu melakukan polling /res.php dengan ID tersebut sampai jawabannya siap.

Sampai saat itu tiba, setiap polling mengembalikan string yang sama:

# Poll for the result. Note action=get and the id from /in.php.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

# Still working:
CAPCHA_NOT_READY

# Done:
OK|03AGdBq26Sxo...

Dan ya, penulisannya adalah CAPCHA, bukan CAPTCHA. Salah ketik itu sudah ada di API 2captcha sejak awal. CapSkip kompatibel secara siap pakai dengan API tersebut, jadi kesalahan ejaan itu sengaja dipertahankan. Jika diperbaiki, setiap pustaka klien yang memeriksa string persis itu akan rusak. Cocokkan persis di kode Anda.

Lakukan polling dengan jadwal yang tepat

Kebanyakan orang terus-menerus mengalami ini karena mereka melakukan polling segera setelah mengirim. Tipe CAPTCHA yang berbeda memerlukan waktu yang sangat berbeda, jadi pemeriksaan pertama tidak seharusnya terjadi pada saat yang sama untuk semuanya.

TipeTunggu sebelum pemeriksaan pertamaLalu coba lagi setiap
Gambar / teks1 detik5 detik
reCAPTCHA v215 hingga 20 detik5 detik
reCAPTCHA v310 hingga 15 detik5 detik
GeeTestsekitar 5 detik5 detik
Cloudflare Turnstilesekitar 5 detik5 detik

Melakukan polling lebih sering daripada setiap 5 detik tidak membuat apa pun terpecahkan lebih cepat. Itu hanya memboroskan permintaan.

Loop polling yang berhenti

Versi shell, yang menunjukkan strukturnya dengan jelas:

# Submit, capture the id, give it a head start, then poll.
ID=$(curl -s "http://127.0.0.1:8080/in.php?key=YOUR_API_KEY&method=userrecaptcha&googlekey=YOUR_SITEKEY&pageurl=https://example.com" | cut -d'|' -f2)

sleep 15
while :; do
  RES=$(curl -s "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=$ID")
  [ "$RES" = "CAPCHA_NOT_READY" ] || break
  sleep 5
done
echo "$RES"

Loop itu punya satu kelemahan yang perlu disebut: loop akan berjalan selamanya jika ada yang bermasalah di hulu. Pada kode nyata, batasi.

# pip install requests
import time
import requests

BASE = "http://127.0.0.1:8080"

def solve_recaptcha(sitekey, page_url, api_key="YOUR_API_KEY", timeout=180):
    task = requests.get(BASE + "/in.php", params={
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": page_url,
        "json": 1,
    }).json()
    task_id = task["request"]

    time.sleep(15)                      # reCAPTCHA needs a head start
    deadline = time.monotonic() + timeout

    while time.monotonic() < deadline:
        res = requests.get(BASE + "/res.php", params={
            "key": api_key,
            "action": "get",
            "id": task_id,
        }).text.strip()

        if res.startswith("OK|"):
            return res.split("|", 1)[1]

        # Anything that is not the pending string is terminal.
        if res != "CAPCHA_NOT_READY":
            raise RuntimeError(res or "empty response: already read, or bad id")

        time.sleep(5)

    raise TimeoutError("gave up after %ss" % timeout)

Tiga hal membuat ini aman: tenggat waktu agar tidak menggantung, memperlakukan setiap string non-pending sebagai final sehingga error sungguhan langsung muncul, dan membaca jawabannya tepat satu kali.

Atau lewati loop sepenuhnya

Jika Anda menggunakan salah satu SDK resmi, tidak ada satu pun hal di atas yang menjadi masalah Anda. Polling terjadi di dalam panggilan dan Anda mendapatkan token-nya secara langsung, jadi CAPCHA_NOT_READY tidak pernah sampai ke kode Anda.

# pip install capskip
from capskip import CapSkip

solver = CapSkip(host="127.0.0.1", port=8080)

# Submit and poll happen inside this one call.
result = solver.recaptcha(
    sitekey="YOUR_SITEKEY",
    url="https://example.com/page-with-recaptcha",
)

print(result["code"])   # token, ready to inject
// npm install capskip
const { CapSkip } = require('capskip');

const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });
const result = await solver.recaptcha('YOUR_SITEKEY', 'https://example.com/page-with-recaptcha');

console.log(result.code);
// composer require capskip/capskip
use CapSkip\CapSkip;

$solver = new CapSkip(['host' => '127.0.0.1', 'port' => 8080]);
$result = $solver->recaptcha('YOUR_SITEKEY', 'https://example.com/page-with-recaptcha');

echo $result['code'];
// dotnet add package CapSkip
using CapSkip;

var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);
var result = await solver.RecaptchaAsync("YOUR_SITEKEY", "https://example.com/page-with-recaptcha");

Console.WriteLine(result.Code);

Signature metode lengkap untuk keempat bahasa ada di SDK pemecahan CAPTCHA . Loop mentah di atas tetap menjadi pilihan untuk Go, Java, Ruby, atau apa pun yang tidak punya paket resmi.

Jebakan read-once

Inilah yang membuang waktu satu sore penuh. Setiap hasil hanya dapat dibaca satu kali. Lakukan polling lagi setelah pembacaan berhasil dan Anda akan mendapat respons kosong, bukan token yang sudah Anda miliki.

Jadi body kosong tidak berarti “masih diproses”. Itu berarti salah satu dari dua hal:

  • Anda sudah mengambil hasil ini dan membuangnya
  • ID tersebut tidak ada, biasanya ID yang rusak atau terpotong akibat parsing OK|ID

Simpan token begitu Anda menerimanya. Jangan melakukan polling ulang untuk “mengonfirmasi” token itu.

Kapan ini benar-benar menjadi masalah

Jika CAPCHA_NOT_READY tidak pernah selesai, string pending adalah gejala, bukan penyebabnya. Periksa hal-hal berikut secara berurutan:

ResponsApa artinyaPerbaiki
ERROR_CAPTCHA_UNSOLVABLEPemecahan telah dicoba dan gagalPastikan sitekey dan pageurl adalah yang aktif, lalu kirim ulang
ERROR_WRONG_ID_FORMATID bukan bilangan bulat yang validAnda mengurai OK|ID salah. Pisahkan pada tanda pipa, ambil bidang 2
ERROR_GOOGLEKEYsitekey ditolak saat pengirimanBaca ulang dari halaman langsung, bukan dari sumber yang di-cache
Body kosongSudah dibaca, atau ID tidak dikenalSimpan hasilnya saat pembacaan pertama
Pending lebih dari 3 menitPemecahnya tidak berjalan atau tidak dapat dijangkauPastikan layanan berjalan pada port yang dikonfigurasi. Lihat panduan penyiapan

Daftar lengkap string error ada di dokumentasi API.

Pertanyaan yang sering diajukan

Apakah CAPCHA_NOT_READY termasuk error yang harus saya catat?

Bukan sebagai error. Itu adalah status sedang berjalan yang normal dan Anda akan melihatnya beberapa kali per pemecahan. Catat di level debug kalau memang perlu, atau kegagalan sungguhan akan terkubur di antara keriuhan.

Apakah polling yang lebih cepat membuat jawaban datang lebih cepat?

Tidak. Waktu pemecahan tidak bergantung pada seberapa sering Anda bertanya. Setiap 5 detik adalah interval yang didokumentasikan dan yang lebih cepat hanya membuang permintaan.

Mengapa ditulis CAPCHA dan bukan CAPTCHA?

Itu adalah salah ketik lama pada API 2captcha yang asli dan kemudian menjadi bagian dari kontraknya. CapSkip kompatibel secara siap pakai dengan API tersebut, jadi string itu dipertahankan persis. Memperbaiki ejaannya akan merusak setiap klien yang memeriksanya.

Bisakah saya mendapatkan status pending dalam bentuk JSON?

Ya. Tambahkan json=1 ke permintaan tersebut dan respons kembali sebagai objek dengan status dan request sebagai kolom alih-alih teks biasa. String pending itu sendiri tidak berubah.

Ringkasan

Beri pemecahan itu waktu awal sebelum pemeriksaan pertama Anda, coba lagi setiap 5 detik, perlakukan apa pun selain CAPCHA_NOT_READY sebagai final, batasi loop dengan tenggat waktu, dan baca hasilnya tepat satu kali. Itulah keseluruhan polanya.

Jika Anda lebih memilih tidak menulis loop sama sekali, CapSkip adalah pemecah captcha yang berjalan secara lokal dan menyediakan SDK untuk Python, Node.js, PHP, dan .NET yang menangani polling untuk Anda.