Scarnox · Blog

Captcha token süresi doldu: nedenleri ve nasıl düzeltilir

Captcha token'ı, bir doğrulamanın geçildiğine dair kısa ömürlü bir kanıttır. Scarnox'un PopularCaptcha token'ları, verildikten yaklaşık iki dakika sonra süresi dolar. Token'ı bu pencerenin dışında gönderirseniz site formu reddeder; çoğu zaman captcha'nın süresinin dolduğunu ya da geçersiz olduğunu söyleyen bir mesajla. Düzeltme neredeyse her zaman zamanlamayla ilgilidir: captcha'yı göndermeye mümkün olduğunca yakın çözün, her token'ı bir kez kullanın ve yalnızca ilk denemenin kabul edilmediğini bildiğinizde tekrar deneyin.

Token'lar neden süresi dolar

Token kalıcı bir kimlik bilgisi değildir. Site, bir insanın (ya da onun adına hareket eden bir solver'ın) doğrulamayı yakın zamanda tamamladığını bilmek ister; bu yüzden token'a kısa bir ömür verir. Saat, token'ın ilk API çağrısında değil, verildiği anda başlar. Çözme ile gönderim arasında olan her şey bu iki dakikadan yer.

Yaygın nedenler

Düzeltme: göndermeden hemen önce çözün

En basit güvenilir kalıp, çözme ile göndermeyi tek bir adım yapmaktır. Bir token isteyin, formuna koyun, formu gönderin ve aradaki hiçbir yavaş işi yapmayın:

import requests

API_KEY = "scarnox_YOURAPIKEY"
CREATE_URL = "https://api.scarnox.com/api/tasks/create"

def fresh_token(sitekey: str, page_url: str) -> str:
    r = requests.post(
        CREATE_URL,
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={
            "captcha_type": "PopularCaptchaTaskProxyless",
            "site_key": sitekey,
            "site_url": page_url,
        },
        timeout=185,  # çağrı token hazır olana kadar bloke olur
    )
    data = r.json()
    if data.get("errorId") != 0:
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data["solution"]["token"]

def submit_form(page_url: str, sitekey: str, form: dict) -> requests.Response:
    token = fresh_token(sitekey, page_url)  # gönderimden hemen önce çöz
    return requests.post(
        page_url,
        data={**form, "h-captcha-response": token, "g-recaptcha-response": token},
        timeout=30,
    )

submit_form token'ı bir önbellekte ya da kuyrukta tutmaz. Bir tane ister, gönderir ve devam eder. Başarısız çözümler ücretlendirilmediği için başarısız bir istek çözme tarafında size bir maliyet yüklemez.

Güvenli şekilde tekrar deneyin

Bazı siteler süresi dolmuş bir token'ı açık bir yanıtla reddeder. Diğerleri sayfa içinde bir hata mesajıyla normal bir sayfa döndürür; bu yüzden tek başına bir durum kodu size bir şey söylemez. Süresi dolmuş bir token için sitenin gerçekte döndürdüğü yanıta bakın ve kontrolünüzü ona göre kurun. Bir yeniden deneme döngüsü şöyle görünebilir:

def submit_with_retry(page_url: str, sitekey: str, form: dict, attempts: int = 2):
    for _ in range(attempts):
        resp = submit_form(page_url, sitekey, form)
        if resp.status_code < 400 and "captcha" not in resp.text.lower():
            return resp  # kabul edildi, sitenin yanıtının gösterdiği kadarıyla
    raise RuntimeError("captcha token rejected after retries")

Bir şey oluşturan formlarda tekrar denemeye dikkat edin. İlk deneme aslında kabul edilmişse ama kodunuz yanıtı yanlış okuduysa, bir tekrar yinelenen bir hesap, sipariş ya da mesaj oluşturabilir. Yalnızca ilk gönderimin kabul edilmediğinden eminseniz tekrar deneyin ve kontrolü çalıştığınız siteye özgü yapın.

Zamanlamayı dürüst tutun

Sık yapılan hatalar

Sorunu teşhis edecek kadar log tutun

Bir gönderim başarısız olduğunda şunları kaydedin: token'ın ne zaman verildiği, formun ne zaman gönderildiği, HTTP durumu ve yanıtın ilk birkaç yüz karakteri. Bu dört değerle token'ın yaşını mı doldurduğunu yoksa sitenin başka bir nedenle mi reddettiğini bir bakışta anlarsınız. Token'ın tamamını ortak loglara yazmayın; geçerli bir token, o tek captcha için bir kimlik bilgisidir.

Hâlâ başarısız oluyorsa neyi kontrol etmeli

  1. Token döndükten ile form gönderimi arasındaki süreyi yazdırın.
  2. site_url değerinin captcha'yı gösteren sayfayla eşleştiğini doğrulayın.
  3. Sitekey'in eski bir kopyadan değil, güncel sayfadan okunduğunu doğrulayın.
  4. Form alan adlarını kontrol edin. PopularCaptcha token'ları h-captcha-response alanına gider; çoğu zaman g-recaptcha-response alanına da.

Tüm hata yanıtlarının ve her birinin nasıl ele alınacağının tam listesi için captcha solver hata yönetimi rehberine bakın.

Sonraki adımlar