Cara Memperbaiki ERROR_GOOGLEKEY dan ERROR_PAGEURL Saat Pengiriman

Jawaban singkat: ERROR_GOOGLEKEY berarti nilai googlekey yang Anda kirim ditolak, dan ERROR_PAGEURL berarti nilai pageurl yang Anda kirim ditolak. Keduanya dikembalikan oleh /in.php pada tahap pengiriman, jadi tidak ada tugas yang dibuat dan tidak ada ID captcha untuk di-polling. Sembilan dari sepuluh kasus disebabkan oleh nama parameter: reCAPTCHA meminta googlekey, Turnstile meminta sitekey, dan mengirim yang keliru menghasilkan persis error ini. Berikut cara membedakan keduanya dan memperbaiki masing-masing.
Apa yang sebenarnya diperiksa oleh kedua kode ini
| Kode | Arti menurut dokumentasi | Parameter yang mana |
|---|---|---|
ERROR_GOOGLEKEY | Tidak valid googlekey parameter tidak valid | Sitekey yang Anda baca dari halaman |
ERROR_PAGEURL | Tidak valid pageurl parameter tidak valid | URL halaman tempat widget itu berada |
Keduanya adalah kegagalan validasi, bukan kegagalan pemecahan. Belum ada yang dicoba, dan tidak ada yang masuk antrean.
Saat pengiriman, bukan saat polling
Perbedaan ini menghemat banyak waktu debugging. API punya dua tahap, dan masing-masing menghasilkan keluarga error-nya sendiri.
# 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
Bandingkan dengan pengiriman yang sehat, yang mengembalikan OK|2122988149 lalu gagal, kalau memang gagal, pada /res.php. Kegagalan pada tahap polling berarti parameter Anda diterima dan pemecahannya sendiri yang tidak berhasil, dan itu penyelidikan yang sama sekali berbeda. Lihat ERROR_CAPTCHA_UNSOLVABLE untuk kasus itu, dan ERROR_KEY_DOES_NOT_EXIST , jika kuncinya sendiri sudah ditolak sebelum kedua pemeriksaan berjalan.
Mengapa nilainya ditolak
Tiga penyebab mencakup hampir semua kasus ini, dengan urutan berikut.
Penyebab satu: googlekey versus sitekey
API yang kompatibel dengan 2captcha memakai nama parameter berbeda untuk tiap metode, dan keduanya tidak bisa saling menggantikan.
| Metode | Parameter kunci | Nama yang salah akan memberi Anda |
|---|---|---|
userrecaptcha | googlekey | ERROR_GOOGLEKEY |
turnstile | sitekey | ERROR_BAD_PARAMETERS |
geetest | gt plus challenge | ERROR_BAD_PARAMETERS |
Jebakannya, dalam percakapan semua orang menyebut nilai ini sitekey, dan atribut HTML-nya memang secara harfiah bernama data-sitekey baik untuk reCAPTCHA maupun Turnstile. Hanya parameter pengiriman reCAPTCHA yang dinamai menurut Google. Jika Anda menyalin panggilan Turnstile yang berfungsi lalu mengubah method ke userrecaptcha, inilah bug Anda.
SDK menyembunyikan perbedaan ini sepenuhnya. solver.recaptcha(sitekey, url) dan solver.turnstile(sitekey, url) menerima argumen pertama yang sama dan memetakannya ke nama yang benar di jaringan untuk Anda, dan itu alasan bagus untuk memakainya.
Penyebab dua: kuncinya usang, terpotong atau kosong
Dengan asumsi nama parameternya sudah benar, nilai itu sendiri adalah tersangka berikutnya.
- Anda menuliskannya secara hardcode. Situs merotasi sitekey. Konstanta yang berfungsi bulan lalu bisa saja mati hari ini.
- Nilainya berasal dari sumber halaman yang tersimpan di cache. View-source di browser bisa menyajikan salinan yang lebih lama daripada yang benar-benar dipakai widget untuk merender.
- Anda mengambil atribut yang salah. Nilai ini berada di
data-sitekey, bukan diid,nameatau pada atribut iframetitle. - Sebuah variabel shell ikut membawa karakter baris baru. Substitusi perintah mempertahankan spasi di akhir, dan spasi bukan bagian dari kunci yang valid.
- Nilainya kosong. Variabel yang tidak diset akan berkembang menjadi kosong, dan permintaannya terkirim dengan
googlekey=.
Baca nilainya dari DOM yang hidup alih-alih memercayai sebuah konstanta:
// 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= sebagai fallback penting di situs yang merender widget lewat JavaScript dan tidak pernah meninggalkan elemen .g-recaptcha di dalam DOM.
Penyebab tiga: apa yang membuat pageurl tidak valid
ERROR_PAGEURL adalah masalah yang lebih sempit, dan biasanya bersifat mekanis.
- Tanpa skema.
example.com/loginbukan sebuah URL. Kirimhttps://example.com/login. - Path relatif.
/loginadalah yang ada di tangan scraper Anda, bukan yang dibutuhkan API. - Pemotongan GET. Jika URL halaman mengandung query string sendiri dan Anda mengirimnya lewat GET tanpa mengenkodenya, semua yang ada setelah ampersand pertama akan dibaca sebagai parameter panggilan API Anda. Gunakan POST, atau pakai
--data-urlencode. - Spasi atau tanda kutip. URL yang dibaca dari file konfigurasi bisa datang terbungkus tanda kutip yang tidak pernah dilepas.
URL itu tidak harus bisa dijangkau dari mesin yang menjalankan CapSkip, dan tidak harus URL yang pada akhirnya Anda kirimi form. URL itu harus halaman tempat widget disematkan, karena ke halaman itulah token diikat.
Bagaimana ini terlihat dari sebuah SDK
SDK memeriksa masalah yang sudah jelas sebelum apa pun meninggalkan proses Anda, dan meneruskan sisanya. Dua exception berbeda, dua perbaikan berbeda.
# 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 berarti Anda sama sekali tidak mencapai API. Sebuah ApiException yang membawa salah satu kode ini berarti Anda memang mencapainya, dan nilainya ditolak. Ide yang sama di C#, dengan tipe dasar yang mengerjakannya:
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);
}Daftar periksa dua menit
- Cetak isi permintaan persis seperti yang Anda kirim. Bukan variabelnya, melainkan isinya.
- Cocokkan nama parameter dengan metodenya:
googlekeyuntuk reCAPTCHA,sitekeyuntuk Turnstile. - Pastikan nilainya tidak kosong dan tidak ada karakter baris baru di akhirnya.
- Baca ulang sitekey dari halaman yang hidup dan bandingkan dengan yang Anda kirim.
- Pastikan
pageurldiawali denganhttp://atauhttps://. - Ubah panggilannya menjadi POST jika URL halaman punya query string.
Langkah pertama menyelesaikan masalah ini lebih sering daripada lima langkah lainnya digabungkan, karena ketidakcocokannya biasanya ada antara apa yang Anda kira Anda kirim dan apa yang benar-benar terkirim.
Kode-kode terdekat dan apa artinya
| Kode | Berarti |
|---|---|
ERROR_WRONG_USER_KEY | Kunci API tidak ada atau kosong, diperiksa sebelum keduanya |
ERROR_WRONG_METHOD | The method atau action nilainya bukan nilai yang dikenali API |
ERROR_BAD_PARAMETERS | Parameter wajib untuk metode itu sama sekali tidak ada |
ERROR_CAPTCHA_UNSOLVABLE | Pengiriman berhasil, pemecahannya tidak. Saat polling, bukan saat pengiriman |
CAPCHA_NOT_READY | Bukan error. Lanjutkan polling ID yang sama |
Setiap kode beserta rumusan persisnya tercantum di dokumentasi API.
Pertanyaan yang sering diajukan
Haruskah saya mencoba lagi setelah ERROR_GOOGLEKEY?
Tidak. Nilai yang sama akan ditolak dengan cara yang sama setiap kali, jadi loop percobaan ulang hanya membuang waktu dan menutupi masalah yang sebenarnya. Perbaiki nilainya, lalu kirim sekali saja. Mencoba ulang adalah respons yang tepat untuk kegagalan saat polling, bukan saat pengiriman.
Sitekey saya sudah benar tetapi tetap ditolak. Sekarang bagaimana?
Periksa dulu kerusakan yang tak terlihat: karakter baris baru di akhir dari substitusi perintah, tanda kutip dari file konfigurasi, atau nilai yang terpotong oleh kolom database berlebar tetap. Cetak panjang string yang Anda kirim. Sitekey reCAPTCHA standar panjangnya 40 karakter, jadi apa pun yang lebih pendek berarti terpotong di suatu tempat.
Apakah pageurl harus bisa diakses publik?
Tidak. Nilai itu menandai halaman tempat widget berada, jadi halaman di balik login pun berfungsi. Yang tidak boleh adalah placeholder: mengirim domain yang berbeda dari domain yang memuat widget akan menghasilkan token yang ditolak situs, bahkan ketika pengirimannya berhasil.
Apakah pemecahan Turnstile pernah mengembalikan ERROR_GOOGLEKEY?
Seharusnya tidak, karena metode turnstile tidak pernah membaca parameter googlekey . Kalau kode itu kembali dari panggilan Turnstile, hampir selalu artinya method masih diset ke userrecaptcha dari permintaan yang disalin. Perbaiki metodenya, lalu kirim sitekey alih-alih googlekey.
Ringkasan
Perlakukan error_googlekey dan ERROR_PAGEURL sebagai kesalahan ejaan, bukan sebagai kegagalan. Tidak ada tugas yang dibuat, tidak ada upaya yang dilakukan, dan tidak ada yang perlu diulang. Cocokkan nama parameter dengan metodenya, baca sitekey dari DOM yang hidup alih-alih dari sebuah konstanta, dan kirim URL halaman lengkap dengan skemanya. Tabel parameter lengkap untuk setiap metode ada di halaman pemecah reCAPTCHA halaman.
Melakukan debugging untuk ini murah pada pemecah captcha tanpa batas yang berjalan secara lokal. Pengiriman yang ditolak tidak membakar kredit dan tidak memakan kuota, jadi Anda bisa menembakkan permintaan yang sama dua puluh kali sambil mempersempit karakter mana yang keliru.
