Cara Memperbaiki ERROR_WRONG_USER_KEY dan 3 Error Request Lainnya

error_wrong_user_key - How to Fix ERROR_WRONG_USER_KEY and 3 Request Errors

error_wrong_user_key berarti kunci API Anda tidak pernah keluar dari kode Anda. Itulah keseluruhan diagnosisnya, dan itu layak dinyatakan di awal karena hampir semua orang membacanya sebagai “kunci saya salah” lalu mulai menempelkan kunci baru. CapSkip punya kode tersendiri untuk kunci yang memang salah. error_wrong_user_key, dan tiga kode yang berdampingan dengannya, dikembalikan bahkan sebelum solver sempat melihat sebuah CAPTCHA: kode-kode itu menggambarkan bentuk request HTTP yang Anda kirim, bukan tantangan yang menjadi pokok request itu.

Empat kode itu, dan satu kode yang sering tertukar dengannya

Kode-kode ini kembali dari endpoint pengiriman atau endpoint polling sebagai teks biasa, menggantikan balasan OK yang biasanya muncul. Semuanya bersifat deterministik. Mengulang request yang identik menghasilkan jawaban yang identik, jadi loop percobaan ulang di sekitar salah satu kode ini hanya membuang waktu. Baris kedua di bawah ini adalah kode serumpun yang bukan bagian dari keempat kode itu, karena membedakan keduanya adalah sebagian besar dari pekerjaannya.

KodeArti resmiApa artinya dalam praktik
ERROR_WRONG_USER_KEYKunci API hilang atau kosongParameter key tidak ada, atau ada tetapi nilainya kosong
ERROR_KEY_DOES_NOT_EXISTKunci API tidak validSebuah kunci sampai, dan CapSkip tidak mengenalinya
ERROR_WRONG_METHODMethod HTTP atau parameter action tidak validNilai method bukan yang dikenal CapSkip, atau action bukan get
ERROR_WRONG_ID_FORMATFormat ID captcha tidak validid yang Anda pakai untuk polling bukan angka polos
ERROR_BAD_PARAMETERSParameter wajib hilang atau tidak validKolom wajib untuk tipe CAPTCHA tersebut tidak ada atau salah bentuk

Daftar lengkapnya, termasuk kode untuk unggahan gambar dan kode khusus reCAPTCHA, ada di dokumentasi API CapSkip.

ERROR_WRONG_USER_KEY: kuncinya tidak ada, bukan salah

Hilang dan tidak valid adalah dua bug berbeda dengan dua perbaikan berbeda, dan CapSkip memisahkannya dengan sengaja. Jika sebuah kunci sampai ke server lalu tidak dikenali, Anda mendapat error_key_does_not_exist, yang diuraikan di panduan untuk kode tersebut. Jika yang Anda dapat justru error_wrong_user_key, berarti tidak ada apa pun yang bisa dikenali yang sampai, jadi berhentilah memeriksa nilainya dan mulailah memeriksa apakah nilai itu benar-benar terkirim.

# No key parameter at all. This is what produces it.
curl -X POST \
  -d "method=userrecaptcha" \
  -d "googlekey=YOUR_SITEKEY" \
  -d "pageurl=https://example.com/page-with-recaptcha" \
  http://127.0.0.1:8080/in.php

ERROR_WRONG_USER_KEY

Ada empat hal yang menyebabkannya, kira-kira berurutan dari yang paling sering terjadi:

  • Variabel lingkungan yang tidak disetel di tempat kodenya dijalankan. Versi klasiknya adalah shell yang memilikinya sementara service yang menjalankan kode tidak. Nilainya terbaca sebagai string kosong dan client mengirim key tanpa apa pun setelahnya.
  • Kunci yang dibaca dari file konfigurasi yang tidak ikut di-deploy bersama kodenya.
  • Client buatan sendiri yang hanya menambahkan key ketika sebuah variabel bernilai truthy, sehingga string kosong diam-diam menghilangkan parameternya.
  • Client yang menaruh parameter di tempat yang tidak akan dibawa oleh request, misalnya body JSON pada endpoint yang membaca kolom formulir.

Cetak panjang nilainya sebelum panggilan, bukan nilainya. Panjang nol sudah memberi tahu apa yang Anda butuhkan dan tidak menaruh kredensial di file log.

Mengapa ini baru mulai terjadi ketika berjalan di server

Ini bagian yang membingungkan orang yang sudah menjalankan kode yang sama selama berbulan-bulan. CapSkip mewajibkan kunci hanya ketika Validasi Kunci API dinyalakan di aplikasinya. Pada instalasi lokal yang baru, fitur itu mati, jadi request tanpa kunci sama sekali tetap diterima dan tidak ada yang mengeluh. Client Anda bisa saja sudah mengirim kunci kosong sejak hari Anda menulisnya.

