Gönderimde ERROR_GOOGLEKEY ve ERROR_PAGEURL nasıl düzeltilir

error_googlekey - How to Fix ERROR_GOOGLEKEY and ERROR_PAGEURL on Submit

Kısa yanıt: ERROR_GOOGLEKEY şu değerin reddedildiği anlamına gelir: googlekey (sizin gönderdiğiniz değer), ve ERROR_PAGEURL şu değerin reddedildiği anlamına gelir: pageurl . İkisi de şuradan gelir: /in.php gönderim anında, yani hiç görev oluşturulmadı ve yoklanacak bir CAPTCHA ID'si yok. On vakanın dokuzunda sebep parametre adıdır: reCAPTCHA şunu ister: googlekey, Turnstile şunu ister: sitekey; yanlışını gönderince tam olarak bu olur. İkisini nasıl ayırt edeceğiniz ve her birini nasıl düzelteceğiniz aşağıda.

Bu iki kod aslında neyi kontrol ediyor

KodBelgelenen anlamıHangi parametre
ERROR_GOOGLEKEYGeçersiz googlekey parametresi geçersizSayfadan okuduğunuz sitekey
ERROR_PAGEURLGeçersiz pageurl parametresi geçersizWidget'ın üzerinde durduğu sayfanın URL'si

Bunlar doğrulama hatalarıdır, çözüm hataları değil. Henüz hiçbir şey denenmedi ve kuyrukta bir şey yok.

Gönderim anı, yoklama anı değil

Bu ayrım çok fazla hata ayıklama zamanı kazandırır. API'nin iki aşaması var ve her biri kendi hata ailesini üretiyor.

# Stage 1: submit. These codes appear HERE.
curl -X POST http://127.0.0.1:8080/in.php \
  -d "key=YOUR_API_KEY" -d "method=userrecaptcha" \
  -d "sitekey=YOUR_SITEKEY" \
  -d "pageurl=https://example.com/page-with-recaptcha"

ERROR_GOOGLEKEY   # no ID came back, so there is nothing to poll

Bunu, şunu döndüren sağlıklı bir gönderimle karşılaştırın: OK|2122988149 ve eğer başarısız olacaksa bunu şurada yapar: /res.php. Yoklama anındaki bir başarısızlık, parametrelerinizin kabul edildiği ama çözümün tutmadığı anlamına gelir; bu tamamen başka bir soruşturmadır. Bkz. ERROR_CAPTCHA_UNSOLVABLE buna dair; bir de ERROR_KEY_DOES_NOT_EXIST anahtarın kendisi her iki kontrolden önce reddediliyorsa.

Değer neden reddediliyor

Neredeyse hepsi şu üç nedene iniyor, bu sırayla.

Birinci neden: googlekey'e karşı sitekey

2captcha uyumlu API her metot için farklı bir parametre adı kullanır ve bunlar birbirinin yerine geçmez.

YöntemAnahtar parametresiYanlış ad şunu verir:
userrecaptchagooglekeyERROR_GOOGLEKEY
turnstilesitekeyERROR_BAD_PARAMETERS
geetestgt artı challengeERROR_BAD_PARAMETERS

Tuzak şu: konuşurken herkes bu değere sitekey diyor ve HTML özniteliği hem reCAPTCHA hem Turnstile'da birebir şu: data-sitekey . Yalnızca reCAPTCHA'nın gönderim parametresi Google'ın adını taşır. Çalışan bir Turnstile çağrısını kopyalayıp şunu değiştirdiyseniz: method şuraya userrecaptcha, hatanız budur.

SDK'lar bu farkı tamamen gizler. solver.recaptcha(sitekey, url) ve solver.turnstile(sitekey, url) aynı ilk argümanı alır ve sizin yerinize doğru tel adına eşler; bu da onlardan birini kullanmak için iyi bir sebep.

İkinci neden: anahtar bayat, kırpılmış ya da boş

