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

capcha_not_ready - How to Fix CAPCHA_NOT_READY When Polling for a Result

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 bekleArdından her
Görüntü / metin1 saniye5 saniye
reCAPTCHA v215 ila 20 saniye5 saniye
reCAPTCHA v310 ila 15 saniye5 saniye
GeeTestyaklaşık 5 saniye5 saniye
Cloudflare Turnstileyaklaşık 5 saniye5 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ıtNe anlama geldiğiDüzeltme
ERROR_CAPTCHA_UNSOLVABLEÇözüm denendi ve başarısız oldusitekey ve pageurl'ün canlı olanlar olduğunu doğrulayın, ardından yeniden gönderin
ERROR_WRONG_ID_FORMATID 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_GOOGLEKEYsitekey, gönderim sırasında reddedildiOnu önbelleğe alınmış kaynaktan değil, canlı sayfadan yeniden okuyun
Boş gövdeZaten okundu veya bilinmeyen kimlikSonucu ilk okumada saklayın
3 dakikayı aşan bekleme (pending)Çözücü çalışmıyor veya erişilebilir değilServisin 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.