Lalu Anda memindahkan solver ke mesin yang bukan komputer di meja Anda. CapSkip punya dua mode koneksi: Local mengikat ke 127.0.0.1 dan hanya melayani perangkat itu, sedangkan Server mengikat ke IP jaringan atau IP publik Anda sehingga mesin lain, sebuah VPS atau worker terkelola bisa menjangkaunya lewat API. IP publik statis menjaga alamatnya tetap stabil. Keduanya dijelaskan di bagian pengaturan koneksi. Menyalakan validasi kunci ketika Anda melakukan perpindahan itu adalah langkah yang tepat, dan itu juga momen ketika setiap bug kunci yang terpendam di kode Anda muncul sekaligus. Perangkat kerasnya tetap milik Anda dan tetap tanpa batas pemakaian, jadi ini perubahan konfigurasi, bukan perubahan pada apa yang Anda bayar.

Jika Anda membagikan kunci ke beberapa worker, beri masing-masing kunci miliknya sendiri agar satu kunci bisa dicabut tanpa mengusik sisanya. Sisi itu dibahas di panduan penyediaan kunci API CAPTCHA.

ERROR_WRONG_ID_FORMAT: Anda kemungkinan mengirim seluruh balasannya

Yang satu ini punya satu penyebab dominan dan mudah dikenali begitu Anda tahu. Endpoint pengiriman tidak menjawab dengan angka polos. Ia menjawab dengan OK dan id yang dipisahkan oleh tanda pipa, dan client yang meneruskan string itu langsung ke request polling akan mengirim id yang bukan angka.

# What in.php actually returns:
OK|212

# Wrong. The whole reply went into id.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=OK|212"
ERROR_WRONG_ID_FORMAT

# Right. Split on the pipe and send the number.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=212"

Minta JSON dan proses parsing-nya menjadi lebih kokoh, karena id datang sebagai sebuah kolom, bukan sebagai separuh dari string yang dipisahkan pembatas. Bagaimanapun juga, periksa awalannya sebelum Anda memisah string itu, karena kode error tidak mengandung tanda pipa dan memisah secara membabi buta akan mengembalikan kode error itu sendiri sebagai id.

# A hand rolled client has to do this itself. The SDK does not,
# which is most of why it is worth using.
reply = httpx.post(IN_URL, data=payload).text     # "OK|212"

if not reply.startswith("OK|"):
    raise RuntimeError(reply)                     # it is an error code

captcha_id = reply.split("|", 1)[1]               # "212"

Contoh nyata dari siklus request dan polling mentah, dengan penanganan pembatas yang sama, ada di panduan langkah demi langkah memecahkan CAPTCHA dengan curl.

ERROR_WRONG_METHOD: verb yang salah, atau kata yang salah

Dua kesalahan yang berbeda berbagi kode ini, itulah sebabnya kode ini terasa kabur. Yang pertama adalah verb HTTP: parameter yang dikirim sebagai body formulir ke endpoint yang Anda panggil dengan GET tidak sampai ke mana-mana. Yang kedua adalah parameter method itu sendiri, yang harus berupa salah satu nilai yang dikenali CapSkip untuk tipe yang sedang Anda pecahkan: post atau base64 untuk gambar, userrecaptcha untuk reCAPTCHA di kedua versinya, turnstile untuk Cloudflare, geetest untuk GeeTest v3.

Dua kesalahan ejaan menyumbang sebagian besar kasusnya: mengirim sitekey ke endpoint reCAPTCHA, yang sebenarnya menginginkan googlekey, dan mengirim recaptcha atau userecaptcha alih-alih userrecaptcha. Kode yang sama juga mencakup sisi polling, tempat action harus berupa string literal get.

ERROR_BAD_PARAMETERS: tipenya dan kolom-kolomnya tidak cocok

Method-nya sudah dipahami tetapi ada sesuatu yang diwajibkan untuknya yang hilang atau salah bentuk. Ini berlaku per tipe, jadi pertanyaan yang berguna selalu: tipe mana yang menurut CapSkip Anda minta.

  • reCAPTCHA membutuhkan googlekey dan pageurl sekaligus, dan pageurl harus berupa URL lengkap halaman tempat widget-nya dimuat, termasuk skemanya.
  • reCAPTCHA v3 membutuhkan version disetel ke v3. Mengirimkan invisible bersamanya berarti menaruh kolom v2 di dalam request v3.
  • Halaman tantangan Turnstile membutuhkan data dan pagedata selain sitekey. Mode widget tidak membutuhkan keduanya.
  • GeeTest membutuhkan gt dan challenge bersamaan, dan challenge kedaluwarsa dalam sekitar satu menit, jadi nilai yang sudah basi gagal di sini, bukan belakangan.
  • CAPTCHA gambar membutuhkan file untuk unggahan multipart atau body untuk base64, dan tidak pernah keduanya sekaligus.

Catat payload yang akan Anda kirim, dengan kuncinya disamarkan, lalu bacalah sambil membandingkannya dengan tabel parameter untuk tipe tersebut. Sembilan dari sepuluh kali jawabannya sudah terlihat di satu baris itu.

Respons kosong bukan termasuk kelompok ini