Parametre adı doğruysa sıradaki şüpheli değerin kendisidir.

  • Kodun içine gömdünüz. Siteler sitekey'leri değiştirir. Geçen ay çalışan bir sabit bugün ölmüş olabilir.
  • Önbellekteki sayfa kaynağından geldi. Tarayıcıdaki kaynağı görüntüle, widget'ın gerçekte oluşturulduğu kopyadan daha eskisini verebilir.
  • Yanlış özniteliği aldınız. Değer şurada durur: data-sitekey, şurada değil: id, name ya da iframe'in şu özniteliğinde: title.
  • Bir kabuk değişkeni yanında satır sonu getirdi. Komut ikamesi sondaki boşlukları korur ve boşluk geçerli bir anahtarın parçası değildir.
  • Boş. Tanımsız bir değişken hiçbir şeye açılır ve istek şununla gider: googlekey=.

Sabite güvenmek yerine canlı DOM'dan okuyun:

// Run in the page, or via your automation tool's evaluate().
// reCAPTCHA and Turnstile both expose it as data-sitekey.
const recaptchaKey = document.querySelector('.g-recaptcha')?.dataset.sitekey;
const turnstileKey = document.querySelector('.cf-turnstile')?.dataset.sitekey;

// Fallback: reCAPTCHA also carries it as k= in the widget iframe URL.
const iframe = document.querySelector('iframe[src*="/recaptcha/"]');
const fromSrc = iframe ? new URL(iframe.src).searchParams.get('k') : null;

console.log(recaptchaKey || fromSrc);

The k= yedeği; widget'ı JavaScript ile oluşturan ve DOM'da hiç şu öğeyi bırakmayan sitelerde önemlidir: .g-recaptcha .

Üçüncü neden: bir pageurl'ü geçersiz kılan şeyler

ERROR_PAGEURL daha dar ve genellikle mekanik bir sorundur.

  • Şema yok. example.com/login bir URL değil. Şunu gönderin: https://example.com/login.
  • Göreli yol. /login kazıyıcınızın elindeki şeydir, API'nin ihtiyacı olan değil.
  • GET kesilmesi. Sayfa URL'si kendi sorgu dizesini içeriyorsa ve siz onu kodlamadan GET ile gönderiyorsanız, ilk ve işaretinden sonraki her şey kendi API çağrınızın parametresi olarak ayrıştırılır. POST kullanın ya da şunu kullanın: --data-urlencode.
  • Boşluk ya da tırnak. Bir yapılandırma dosyasından okunan URL, hiç ayıklanmamış tırnaklar içinde gelebilir.

URL'nin CapSkip'in çalıştığı makineden erişilebilir olması gerekmez ve formu sonunda POST edeceğiniz URL olması da gerekmez. Widget'ın gömülü olduğu sayfa olmalıdır, çünkü token ona bağlanır.

Bu bir SDK'dan nasıl görünür

SDK'lar bariz sorunları hiçbir şey sürecinizden çıkmadan yakalar, geri kalanını geçirir. İki farklı istisna, iki farklı çözüm.

# pip install capskip
from capskip import CapSkip, ApiException, ValidationException

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

try:
    result = solver.recaptcha(
        sitekey=sitekey_from_dom,
        url="https://example.com/page-with-recaptcha",
    )
except ValidationException:
    # Caught locally: empty sitekey, malformed URL, missing argument.
    print("fix the values before sending")
except ApiException as e:
    # Came back from the API: GOOGLEKEY or PAGEURL rejected.
    print(f"rejected at submit: {e}")

A ValidationException API'ye hiç ulaşmadığınız anlamına gelir. Bu kodlardan birini taşıyan bir ApiException ise ulaştığınız ve değerin reddedildiği anlamına gelir. C#'ta aynı fikir, işi temel tür yapıyor:

using CapSkip;

var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);

try
{
    var result = await solver.RecaptchaAsync(sitekey, pageUrl);
}
catch (ApiException ex)
{
    // ERROR_GOOGLEKEY or ERROR_PAGEURL arrives here.
    Console.WriteLine(ex.Message);
}
catch (CapSkipError ex)
{
    // Everything else the SDK can throw.
    Console.WriteLine(ex.Message);
}

