Cara Memperbaiki ERROR_CAPTCHA_UNSOLVABLE dan Mencoba Lagi dengan Aman

error_captcha_unsolvable - How to Fix ERROR_CAPTCHA_UNSOLVABLE and Retry Safely

Jawaban singkat: ERROR_CAPTCHA_UNSOLVABLE berarti pemecah menerima tugas Anda, mencobanya, dan tidak dapat menghasilkan jawaban. Kunci Anda baik-baik saja, penyiapan Anda baik-baik saja, dan satu percobaan ini gagal. Perbaikan yang terdokumentasi adalah mengirimkan baru tugas dan mencoba lagi, bukan melakukan polling ulang pada ID captcha yang sama. Panduan ini membahas mengapa polling ulang tidak pernah berhasil, apa yang sebenarnya menyebabkan kegagalan untuk setiap tipe CAPTCHA, dan perulangan retry yang tidak berputar selamanya.

Apa arti error tersebut, dan dari mana asalnya

Tidak seperti error kunci atau parameter, yang satu ini tidak muncul saat pengiriman. Panggilan /in.php Anda berhasil dan mengembalikan sebuah ID. Kegagalannya baru muncul kemudian, saat Anda melakukan polling /res.php untuk mendapatkan hasilnya.

# Submit: this part worked, you got an ID back
curl "http://127.0.0.1:8080/in.php?key=YOUR_API_KEY&method=userrecaptcha&googlekey=YOUR_SITEKEY&pageurl=https://example.com/page-with-recaptcha"
OK|2122988149

# Poll: the attempt finished, and it finished badly
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149"
ERROR_CAPTCHA_UNSOLVABLE

Jadi urutannya memberi tahu Anda sesuatu yang berguna. Semua hal hingga dan termasuk pengiriman sudah benar. Masalahnya ada pada apa yang Anda kirim, bukan pada cara Anda mengirimnya.

Mengapa mengulang dengan ID yang sama tidak pernah membantu

Dua alasan, dan keduanya bersifat struktural.

Pertama, percobaan itu sudah berakhir. Hasil untuk ID tersebut bersifat final, dan melakukan polling lagi tidak memulai percobaan kedua. Kedua, hasil hanya dapat dibaca satu kali. Setelah Anda membaca sebuah hasil dari /res.php, ID itu tidak punya apa-apa lagi untuk Anda.

Jika penanganan error Anda berulang pada ID yang sama setelah kegagalan, ia akan terus berulang sampai batas waktu Anda tercapai lalu melaporkan timeout, yang membuat Anda menelusuri masalah yang keliru. Retry berarti memanggil /in.php lagi dan mendapatkan ID baru. Ini kebalikan dari CAPCHA_NOT_READY, di mana langkah yang benar adalah terus melakukan polling pada ID yang Anda miliki.

Apa penyebab sebenarnya, menurut jenis CAPTCHA

CAPTCHA gambar: masalahnya biasanya ada pada input

Pemecahan gambar adalah tipe di mana input yang benar-benar tidak terpecahkan itu umum, karena Andalah yang mengendalikan pikselnya. Periksa filenya sebelum menyalahkan pemecah.

  • Batas ukuran. Lebih dari 600 kB atau lebih dari 1000px pada dimensi mana pun akan mengembalikan ERROR_TOO_BIG_CAPTCHA_FILESIZE alih-alih error ini, tetapi gambar yang mendekati batas tersebut sering kali merupakan tangkapan layar satu halaman penuh.
  • Anda memotong area yang salah. Potongan gambar yang menyertakan label, garis tepi, atau separuh field berikutnya jauh lebih sulit dibaca daripada CAPTCHA-nya saja.
  • Anda menyimpan placeholder-nya. Mengambil URL gambar secara terpisah sering mengembalikan CAPTCHA baru yang berbeda, atau yang sudah kedaluwarsa, atau piksel 1×1. Tangkap byte yang sudah dimiliki browser.
  • Format. Format yang rusak atau tidak terduga menghasilkan ERROR_INVALID_IMAGE, dan data URI yang salah format menghasilkan ERROR_INVALID_BASE64.

