Sonuç İçin Yoklama Yaparken CAPCHA_NOT_READY Nasıl Düzeltilir

Kısa yanıt: CAPCHA_NOT_READY bir hata değildir. API'nin size CAPTCHA'nın hâlâ çözülmekte olduğunu ve çok erken sorduğunuzu söylemesidir. İsteğinizde düzeltilecek bir şey yoktur. Yalnızca doğru yoklama ritmine ve ne zaman duracağını bilen bir döngüye ihtiyacınız var. Bu kılavuz ikisini de ele alır, ayrıca çalışan bir betiği kafa karıştırıcı hale getiren tek-okuma davranışını da.
CAPCHA_NOT_READY gerçekte ne anlama gelir
Bir CAPTCHA'yı şuraya gönderdiğinizde: /in.php bir yanıt değil, bir ID geri alırsınız. Çözme arka planda gerçekleşir. Ardından şunu sorgularsınız: /res.php yanıt hazır olana kadar o ID ile.
O olana kadar, her yoklama (poll) aynı dizeyi döndürür:
# 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...
Ve evet, şöyle yazılır CAPCHA, değil CAPTCHA. Bu yazım hatası, 2captcha API'sinde en başından beri var. CapSkip bu API ile doğrudan uyumludur, bu yüzden yazım hatası bilerek korunur. Düzeltilseydi, tam dizeyi kontrol eden her mevcut istemci kütüphanesi bozulurdu. Kodunuzda buna tam olarak uyun.
Doğru zamanlamayla sorgulayın
Çoğu insan bununla sürekli karşılaşır çünkü gönderdikten hemen sonra yoklama yaparlar. Farklı CAPTCHA türleri çok farklı süreler alır, bu nedenle ilk kontrol hepsi için aynı anda gerçekleşmemelidir.
| Tür | İlk kontrolden önce bekle | Ardından her |
|---|---|---|
| Görüntü / metin | 1 saniye | 5 saniye |
| reCAPTCHA v2 | 15 ila 20 saniye | 5 saniye |
| reCAPTCHA v3 | 10 ila 15 saniye | 5 saniye |
| GeeTest | yaklaşık 5 saniye | 5 saniye |
| Cloudflare Turnstile | yaklaşık 5 saniye | 5 saniye |
5 saniyeden daha sık sorgulama hiçbir şeyin daha hızlı çözülmesini sağlamaz. Sadece istekleri boşa harcar.
Sonlanan bir sorgulama döngüsü
Yapıyı açıkça gösteren shell sürümü:
# 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"
O döngünün adı konulmaya değer bir kusuru vardır: üst tarafta bir şey ters giderse sonsuza kadar çalışır. Gerçek kodda buna bir üst sınır koyun.
# 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)Bunu güvenli kılan üç şey vardır: takılıp kalmaması için bir süre sınırı (deadline), bekleyen (pending) olmayan herhangi bir dizeyi nihai olarak ele almak, böylece gerçek hataların hemen ortaya çıkması ve yanıtı tam olarak bir kez okumak.
Ya da döngüyü tamamen atlayın
Resmi SDK'lardan birini kullanıyorsanız, yukarıdakilerin hiçbiri sizin sorununuz değildir. Yoklama çağrının içinde gerçekleşir ve token'ı doğrudan geri alırsınız; dolayısıyla CAPCHA_NOT_READY asla kodunuza ulaşmaz.
# 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);Dört dilin tümü için tam yöntem imzaları şuradadır: CAPTCHA çözme SDK'sı sayfa. Yukarıdaki ham döngü, Go, Java, Ruby veya resmi paketi olmayan herhangi bir şey için hâlâ istediğiniz şeydir.
Bir kez okuma tuzağı
Bir öğleden sonranızı boşa harcayan işte budur. Her sonuç yalnızca bir kez okunabilir. Başarılı bir okumadan sonra tekrar sorgularsanız, halihazırda sahip olduğunuz token'ı değil, boş bir yanıt alırsınız.
Yani boş bir gövde “hâlâ çalışıyor” anlamına gelmez. İki şeyden birini ifade eder:
- Bu sonucu zaten aldınız ve attınız
- ID mevcut değil, genellikle ayrıştırmadan kaynaklanan bozuk veya kesilmiş bir ID
OK|ID
Token'ı aldığınız an saklayın. Onu “doğrulamak” için yeniden yoklama (poll) yapmayın.
Gerçekten bir sorun olduğunda
Eğer CAPCHA_NOT_READY asla çözümlenmezse, bekleyen (pending) dize nedenden ziyade bir belirtidir. Bunları sırayla kontrol edin:
| Yanıt | Ne anlama geldiği | Düzeltme |
|---|---|---|
ERROR_CAPTCHA_UNSOLVABLE | Çözüm denendi ve başarısız oldu | sitekey ve pageurl'ün canlı olanlar olduğunu doğrulayın, ardından yeniden gönderin |
ERROR_WRONG_ID_FORMAT | ID geçerli bir tam sayı değil | Şunu ayrıştırıyorsunuz: OK|ID yanlış. Boru işaretinden (pipe) bölün, 2. alanı alın |
ERROR_GOOGLEKEY | sitekey, gönderim sırasında reddedildi | Onu önbelleğe alınmış kaynaktan değil, canlı sayfadan yeniden okuyun |
| Boş gövde | Zaten okundu veya bilinmeyen kimlik | Sonucu ilk okumada saklayın |
| 3 dakikayı aşan bekleme (pending) | Çözücü çalışmıyor veya erişilebilir değil | Servisin yapılandırılan portta çalıştığını doğrulayın. Şuna bakın: kurulum kılavuzu |
Hata dizelerinin tam listesi şuradadır: API dokümantasyonu.
Sık sorulan sorular
CAPCHA_NOT_READY, günlüğe kaydetmem gereken bir hata mı?
Bir hata olarak değil. Bu normal devam ediyor durumudur ve her çözümde birkaç kez göreceksiniz. Kaydedecekseniz hata ayıklama düzeyinde kaydedin, yoksa gerçek hataları gürültünün altına gömersiniz.
Daha hızlı yoklama (polling) yanıtı daha erken mi döndürür?
Hayır. Çözüm süresi, ne sıklıkta sorduğunuzdan bağımsızdır. Belgelenen aralık her 5 saniyede birdir ve daha hızlısı boşa giden isteklerdir.
Neden CAPTCHA değil de CAPCHA olarak yazılıyor?
Bu, orijinal 2captcha API'sinde bulunan ve sözleşmenin parçası haline gelmiş eski bir yazım hatasıdır. CapSkip bu API ile doğrudan uyumludur, bu yüzden dize aynen korunur. Yazımı düzeltmek, onu kontrol eden her istemciyi bozardı.
Bekleyen (pending) durumu JSON olarak alabilir miyim?
Evet. Ekleyin json=1 isteğe, ve yanıtlar şunları içeren bir nesne olarak geri döner: status ve request düz metin yerine alanlar. Bekleyen (pending) dizenin kendisi değişmez.
Özet
İlk kontrolünüzden önce çözüme bir baştan avantaj verin, her 5 saniyede bir yeniden deneyin, şunun dışındaki her şeyi şöyle değerlendirin: CAPCHA_NOT_READY terminal olarak, döngüyü bir son teslim tarihiyle sınırlayın ve sonucu tam olarak bir kez okuyun. Tüm desen budur.
Döngüyü hiç yazmamayı tercih ederseniz, CapSkip bir captcha çözücü yerel olarak çalışır ve yoklamayı (polling) sizin için halleden Python, Node.js, PHP ve .NET SDK'larıyla gelir.
