Cara Memperbaiki CAPCHA_NOT_READY Saat Melakukan Polling Hasil

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.
| Tipe | Tunggu sebelum pemeriksaan pertama | Lalu coba lagi setiap |
|---|---|---|
| Gambar / teks | 1 detik | 5 detik |
| reCAPTCHA v2 | 15 hingga 20 detik | 5 detik |
| reCAPTCHA v3 | 10 hingga 15 detik | 5 detik |
| GeeTest | sekitar 5 detik | 5 detik |
| Cloudflare Turnstile | sekitar 5 detik | 5 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:
| Respons | Apa artinya | Perbaiki |
|---|---|---|
ERROR_CAPTCHA_UNSOLVABLE | Pemecahan telah dicoba dan gagal | Pastikan sitekey dan pageurl adalah yang aktif, lalu kirim ulang |
ERROR_WRONG_ID_FORMAT | ID bukan bilangan bulat yang valid | Anda mengurai OK|ID salah. Pisahkan pada tanda pipa, ambil bidang 2 |
ERROR_GOOGLEKEY | sitekey ditolak saat pengiriman | Baca ulang dari halaman langsung, bukan dari sumber yang di-cache |
| Body kosong | Sudah dibaca, atau ID tidak dikenal | Simpan hasilnya saat pembacaan pertama |
| Pending lebih dari 3 menit | Pemecahnya tidak berjalan atau tidak dapat dijangkau | Pastikan 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.
