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

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
| Kod | Belgelenen anlamı | Hangi parametre |
|---|---|---|
ERROR_GOOGLEKEY | Geçersiz googlekey parametresi geçersiz | Sayfadan okuduğunuz sitekey |
ERROR_PAGEURL | Geçersiz pageurl parametresi geçersiz | Widget'ı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öntem | Anahtar parametresi | Yanlış ad şunu verir: |
|---|---|---|
userrecaptcha | googlekey | ERROR_GOOGLEKEY |
turnstile | sitekey | ERROR_BAD_PARAMETERS |
geetest | gt artı challenge | ERROR_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,nameya 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/loginbir URL değil. Şunu gönderin:https://example.com/login. - Göreli yol.
/loginkazı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
- Gönderdiğiniz tam istek gövdesini yazdırın. Değişkenleri değil, gövdeyi.
- Parametre adını metotla karşılaştırın:
googlekeyreCAPTCHA için,sitekeyTurnstile için. - Değerin boş olmadığını ve sonunda satır sonu bulunmadığını doğrulayın.
- Sitekey'i canlı sayfadan yeniden okuyup gönderdiğinizle karşılaştırın.
- Şunun:
pageurlşunlarla başladığını doğrulayın:http://veyahttps://. - 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ı
| Kod | Anlamı |
|---|---|
ERROR_WRONG_USER_KEY | API anahtarı eksik ya da boş; bu ikisinden önce kontrol edilir |
ERROR_WRONG_METHOD | The method veya action değeri API'nin bildiği değerlerden biri değil |
ERROR_BAD_PARAMETERS | O metot için zorunlu bir parametre tamamen eksik |
ERROR_CAPTCHA_UNSOLVABLE | Gönderim tuttu, çözüm tutmadı. Yoklama anı, gönderim anı değil |
CAPCHA_NOT_READY | Hata 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.