Polling yang sama sekali tidak mengembalikan apa pun adalah situasi yang berbeda, dan layak disebut namanya karena balasan kosong kerap disalahartikan sebagai id yang buruk. Body kosong berarti hasilnya sudah pernah diambil, atau id-nya memang tidak ada. CapSkip hanya mengizinkan Anda membaca sebuah hasil satu kali. Loop percobaan ulang yang berhasil, lalu mengulang lagi karena kodenya lupa break, membaca string kosong pada kali kedua dan melaporkan kegagalan pada CAPTCHA yang sebenarnya sudah dipecahkan dengan benar.

Simpan hasilnya begitu Anda mendapatkannya untuk pertama kali. Dan jangan mengacaukan respons kosong dengan CAPCHA_NOT_READY, yang merupakan status polling normal alih-alih sebuah kegagalan, dan dijelaskan di panduan untuk respons tersebut.

Membaca kode-kode ini dari SDK

Keempat kode itu datang sebagai ApiException, dengan kode error sebagai pesannya. Itulah exception yang pertama harus Anda periksa, karena artinya CapSkip memahami permintaan Anda lalu menolaknya, dan itu kelas masalah yang berbeda dari tidak bisa menjangkau CapSkip sama sekali.

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

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

try:
    token = solver.recaptcha(sitekey=SITEKEY, url=PAGE_URL)["code"]
except ApiException as err:
    # CapSkip answered and rejected the request. Do not retry.
    print("Rejected:", err)
except NetworkException as err:
    # CapSkip did not answer. Wrong host, wrong port, or not running.
    print("Unreachable:", err)

ValidationException juga layak diketahui di sini, karena ia terpicu sebelum apa pun dikirim. SDK menolak parameter yang salah untuk tipe yang Anda minta, sehingga kesalahan yang lewat HTTP mentah akan kembali sebagai ERROR_BAD_PARAMETERS justru tertangkap secara lokal, dengan pesan yang menyebut nama argumennya. SDK ini punya empat tipe exception secara keseluruhan: ApiException, NetworkException, TimeoutException dan ValidationException. Masing-masing diturunkan dari kelas dasar bernama CapSkipError jika Anda lebih suka menanganinya di satu tempat. Keempatnya juga ada di client Node.js, PHP dan C#, yang didaftar di halaman SDK pemecahan CAPTCHA.

FAQ

Apa perbedaan antara ERROR_WRONG_USER_KEY dan ERROR_KEY_DOES_NOT_EXIST?

Perbedaannya adalah apakah sebuah kunci sampai atau tidak. Yang pertama berarti parameter key hilang atau kosong, jadi periksa konfigurasi dan pembangun request Anda. Yang kedua berarti sebuah kunci sampai tetapi CapSkip tidak mengenalinya, jadi periksa nilainya dan periksa kunci mana yang sebenarnya diterbitkan oleh aplikasinya.

Apakah saya benar-benar butuh kunci API?

Hanya ketika Validasi Kunci API dinyalakan di aplikasi CapSkip. Secara bawaan fitur ini mati, dan itu tidak masalah pada mesin tempat solver hanya melayani loopback. Nyalakan sebelum solver mendengarkan di alamat jaringan, dan kirimkan kunci sejak saat itu.

Apakah saya perlu mencoba ulang salah satu dari kode ini?

Tidak. Keempatnya deterministik, jadi percobaan kedua gagal persis seperti yang pertama. Coba ulang kegagalan yang bersifat sementara saja: error koneksi, timeout polling, atau CAPTCHA yang kembali sebagai tidak terpecahkan. Mencoba ulang request yang salah bentuk hanya menghabiskan jatah backoff Anda untuk sebuah bug.

Semuanya berjalan baik secara lokal tetapi rusak di server. Kenapa?

Hampir selalu karena validasi kunci ikut dinyalakan bersamaan dengan perpindahan itu, sementara kuncinya memang tidak pernah benar-benar terkirim. Penyebab paling umum kedua adalah variabel lingkungan yang ada di shell Anda tetapi tidak ada di service yang menjalankan kodenya. Periksa panjang nilainya tepat di titik pemanggilan.

Versi singkatnya

Keempat kode ini berbicara tentang request Anda, bukan tentang CAPTCHA-nya. error_wrong_user_key berarti tidak ada apa pun yang sampai di parameter key, dan itu masalah konfigurasi, bukan nilai yang salah. ERROR_WRONG_ID_FORMAT hampir selalu berarti balasan yang dipisahkan tanda pipa ikut masuk secara utuh. ERROR_WRONG_METHOD berarti verb yang salah atau ejaan yang salah, dan ERROR_BAD_PARAMETERS berarti kolom yang tidak termasuk dalam tipe yang Anda minta. Tidak satu pun dari kode ini layak dicoba ulang.

Tabel parameter yang menuntaskan semua persoalan ini ada di halaman dokumentasi API. Client Python yang menghilangkan sebagian besar peluang untuk salah ada di halaman pemecah CAPTCHA Python.

Layak diingat saat Anda melakukan debugging: CapSkip adalah bypass captcha alat yang berjalan di perangkat keras Anda sendiri, jadi request salah bentuk yang Anda kirim seratus kali sambil mencari solusinya tidak memakan biaya apa pun selain waktu.