Simpan byte persis yang Anda kirim ke disk lalu buka. Separuh dari semua kegagalan gambar terlihat dalam dua detik. Halaman pemecah CAPTCHA gambar mencantumkan bentuk masukan yang diterima: path berkas, URL jarak jauh, atau data:image/png;base64, URI.

reCAPTCHA: sitekey usang atau URL halaman yang salah

Sitekey yang dibaca dari sumber halaman yang di-cache, atau disalin dari lingkungan staging, akan terkirim mulus lalu gagal. Begitu pula pageurl yang tidak cocok dengan halaman tempat widget sebenarnya berada, termasuk skema yang hilang atau redirect yang tidak Anda ikuti.

Enterprise adalah penyebab umum lainnya. Jika situs menjalankan reCAPTCHA Enterprise dan Anda mengirim tanpa enterprise flag tersebut, tugasnya dipecahkan terhadap konfigurasi yang salah. Sama untuk v3: teruskan version, dan berikan nilai action asli situs tersebut, bukan nilai default verify.

Tidak ada opsi skor minimum di CapSkip, jadi jika Anda memindahkan kode dari layanan lain, hapus setiap min_score atau minScore parameter. Ini bukan penyebab error tersebut, tetapi ia juga tidak akan melakukan apa yang Anda harapkan.

Turnstile: halaman challenge membutuhkan lebih dari sekadar sitekey

Turnstile widget memerlukan sitekey dan URL. Halaman challenge penuh juga memerlukan data (nilai cData) dan pagedata (chlPageData), keduanya dibaca dari halaman pada saat itu juga. Kirimkan halaman tantangan seolah-olah itu sebuah widget dan Anda mendapatkan tugas yang tidak dapat diselesaikan pemecah. Kedua nilai itu berumur pendek, jadi ambil keduanya tepat sebelum mengirim.

GeeTest: challenge yang kedaluwarsa biasanya jadi jawabannya

The gt nilainya statis per situs. challenge bersifat sekali pakai dan kedaluwarsa dalam waktu sekitar satu menit. Jika Anda mengambil sebuah tantangan, mengerjakan hal lain, lalu mengirimkannya, tantangan itu bisa jadi sudah mati. Ambil tepat sebelum pemecahan. Detailnya ada di pemecah GeeTest halaman.

Loop percobaan ulang yang benar-benar mengulang

Kirim lagi, batasi jumlah percobaan, dan beri jeda di antaranya. Tiga percobaan adalah batas yang masuk akal: jika sebuah target gagal pada tiga pengiriman baru, berarti masukannya salah dan percobaan keempat tidak akan memperbaikinya.

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

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

def solve_with_retry(sitekey, url, attempts=3):
    for n in range(attempts):
        try:
            # A fresh call means a fresh task, which is the fix.
            return solver.recaptcha(sitekey=sitekey, url=url)
        except ApiException as e:
            if "UNSOLVABLE" not in str(e) or n == attempts - 1:
                raise
            time.sleep(2 ** n)   # 1s, then 2s

token = solve_with_retry("YOUR_SITEKEY", "https://example.com/page-with-recaptcha")
print(token["code"][:40])

Perhatikan apa yang tidak dilakukannya: ia tidak mengulang ValidationException, karena parameter yang salah akan gagal dengan cara yang sama setiap kali, dan ia tidak mencoba ulang NetworkException, karena itu berarti aplikasinya tidak dapat dijangkau dan semua target lain juga akan segera gagal.

Bentuk yang sama di Node.js:

// npm install capskip
const { CapSkip } = require('capskip');

const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });

async function solveWithRetry(sitekey, url, attempts = 3) {
  for (let n = 0; n < attempts; n++) {
    try {
      return await solver.recaptcha(sitekey, url);
    } catch (e) {
      const last = n === attempts - 1;
      if (last || !String(e).includes('UNSOLVABLE')) throw e;
      await new Promise(r => setTimeout(r, 1000 * 2 ** n));
    }
  }
}