İki dakikalık kontrol listesi

  1. Gönderdiğiniz tam istek gövdesini yazdırın. Değişkenleri değil, gövdeyi.
  2. Parametre adını metotla karşılaştırın: googlekey reCAPTCHA için, sitekey Turnstile için.
  3. Değerin boş olmadığını ve sonunda satır sonu bulunmadığını doğrulayın.
  4. Sitekey'i canlı sayfadan yeniden okuyup gönderdiğinizle karşılaştırın.
  5. Şunun: pageurl şunlarla başladığını doğrulayın: http:// veya https://.
  6. Sayfa URL'sinde sorgu dizesi varsa çağrıyı POST'a çevirin.

Birinci adım bunu diğer beşinin toplamından daha sık çözer, çünkü uyumsuzluk genelde ne gönderdiğinizi sandığınız ile hatta gerçekte gidenin arasındadır.

Yakın kodlar ve onların anlamları

KodAnlamı
ERROR_WRONG_USER_KEYAPI anahtarı eksik ya da boş; bu ikisinden önce kontrol edilir
ERROR_WRONG_METHODThe method veya action değeri API'nin bildiği değerlerden biri değil
ERROR_BAD_PARAMETERSO metot için zorunlu bir parametre tamamen eksik
ERROR_CAPTCHA_UNSOLVABLEGönderim tuttu, çözüm tutmadı. Yoklama anı, gönderim anı değil
CAPCHA_NOT_READYHata değil. Aynı ID'yi yoklamaya devam edin

Her kod ve tam ifadesi şurada listeli: API dokümantasyonu.

Sık sorulan sorular

ERROR_GOOGLEKEY sonrası tekrar denemeli miyim?

Hayır. Aynı değerler her seferinde aynı şekilde reddedilir, bu yüzden bir yeniden deneme döngüsü yalnızca zaman harcar ve asıl sorunu gizler. Değeri düzeltin, sonra bir kez gönderin. Yeniden deneme, gönderim anındaki değil yoklama anındaki bir başarısızlığın doğru cevabıdır.

Sitekey'im doğru ama yine de reddediliyor. Şimdi ne olacak?

Önce görünmez hasara bakın: komut ikamesinden gelen sondaki satır sonu, yapılandırma dosyasından gelen tırnaklar ya da sabit genişlikli bir veritabanı sütununun kırptığı bir değer. Gönderdiğiniz dizenin uzunluğunu yazdırın. Standart bir reCAPTCHA sitekey'i 40 karakterdir, daha kısası bir yerde kırpılmış demektir.

pageurl'ün herkese açık erişilebilir olması şart mı?

Hayır. Widget'ın hangi sayfaya ait olduğunu belirtir, bu yüzden girişin arkasındaki bir sayfa da olur. Olamayacağı şey bir yer tutucudur: widget'ı barındıran alan adı yerine başkasını göndermek, gönderim başarılı olsa bile sitenin reddedeceği bir token üretir.

Turnstile çözümleri hiç ERROR_GOOGLEKEY döndürür mü?

Döndürmemeli, çünkü şu metot: turnstile hiçbir zaman şu parametreyi okumaz: googlekey . Bir Turnstile çağrısından geri geliyorsa bu neredeyse her zaman şunun: method kopyalanmış bir istekten kalma şu değere ayarlı olduğunu gösterir: userrecaptcha . Metodu düzeltin, sonra şunu gönderin: sitekey yerine googlekey.

Özet

Şunu error_googlekey ve ERROR_PAGEURL yazım hatası gibi görün, başarısızlık gibi değil. Görev oluşturulmadı, deneme yapılmadı ve tekrarlanacak bir şey yok. Parametre adını metotla karşılaştırın, sitekey'i sabit yerine canlı DOM'dan okuyun ve sayfa URL'sini şemasıyla birlikte gönderin. Her metot için tam parametre tabloları şu sayfada: reCAPTCHA çözücü sayfası.

Bunu ayıklamak, yerel çalışan bir sınırsız captcha çözücü ile ucuzdur. Reddedilen gönderimler kredi yakmaz ve kota tüketmez, bu yüzden hangi karakterin yanlış olduğunu daralttığınız sırada aynı isteği yirmi kez ateşleyebilirsiniz.