Cara membuatnya lebih jarang terjadi

  • Baca sitekey dari DOM langsung, bukan dari konstanta di dalam kode Anda. Situs merotasinya.
  • Kirim URL yang benar-benar Anda buka, setelah redirect, dengan skema disertakan.
  • Ambil nilai berumur pendek paling akhir. Challenge GeeTest dan cData Turnstile basi dalam waktu kurang dari satu menit.
  • Potong gambar seketat mungkin dan kirim byte yang sudah dimuat oleh halaman tersebut.
  • Catat captcha ID pada setiap kegagalan. Ini membuat polanya terlihat: satu target yang bermasalah versus masalah umum.
  • Uji lebih dulu pada halaman yang sudah pasti bekerja. Jika halaman yang biasanya berhasil juga gagal, masalahnya ada pada lingkungan Anda, bukan pada targetnya.

Kode error di sekitarnya

Inilah yang sering dikira orang sebagai tugas yang tidak dapat dipecahkan. Artinya berbeda-beda dan perbaikannya pun berbeda.

KodeBerartiApa yang harus dilakukan
CAPCHA_NOT_READYMasih diprosesTerus polling ID yang sama
ERROR_INVALID_IMAGEFormatnya salah atau datanya rusakSimpan ulang gambarnya dan periksa byte-nya
ERROR_TOO_BIG_CAPTCHA_FILESIZELebih dari 600 kB, atau lebih dari 1000pxPotong hingga hanya CAPTCHA-nya
ERROR_INVALID_BASE64Payload base64 tidak dapat didekodeHapus prefiks data URI atau perbaiki padding
ERROR_UPLOADTidak ada data gambar yang diterimaPeriksa nama kolom dan isi permintaannya
ERROR_GOOGLEKEYSitekey langsung ditolakBaca ulang dari halaman yang sedang aktif
ERROR_PAGEURLURL halaman hilang atau formatnya salahKirim URL lengkap termasuk skemanya

Setiap kode yang dapat dikembalikan API, beserta arti persisnya, ada di dokumentasi API.

Pertanyaan yang sering diajukan

Apakah pemecahan yang gagal dikenai biaya?

Tidak. Tidak ada biaya per pemecahan dan tidak ada saldo, karena pekerjaannya terjadi di komputer Anda sendiri. Mencoba ulang hanya menghabiskan waktu dan CPU Anda, tidak lebih, itulah sebabnya perulangan tiga percobaan masuk akal di sini.

Bisakah saya mendapatkan hasilnya lagi setelah membacanya sekali?

Tidak. Hasil hanya dapat dibaca satu kali. Simpan token begitu Anda menerimanya, dan anggap pembacaan kedua atas ID yang sama sebagai bug di kode Anda, bukan cara untuk memulihkannya.

Apakah proxy dapat memperbaiki CAPTCHA gambar yang tidak terpecahkan?

Tidak bisa. Proxy hanya berlaku untuk reCAPTCHA, Turnstile dan GeeTest, bukan untuk pemecahan gambar. Tugas gambar dinilai sepenuhnya dari piksel yang Anda kirim, jadi perbaiki potongan gambarnya.

Setiap tugas di satu situs gagal. Apakah itu tetap error ini?

Biasanya ini satu konstanta salah yang diterapkan di mana-mana: sitekey yang usang, tidak adanya enterprise flag, atau halaman tantangan yang dikirim sebagai widget. Perbaiki targetnya sekali dan seluruh rangkaiannya mulai lolos.

Ringkasan

Perlakukan error_captcha_unsolvable sebagai vonis atas tugas yang Anda kirimkan. Jangan melakukan polling pada ID lama. Kirimkan yang baru, batasi percobaan hingga tiga kali, dan habiskan waktu debugging pada masukannya: sitekey, URL halaman, potongan gambar, dan apa pun yang berumur pendek yang Anda ambil terlalu awal.

Hal menyenangkan dari menjalankan pemecah captcha lokal adalah bahwa ini kegagalan yang murah. Tidak ada kredit yang terbakar, tidak ada batas laju yang terpakai, dan Anda dapat mengulang tugas yang sama sebanyak yang diperlukan untuk mengetahui nilai mana yang salah.