Dokumentasi API

Referensi untuk endpoint yang tersedia, format permintaan, parameter, dan contoh respons untuk mengintegrasikan API ke dalam aplikasi Anda.

Dokumentasi ini ditujukan untuk pengembang yang ingin mengintegrasikan CapSkip langsung ke skrip, aplikasi, atau sistem otomatisasi mereka sendiri. Pengguna perangkat lunak pihak ketiga sebaiknya mengikuti bagian Tutorials untuk instruksi penyiapan.

CapSkip mengemulasi API layanan pemecahan CAPTCHA yang banyak dipakai, sehingga dapat terhubung ke perangkat lunak pihak ketiga yang kompatibel tanpa memerlukan modifikasi apa pun. Integrasi biasanya hanya memerlukan CapSkip dalam keadaan berjalan.

Dokumentasi ini menjelaskan cara mengirim permintaan dan mengambil hasil. CapSkip mendukung beberapa keluarga API, termasuk API gaya 2Captcha (in.php / res.php), API JSON createTask / getTaskResult yang digunakan oleh AntiCaptcha, CapMonster, CapSolver, NextCaptcha, dan EzCaptcha, serta REST API DeathByCaptcha. Layanan dalam keluarga yang sama berbagi endpoint, format permintaan, dan format respons yang sama. Hanya base URL (host dan port) yang berbeda untuk setiap layanan.

Keluarga APILayanan
gaya 2captcha2captcha.com, rucaptcha.com, solvecaptcha.com, captchas.io
JSON (createTask / getTaskResult)anti-captcha.com, capmonster.cloud, capsolver.com, nextcaptcha.com, ez-captcha.com
DeathByCaptchadeathbycaptcha.com

CAPTCHA Gambar

CAPTCHA biasa adalah gambar berisi teks terdistorsi tetapi masih terbaca manusia. Untuk memecahkannya, pengguna harus mengetik teks yang tampak pada gambar.

Untuk memecahkan CAPTCHA biasa, kirim gambar melalui permintaan HTTP POST ke endpoint API. Kirim permintaan langsung ke instance CapSkip Anda menggunakan alamat dan port lokal yang telah dikonfigurasi, misalnya: http://127.0.0.1:PORT/in.php

CapSkip menerima gambar dalam format multipart/form-data atau berkode Base64.

Contoh formulir multipart

<form method="post" action="http://127.0.0.1:PORT/in.php" enctype="multipart/form-data">
<input type="hidden" name="method" value="post">
Your key:
<input type="text" name="key" value="YOUR_APIKEY">
The CAPTCHA file:
<input type="file" name="file">
<input type="submit" value="Upload and get the ID">
</form>

YOUR_APIKEY mewakili API key Anda jika validasi API key diaktifkan di CapSkip. Jika validasi API key dinonaktifkan, nilai string apa pun akan diterima.

Contoh formulir Base64

<form method="post" action="http://127.0.0.1:PORT/in.php">
<input type="hidden" name="method" value="base64">
Your key:
<input type="text" name="key" value="YOUR_APIKEY">
The CAPTCHA file body in base64 format:
<textarea name="body">BASE64_FILE</textarea>
<input type="submit" value="Upload and get the ID">
</form>

YOUR_APIKEY mewakili API key Anda jika validasi API key diaktifkan di CapSkip. Jika validasi API key dinonaktifkan, nilai string apa pun akan diterima.

BASE64_FILE adalah data gambar yang dienkode Base64.

Daftar Parameter Permintaan POST
Parameter POST Tipe Wajib Deskripsi
key String Ya Kunci API CapSkip Anda.
method String Ya post: kirim gambar menggunakan multipart/form-data
base64: kirim gambar sebagai string berenkode Base64
file File Ya* File gambar CAPTCHA.
* Wajib saat method=post.
body String Ya* Data gambar CAPTCHA berenkode Base64.
* Wajib saat method=base64.
json Integer
Default: 0
Tidak 0: respons dikembalikan sebagai teks biasa
1: respons dikembalikan dalam format JSON

Kirim CAPTCHA (unggah file multipart):

curl -X POST -F "key=YOUR_API_KEY" -F "method=post" -F "[email protected]" http://127.0.0.1:8080/in.php

Kirim CAPTCHA (dienkode base64):

curl -X POST -d "key=YOUR_API_KEY&method=base64&body=BASE64_IMAGE_DATA" http://127.0.0.1:8080/in.php

Setelah mengirim permintaan, jika semuanya benar, CapSkip akan mengembalikan ID CAPTCHA sebagai teks biasa: OK|12345

Jika json=1 digunakan, respons akan dikembalikan dalam format JSON:

{
    "status":1,
    "request":"12345"
}

Tunggu 1 detik, lalu kirim permintaan HTTP GET ke endpoint hasil (/res.php) dengan ID CAPTCHA yang dikembalikan.

Jika CAPTCHA sudah terpecahkan, CapSkip akan mengembalikan hasilnya sebagai teks biasa: OK|TEXT

Jika json=1 ditentukan, responsnya akan berupa:

{
    "status":1,
    "request":"TEXT"
}

Jika CAPTCHA belum terpecahkan, CapSkip akan mengembalikan: CAPCHA_NOT_READY

Dalam kasus ini, tunggu 1 detik dan ulangi permintaan sampai hasil akhir diterima. Jika CapSkip mengembalikan body respons yang kosong, hasilnya sudah pernah diambil atau ID tersebut tidak ada. Setiap hasil hanya dapat dibaca satu kali.

Daftar parameter permintaan GET
Parameter GET Tipe Wajib Deskripsi
key String Ya Kunci API CapSkip Anda.
action String Ya get: ambil jawaban untuk CAPTCHA yang dikirimkan.
id Integer Ya ID CAPTCHA yang dikembalikan oleh in.php.
json Integer
Default: 0
Tidak 0: respons dikembalikan sebagai teks biasa
1: respons dikembalikan dalam format JSON
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

recaptcha v2 solver  reCAPTCHA V2

reCAPTCHA v2, yang juga dikenal sebagai reCAPTCHA “I’m not a robot”, adalah tipe CAPTCHA yang banyak digunakan. Pengunjung mencentang sebuah kotak, lalu Google langsung meloloskannya atau memintanya memilih gambar yang cocok sebelum formulir dapat dikirim.

Untuk memecahkan reCAPTCHA v2, kirim googlekey dan pageurl parameter bersama dengan method=userrecaptcha dan kunci API CapSkip Anda.

Anda bisa mendapatkan googlekey menggunakan salah satu metode berikut:

Klik kanan pada widget reCAPTCHA dan pilih Periksa. Temukan URL yang diawali dengan:

www.google.com/recaptcha/api2/anchor

Salin nilai dari k parameter dari URL tersebut. Sebagai alternatif, temukan data-sitekey atribut di kode sumber halaman dan salin nilainya.

CapSkip sitekey

Setelah Anda memiliki site key, kirim permintaan HTTP GET atau POST ke http://127.0.0.1:PORT/in.php

Daftar Parameter Permintaan POST
Parameter Tipe Wajib Deskripsi
key String Ya Kunci API CapSkip Anda.
method String Ya userrecaptcha: menentukan permintaan reCAPTCHA v2.
googlekey String Ya Nilai dari k atau data-sitekey parameter yang ditemukan di halaman target.
pageurl String Ya URL lengkap halaman tempat reCAPTCHA berada.
enterprise Integer
Default: 0
Tidak 1: menandakan reCAPTCHA Enterprise v2.
0: reCAPTCHA v2 standar.
invisible Integer
Default: 0
Tidak 1: menandakan Invisible reCAPTCHA.
0: reCAPTCHA checkbox standar.
data-s String Tidak Nilai dari data-s yang ditemukan pada halaman. Berlaku untuk Google Search dan layanan Google tertentu.
json Integer
Default: 0
Tidak 0: respons dikembalikan sebagai teks biasa.
1: respons dikembalikan dalam format JSON.
proxy String Tidak Alamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT
proxytype String Tidak Jenis proxy. Nilai yang didukung: HTTP, HTTPS, SOCKS5, SOCKS5H. Default: HTTP ketika proxy disediakan tetapi proxytype dihilangkan.

Kirim reCAPTCHA v2 (Standard):

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com" http://127.0.0.1:8080/in.php

Kirim reCAPTCHA v2 (Invisible):

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&invisible=1" http://127.0.0.1:8080/in.php

Kirim Enterprise reCAPTCHA v2:

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1" http://127.0.0.1:8080/in.php

Kirim Enterprise reCAPTCHA v2 (Invisible):

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1&invisible=1" http://127.0.0.1:8080/in.php

Jika permintaan berhasil, CapSkip akan mengembalikan ID CAPTCHA sebagai teks biasa: OK|12345

Jika json=1 digunakan, respons akan dikembalikan dalam format JSON:

{
    "status":1,
    "request":"12345"
}

Jika permintaan gagal, CapSkip akan mengembalikan kode error.

Tunggu 15 hingga 20 detik, lalu kirim permintaan HTTP GET ke endpoint hasil untuk mengambil solusinya: http://127.0.0.1:PORT/res.php

Daftar parameter permintaan GET
Parameter GET Tipe Wajib Deskripsi
key String Ya Kunci API CapSkip Anda.
action String Ya get: ambil jawaban untuk CAPTCHA yang dikirimkan.
id Integer Ya ID CAPTCHA yang dikembalikan oleh in.php.
json Integer
Default: 0
Tidak 0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON, termasuk nilai userAgent jika tersedia.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

Jika CAPTCHA telah dipecahkan, CapSkip akan merespons dalam teks biasa atau JSON dan mengembalikan token jawabannya. Token-nya akan terlihat seperti berikut:

03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB-50GQHPEBJUHNnhJyDzwRoRAkVzrf7UkV8wKCdTwrrWqiYDgbrzURfHc2ESsp020MicJTasSiXmNRgryt-gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3-egcplD1uLGh79wC34RF49Ui3eHwua4S9XHpH6YBe7gXzz6_mv-o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q

Setiap token disertai User-Agent browser yang digunakan untuk mendapatkannya. Dengan json=1 responsnya menyertakan userAgent sebagai kolom di samping request. Dalam mode teks biasa, baca nilai yang sama dari header X-Recaptcha-User-Agent yang ada di respons. Jika Anda menggunakan JSON API, getTaskResult mengembalikannya sebagai solution.userAgent. Kirim User-Agent ini saat Anda mengirim token, karena beberapa situs memeriksa bahwa keduanya cocok. Kolom dan header tersebut dihilangkan jika tidak ada User-Agent yang tersedia.

{
    "status": 1,
    "request": "03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq...",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}

Jika CAPTCHA belum terpecahkan, CapSkip akan mengembalikan CAPCHA_NOT_READY. Dalam kasus ini, tunggu 5 detik dan ulangi permintaan. Jika CapSkip mengembalikan body respons yang kosong, hasilnya sudah pernah diambil atau ID tersebut tidak ada. Setiap hasil hanya dapat dibaca satu kali.

Temukan elemen dengan ID g-recaptcha-response dan buat terlihat dengan menghapus display: none gaya.

g recaptcha response CapSkip

Harap diperhatikan: Dalam beberapa kasus, konten halaman dihasilkan secara dinamis, dan g-recaptcha-response element may not appear in the static HTML source. In such situations, inspect the page structure using your browser’s developer tools to locate the dynamically generated element.


Sebagai alternatif, Anda dapat menggunakan JavaScript untuk mengatur nilai dari g-recaptcha-response kolom secara langsung:

document.getElementById("g-recaptcha-response").innerHTML="TOKEN";

Sebuah kolom input akan muncul di halaman. Tempelkan token jawaban ke kolom itu lalu kirim formulirnya.

recaptcha v2 solver  reCAPTCHA V2 Callback

Dalam beberapa kasus, tidak ada tombol kirim dan sebagai gantinya digunakan fungsi callback. Fungsi callback dijalankan otomatis saat reCAPTCHA dipecahkan.

Daftar parameter permintaan POST dan GET tersedia di sini: Parameter permintaan POST dan GET reCAPTCHA V2

Fungsi callback biasanya didefinisikan di dalam data-callback atribut dari widget reCAPTCHA, misalnya:

data-callback="myCallbackFunction"

Dalam kasus lain, fungsi callback didefinisikan sebagai callback parameter dari grecaptcha.render() fungsi, misalnya:

grecaptcha.render('example', {
'sitekey' : 'someSitekey',
'callback' : myCallbackFunction,
'theme' : 'dark'
});

Cara lain untuk menemukan fungsi callback adalah membuka konsol JavaScript browser dan memeriksa objek konfigurasi reCAPTCHA:

___grecaptcha_cfg.clients[0].aa.l.callback

Perhatikan bahwa aa.l properti dapat bervariasi, dan mungkin ada beberapa client reCAPTCHA di halaman. Dalam kasus seperti itu, Anda juga harus memeriksa clients[1], clients[2], dan entri lain untuk menemukan objek konfigurasi yang benar.

Sebagai alternatif, Anda dapat menggunakan skrip berikut untuk mengekstrak parameter reCAPTCHA secara otomatis:

function findRecaptchaClients() {
  if (typeof (___grecaptcha_cfg) !== 'undefined') {
    return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
      const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' };
      const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object');

      objects.forEach(([toplevelKey, toplevel]) => {
        const found = Object.entries(toplevel).find(([_, value]) => (
          value && typeof value === 'object' && 'sitekey' in value && 'size' in value
        ));
     
        if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV'){
            data.pageurl = toplevel.baseURI;
        }
        
        if (found) {
          const [sublevelKey, sublevel] = found;

          data.sitekey = sublevel.sitekey;
          const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback';
          const callback = sublevel[callbackKey];
          if (!callback) {
            data.callback = null;
            data.function = null;
          } else {
            data.function = callback;
            const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join('');
            data.callback = `___grecaptcha_cfg.clients${keys}`;
          }
        }
      });
      return data;
    });
  }
  return [];
}

Terakhir, panggil fungsi callback:

myCallbackFunction();

Atau sebagai alternatif:

___grecaptcha_cfg.clients[0].aa.l.callback();

Dalam beberapa kasus, fungsi callback memerlukan sebuah argumen. Pada sebagian besar situasi, Anda harus meneruskan token hasil pemecahan sebagai argumen itu. Contohnya:

myCallbackFunction('TOKEN');

recaptcha v2 solver  reCAPTCHA V2 Invisible

reCAPTCHA v2 juga memiliki mode Invisible. Anda dapat melihat contohnya di sini:

https://www.google.com/recaptcha/api2/demo?invisible=true

Invisible reCAPTCHA tidak menampilkan kotak centang “I’m not a robot”. Sebaliknya, ia biasanya dilekatkan pada sebuah tombol atau dipicu secara otomatis saat halaman dimuat atau saat pengguna berinteraksi, misalnya mengklik tombol atau mengirimkan formulir.

Secara internal, widget Invisible reCAPTCHA dirender di dalam elemen <div> tersembunyi yang diposisikan di luar viewport yang terlihat, sehingga tidak tampak oleh pengguna.

Tergantung cookie dan skor risiko pengguna, reCAPTCHA bisa lolos otomatis tanpa menampilkan tantangan. Jika tidak, tantangan gambar standar akan muncul.

Pada sebagian besar kasus, setelah tantangan selesai, sebuah fungsi callback dijalankan. Lihat bagian callback di atas untuk detail lebih lanjut.

Daftar parameter permintaan POST dan GET tersedia di sini: Parameter permintaan POST dan GET reCAPTCHA V2

Cara Menentukan Apakah reCAPTCHA Bersifat Invisible?

Anda dapat mengenali Invisible reCAPTCHA melalui salah satu indikator berikut:

  • Checkbox “I’m not a robot” tidak terlihat, tetapi challenge muncul setelah interaksi pengguna.

  • URL iframe reCAPTCHA berisi parameter size=invisible.

  • Objek konfigurasi reCAPTCHA menyertakan size properti disetel ke invisible, misalnya:
    ___grecaptcha_cfg.clients[0].aa.l.size === "invisible"

Saat memecahkan Invisible reCAPTCHA melalui API, sertakan parameter: invisible=1

Bagaimana Menangani Invisible reCAPTCHA di Browser?
Metode 1: Menggunakan JavaScript

Setel nilai dari g-recaptcha-response menjadi token yang dikembalikan CapSkip:

document.getElementById("g-recaptcha-response").innerHTML="TOKEN";

Setelah menyetel token, jalankan tindakan yang biasanya terjadi setelah verifikasi berhasil.

Dalam kebanyakan kasus, ini berarti mengirim sebuah formulir. Anda perlu mengenali formulir yang tepat melalui id, name, atau atribut lain, lalu picu pengirimannya. Berikut beberapa contohnya:

document.getElementById("recaptcha-demo-form").submit(); //by id "recaptcha-demo-form"
document.getElementsByName("myFormName")[0].submit(); //by element name "myFormName"
document.getElementsByClassName("example").submit(); //by class name "example"

Dalam beberapa kasus, sebuah fungsi callback dijalankan otomatis ketika reCAPTCHA terpecahkan.

Fungsi callback biasanya didefinisikan di dalam data-callback atribut dari widget reCAPTCHA, misalnya:

data-callback="myCallbackFunction"

Dalam kasus lain, fungsi callback didefinisikan sebagai callback parameter dari grecaptcha.render() fungsi, misalnya:

grecaptcha.render('example', {
'sitekey' : 'someSitekey',
'callback' : myCallbackFunction,
'theme' : 'dark'
});

Yang perlu Anda lakukan hanyalah memanggil fungsi itu:

myCallbackFunction();
Metode 2: Mengubah HTML

Hapus <div> elemen yang berisi widget reCAPTCHA dari body halaman.

<div style="visibility: hidden; position: absolute; width:100%; top: -10000px; left: 0px; right: 0px; transition: visibility 0s linear 0.3s, opacity 0.3s linear; opacity: 0;">
  <div style="width: 100%; height: 100%; position: fixed; top: 0px; left: 0px; z-index: 2000000000; background-color: #fff; opacity: 0.5;  filter: alpha(opacity=50)"></div>
  <div style="margin: 0 auto; top: 0px; left: 0px; right: 0px; position: absolute; border: 1px solid #ccc; z-index: 2000000000; background-color: #fff; overflow: hidden;">
 <iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&v=r20170213115309&k=6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs#zglq3yifgkmj"
      title="recaptcha challenge"
      style="width: 100%; height: 100%;"
      scrolling="no"
      name="zglq3yifgkmj"
      frameborder="0"></iframe>
  </div>
</div>

Hapus seluruh blok reCAPTCHA dari halaman.

<div class="">
  <!-- BEGIN: ReCAPTCHA implementation example. -->
  <div
    id="recaptcha-demo"
    class="g-recaptcha"
    data-sitekey="6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs"
    data-callback="onSuccess"
    data-bind="recaptcha-demo-submit"
  >
    <div
      class="grecaptcha-badge"
      style="width: 256px; height: 60px; transition: right 0.3s ease 0s; position: fixed; bottom: 14px; right: -186px; box-shadow: 0px 0px 5px gray;"
    >
      <div class="grecaptcha-logo">
        <iframe
          src="https://www.google.com/recaptcha/api2/anchor?k=6LfP0CITAAAAAHq9FOgCo7v_fb0-pmmH9VW3ziFs&co=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbTo0NDM.&hl=en&v=r20170213115309&size=invisible&cb=uror1hlow5a"
          title="recaptcha widget"
          scrolling="no"
          name="undefined"
          width="256"
          height="60"
          frameborder="0"
        ></iframe>
      </div>
      <div class="grecaptcha-error"></div>
      <textarea
        id="g-recaptcha-response"
        name="g-recaptcha-response"
        class="g-recaptcha-response"
        style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none;  display: none; "
      ></textarea>
    </div>
  </div>
  <script>
    var onSuccess = function (response) {
      var errorDivs = document.getElementsByClassName('recaptcha-error');
      if (errorDivs.length) {
        errorDivs[0].className = '';
      }
      var errorMsgs = document.getElementsByClassName('recaptcha-error-message');
      if (errorMsgs.length) {
        errorMsgs[0].parentNode.removeChild(errorMsgs[0]);
      }
      document.getElementById('recaptcha-demo-form').submit();
    };
  </script>
  <!-- Optional noscript fallback. --><!-- END: ReCAPTCHA implementation example. -->
</div>

Sisipkan kode berikut sebagai pengganti blok yang dihapus:

<input type="submit" /> <textarea name="g-recaptcha-response">%g-recaptcha-response%</textarea>

%g-recaptcha-response% mewakili token jawaban yang diterima dari CapSkip.

Setelah mengganti blok tersebut, tombol “Submit query” akan muncul. Klik tombol itu untuk mengirim formulir beserta g-recaptcha-response nilai dan semua data formulir lain yang diperlukan ke situs web.

recaptcha v2 solver  reCAPTCHA V3

reCAPTCHA v3 adalah mekanisme CAPTCHA modern yang dikembangkan oleh Google. Ia tidak menampilkan tantangan yang terlihat dan tidak memerlukan interaksi pengguna. Sebagai gantinya, ia memberikan skor berdasarkan kemungkinan bahwa interaksi tersebut dilakukan manusia.

Secara teknis, reCAPTCHA v3 mirip dengan reCAPTCHA v2. Situs web menerima token dari API reCAPTCHA, yang kemudian dikirim dalam permintaan POST ke server target dan diverifikasi melalui API reCAPTCHA.

Perbedaan utamanya adalah reCAPTCHA v3 tidak menampilkan tantangan yang terlihat. Sebagai gantinya, ia mengembalikan penilaian yang memperkirakan apakah pengguna adalah manusia atau bot. Penilaian ini disebut score dan berkisar dari 0.0 hingga 1.0. Skor dikirim ke situs web, yang kemudian memutuskan cara menangani permintaan berdasarkan nilai tersebut.

Ada juga parameter tambahan bernama action, yang memungkinkan situs web membedakan antara berbagai interaksi pengguna. Setelah memverifikasi token, API reCAPTCHA mengembalikan nama action yang terkait dengan permintaan tersebut.

Cara Memecahkan reCAPTCHA v3 Menggunakan CapSkip?

Pertama, pastikan situs target menggunakan reCAPTCHA v3.

Indikator reCAPTCHA v3 meliputi:

  • Tanpa CAPTCHA terlihat atau challenge gambar

  • The api.js skrip dimuat dengan render=SITEKEY parameter, misalnya:
    https://www.google.com/recaptcha/api.js?render=SITEKEY

  • The ___grecaptcha_cfg.clients array berisi entri dengan indeks numerik yang tinggi, seperti clients[100000]

Untuk memecahkan reCAPTCHA v3, identifikasi parameter berikut:

  1. sitekey
    Ini dapat ditemukan di render parameter dari api.js URL skrip. Ia juga dapat muncul di URL iframe, di dalam kode JavaScript yang memanggil grecaptcha.execute(), atau di dalam ___grecaptcha_cfg objek konfigurasi.
  2. action
    Temukan ini dengan memeriksa kode JavaScript untuk panggilan ke grecaptcha.execute(), misalnya:
    grecaptcha.execute('SITEKEY', {action: 'do_something'})
    Dalam beberapa kasus, menemukan action memerlukan pemeriksaan beberapa file JavaScript yang dimuat halaman. Jika Anda tidak dapat menentukan nilai action, Anda dapat memakai nilai bawaan "verify".
  3. pageurl
    URL lengkap halaman tempat reCAPTCHA v3 diterapkan.
Memahami Skor

Ambang skor yang dapat diterima berbeda-beda di tiap situs web dan hanya dapat ditentukan melalui pengujian. Skor berkisar dari:

  • 0.0 → kemungkinan bot

  • 1.0 → kemungkinan manusia

Sebagian besar situs web menggunakan ambang batas antara 0.3 dan 0.7, karena pengguna yang sah pun bisa mendapatkan skor lebih rendah.

Anda dapat meneruskan ambang batas yang diinginkan menggunakan min_score parameter, tetapi skor akhir selalu ditentukan oleh Google pada saat verifikasi dan tidak dapat dijamin oleh pemecah.

Daftar Parameter Permintaan POST
Parameter Tipe Wajib Deskripsi
key String Ya Kunci API CapSkip Anda.
method String Ya userrecaptcha: menentukan permintaan reCAPTCHA.
version String Ya v3: menunjukkan bahwa permintaan tersebut untuk reCAPTCHA v3.
googlekey String Ya Nilai dari data-sitekey parameter yang ditemukan di halaman target.
pageurl String Ya URL lengkap halaman tempat reCAPTCHA berada.
enterprise Integer
Default: 0
Tidak 1: menandakan reCAPTCHA Enterprise v3.
0: reCAPTCHA v3 standar.
action String
Default: verify
Tidak Nilai dari action parameter yang didefinisikan di halaman.
min_score Float Tidak Skor minimum yang diminta untuk token. Google menetapkan skor akhir saat server Anda memverifikasi token, jadi nilai ini hanyalah petunjuk dan tidak dijamin. CapSkip mengembalikan token yang diperolehnya terlepas dari skor yang kemudian ditetapkan Google.
json Integer
Default: 0
Tidak 0: respons dikembalikan sebagai teks biasa.
1: respons dikembalikan dalam format JSON.
proxy String Tidak Alamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT
proxytype String Tidak Jenis proxy. Nilai yang didukung: HTTP, HTTPS, SOCKS5, SOCKS5H. Default: HTTP ketika proxy disediakan tetapi proxytype dihilangkan.

Kirim reCAPTCHA v3:

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&version=v3&action=submit&min_score=0.7&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com" http://127.0.0.1:8080/in.php

Kirim Enterprise reCAPTCHA v3:

curl -X POST -d "key=YOUR_API_KEY&method=userrecaptcha&version=v3&action=submit&min_score=0.7&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&enterprise=1" http://127.0.0.1:8080/in.php

Jika permintaan berhasil, CapSkip akan mengembalikan ID CAPTCHA sebagai teks biasa: OK|12345

Jika json=1 ditetapkan, respons akan dikembalikan dalam format JSON:

{
    "status":1,
    "request":"12345"
}

Jika terjadi kesalahan, CapSkip akan mengembalikan kode error.

Tunggu 10 hingga 15 detik, lalu kirim permintaan HTTP GET ke endpoint hasil: http://127.0.0.1:PORT/res.php

Sertakan ID CAPTCHA yang dikembalikan dalam permintaan Anda. Daftar lengkap parameter yang tersedia ditampilkan pada tabel di bawah ini.

Jika CAPTCHA berhasil dipecahkan, CapSkip akan mengembalikan hasilnya dalam format teks biasa atau JSON. Nilai yang dikembalikan adalah token verifikasi seperti berikut:

03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB--gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3--o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q

Setiap token disertai User-Agent browser yang digunakan untuk mendapatkannya. Dengan json=1 responsnya menyertakan userAgent sebagai kolom di samping request. Dalam mode teks biasa, baca nilai yang sama dari header X-Recaptcha-User-Agent yang ada di respons. Jika Anda menggunakan JSON API, getTaskResult mengembalikannya sebagai solution.userAgent. Kirim User-Agent ini saat Anda mengirim token, karena beberapa situs memeriksa bahwa keduanya cocok. Kolom dan header tersebut dihilangkan jika tidak ada User-Agent yang tersedia.

{
    "status": 1,
    "request": "03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq...",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}

Jika CAPTCHA belum terpecahkan, CapSkip akan mengembalikan CAPCHA_NOT_READY. Tunggu 5 detik dan ulangi permintaan. Jika CapSkip mengembalikan body respons yang kosong, hasilnya sudah pernah diambil atau ID tersebut tidak ada. Setiap hasil hanya dapat dibaca satu kali.

Daftar parameter permintaan GET
Parameter GET Tipe Wajib Deskripsi
key String Ya Kunci API CapSkip Anda.
action String Ya get: ambil jawaban untuk CAPTCHA yang dikirimkan.
id Integer Ya ID CAPTCHA yang dikembalikan oleh in.php.
json Integer
Default: 0
Tidak 0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON, termasuk nilai userAgent jika tersedia.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

Setelah menerima token dari CapSkip, Anda harus mengirimkannya dengan benar ke situs web target. Cara terbaik untuk memahami cara kerjanya adalah dengan mengamati permintaan yang dikirim saat menyelesaikan verifikasi sebagai pengguna biasa. Sebagian besar browser menyediakan alat pengembang dengan Network tab yang memungkinkan Anda memeriksa permintaan keluar.

Dalam kebanyakan kasus, token dikirim melalui permintaan POST. Nama parameternya mungkin g-recaptcha-response, mirip dengan reCAPTCHA v2, atau sesuatu seperti g-recaptcha-response-100000. Dalam beberapa implementasi, nama parameter yang berbeda mungkin digunakan.

Anda perlu memeriksa permintaan jaringan untuk menentukan bagaimana token dikirimkan lalu menyusun permintaan Anda sesuai dengan itu.

recaptcha v2 solver  reCAPTCHA Enterprise

reCAPTCHA Enterprise adalah versi lanjutan dari sistem reCAPTCHA Google. Ia dapat beroperasi dalam mode v2 maupun v3 dan memberi administrator situs web kendali tambahan, termasuk kemampuan menilai dan melaporkan apakah suatu interaksi dilakukan manusia atau otomatis.

Cara Memecahkan reCAPTCHA Enterprise?

Langkah pertama adalah menentukan apakah situs tersebut menggunakan reCAPTCHA versi Enterprise.

Indikator utama reCAPTCHA Enterprise meliputi:

  • Halaman dimuat enterprise.js alih-alih api.js, misalnya:

    <script src="https://recaptcha.net/recaptcha/enterprise.js" async defer></script>

  • Kode JavaScript situs memanggil grecaptcha.enterprise.METHOD alih-alih grecaptcha.METHOD

Berikutnya, tentukan implementasi mana yang digunakan: v2, Invisible v2, atau v3. Hal ini biasanya dapat dikenali dengan menganalisis bagaimana widget dirender dan bagaimana perilakunya di halaman.

Ikuti diagram alur di bawah ini untuk menentukan implementasi yang tepat. Ini berlaku pada sebagian besar kasus.

recaptcha enterprise

Identifikasi parameter CAPTCHA dengan cara yang sama seperti dijelaskan untuk reCAPTCHA v2 atau v3.

Untuk implementasi v2 Enterprise, mungkin ada data opsional tambahan. Pada sebagian besar kasus, ini berupa string kustom yang didefinisikan di s atau data-s parameter. Jika ada, sertakan nilai ini dalam permintaan Anda menggunakan data-s parameter.

Daftar parameter permintaan POST dan GET tersedia di sini: Parameter permintaan POST dan GET reCAPTCHA V2

Untuk implementasi v3 Enterprise, Anda mungkin juga memerlukan action nilai. Untuk menemukannya, periksa kode JavaScript situs dan cari grecaptcha.enterprise.execute() panggilan. action biasanya diteruskan di dalam fungsi ini. Perlu diingat bahwa action bersifat opsional dan bisa jadi undefined dalam beberapa kasus.

Daftar parameter permintaan POST dan GET tersedia di sini: Parameter permintaan POST dan GET reCAPTCHA V3

Saat mengirim permintaan Anda ke /in.php endpoint, sertakan parameter tambahan: enterprise=1

Setelah itu, berinteraksilah dengan API CapSkip dengan cara yang sama seperti saat memecahkan reCAPTCHA v2 atau v3. Setelah token dikembalikan, kirimkan token tersebut ke situs web target sesuai implementasinya.

Cloudflare turnstile solving Cloudflare Turnstile

Cloudflare Turnstile adalah alternatif CAPTCHA modern yang dikembangkan oleh Cloudflare. Ia memverifikasi apakah seorang pengunjung adalah manusia tanpa mengandalkan tantangan visual tradisional. Turnstile dapat muncul sebagai widget mandiri atau sebagai bagian dari halaman tantangan, dan ia beroperasi dengan interaksi pengguna yang minimal atau tanpa interaksi sama sekali.

Ada dua implementasi Turnstile yang umum:

1. Widget Turnstile Mandiri

Widget Turnstile mandiri disematkan langsung pada halaman situs web, biasanya untuk melindungi formulir dari pengiriman otomatis. Dalam kasus ini:

  • Ekstrak sitekey from the page.

  • Kirim ke CapSkip API bersama dengan seluruh pageurl.

  • Setelah menerima token, masukkan ke dalam cf-turnstile-response kolom.

  • Dalam beberapa implementasi, token mungkin juga perlu ditempatkan di g-recaptcha-response kolom.

  • Jika callback didefinisikan di turnstile.render() konfigurasi, jalankan dengan token yang dikembalikan.

Lalu kirim formulir seperti biasa.

2. Turnstile pada Halaman Challenge Cloudflare

Ini terjadi ketika situs web diproksikan melalui Cloudflare dan menampilkan halaman tantangan Turnstile sebelum memberikan akses. Dalam kasus ini, Anda harus mengekstrak parameter berikut:

  • cData

  • chlPageData

  • action

Nilai-nilai ini harus disertakan dalam permintaan API Anda. Selain itu, Anda harus menggunakan User-Agent nilai yang dikembalikan oleh CapSkip API saat mengirimkan token.

Cara Mengekstrak Parameter yang Diperlukan?

Untuk mengekstrak parameter yang diperlukan, Anda dapat menimpa turnstile.render metode itu dan mencegat argumen yang diteruskan saat metode tersebut dipanggil. Misalnya, suntikkan kode JavaScript berikut ke halaman. Skrip harus dieksekusi sebelum widget Turnstile dimuat agar parameternya berhasil ditangkap.

const i = setInterval(()=>{
if (window.turnstile) {
clearInterval(i)
window.turnstile.render = (a,b) => {
let p = {
method: "turnstile",
key: "YOUR_API_KEY",
sitekey: b.sitekey,
pageurl: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent,
json: 1
}
console.log(JSON.stringify(p))
window.tsCallback = b.callback
return 'foo'
}
}
},50)
Daftar Parameter Permintaan POST
Parameter Tipe Wajib Deskripsi
key String Ya Kunci API CapSkip Anda.
method String Ya turnstile: menentukan permintaan Cloudflare Turnstile.
sitekey String Ya Nilai dari data-sitekey parameter yang ditemukan di halaman target.
pageurl String Ya URL lengkap halaman tempat challenge Turnstile berada.
action String Tidak Nilai action opsional yang didefinisikan di data-action atribut atau diteruskan ke turnstile.render().
data String Tidak Nilai dari cData yang diteruskan ke turnstile.render() atau didefinisikan di data-cdata atribut.
pagedata String Tidak Nilai dari chlPageData yang diteruskan ke turnstile.render().
json Integer
Default: 0
Tidak 0: respons dikembalikan sebagai teks biasa.
1: respons dikembalikan dalam format JSON.
proxy String Tidak Alamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT
proxytype String Tidak Jenis proxy. Nilai yang didukung: HTTP, HTTPS, SOCKS5, SOCKS5H. Default: HTTP ketika proxy disediakan tetapi proxytype dihilangkan.

Kirim Turnstile (mandiri):

curl -X POST -d "key=YOUR_API_KEY&method=turnstile&sitekey=0x4AAAAAAABUYP0XeMJF0xoy&pageurl=https://example.com" http://127.0.0.1:8080/in.php

Kirim Turnstile (halaman challenge, dengan action, data, pagedata opsional):

curl -X POST -d "key=YOUR_API_KEY&method=turnstile&sitekey=0x4AAAAAAABUYP0XeMJF0xoy&pageurl=https://example.com&action=managed&data=...&pagedata=..." http://127.0.0.1:8080/in.php

Jika permintaan berhasil, CapSkip akan mengembalikan ID CAPTCHA sebagai teks biasa: OK|12345

Jika json=1 ditetapkan, respons akan dikembalikan dalam format JSON:

{
    "status":1,
    "request":"12345"
}

Jika terjadi kesalahan, CapSkip akan mengembalikan kode error.

Gunakan ID yang dikembalikan untuk mengambil hasilnya dari /res.php endpoint dari API.

Daftar parameter permintaan GET
Parameter GET Tipe Wajib Deskripsi
key String Ya Kunci API CapSkip Anda.
action String Ya get: ambil jawaban untuk CAPTCHA yang dikirimkan.
id Integer Ya ID CAPTCHA yang dikembalikan oleh in.php.
json Integer
Default: 0
Tidak 0 - respons dikembalikan sebagai teks biasa.
1 - respons dikembalikan dalam format JSON, termasuk userAgent nilai.

Untuk Cloudflare Turnstile, pemecah menggunakan User-Agent browser tertentu, dan Anda harus mengirim User-Agent yang sama saat mengirim token. Dengan json=1 responsnya menyertakan userAgent kolom. Dalam mode teks biasa, baca nilai yang sama dari X-Turnstile-User-Agent header respons.

curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

cloudflare challenge solver Cloudflare Challenge (cf_clearance)

Beberapa situs di balik Cloudflare menghentikan setiap pengunjung di halaman penuh bertuliskan “Just a moment...” sebelum menampilkan konten apa pun. Melewati halaman tersebut akan menyetel cookie cf_clearance dan setiap permintaan berikutnya yang membawa cookie tersebut akan langsung diloloskan. CapSkip melewati halaman untuk URL yang Anda kirim dan mengembalikan cookie-nya, sehingga skrip atau alat yang tidak memiliki browser sendiri dapat mengambil situs tersebut dengan permintaan HTTP biasa.

Cara Kerjanya

Metode ini untuk tantangan halaman penuh. Jika situs justru menampilkan widget Turnstile di dalam formulir, yang Anda butuhkan adalah token, bukan cookie: lihat bagian Cloudflare Turnstile di atas.

Cloudflare mengikat cookie cf_clearance ke alamat IP dan User-Agent yang memperolehnya. Cookie yang digunakan ulang dari alamat lain, atau dengan User-Agent lain, akan ditolak dan halaman tantangan muncul kembali. Itulah sebabnya setiap permintaan untuk metode ini menyertakan proxy Anda, dan jawabannya memberi tahu User-Agent mana yang harus Anda kirim.

Siklus lengkapnya terdiri dari empat langkah:

  1. Aktifkan Kembalikan cookie cf_clearance di CapSkip (lihat di bawah).
  2. Kirim URL halaman dan proxy Anda ke /createTask.
  3. Lakukan polling ke /getTaskResult hingga cookie siap.
  4. Kirim permintaan Anda sendiri melalui proxy yang sama, dengan User-Agent yang sama dan cookie tersebut.

Metode ini tersedia pada API JSON createTask / getTaskResult saja. Antarmuka lama in.php / res.php tidak memiliki mode cookie.

Sebelum Memulai

Metode ini nonaktif secara default. Buka CapSkip, masuk ke Pengaturan, Jenis captcha, Cloudflare, lalu aktifkan Kembalikan cookie cf_clearance. Selama nonaktif, setiap permintaan untuk metode ini ditolak dengan ERROR_TASK_NOT_SUPPORTED. Perubahan ini berlaku mulai permintaan berikutnya; tidak ada yang perlu dimulai ulang.

Dua hal wajib ada di setiap permintaan:

  • Proxy. Cookie hanya berlaku dari alamat yang memperolehnya, jadi permintaan harus menyebutkan proxy yang akan Anda gunakan sesudahnya. Permintaan tanpa proxy ditolak sebelum pekerjaan apa pun dilakukan. Proxy HTTP, HTTPS, SOCKS5, dan SOCKS5H diterima; SOCKS4 tidak.
  • User-Agent yang sesuai, jika Anda mengirimkannya. User-Agent tersebut harus berupa User-Agent Chrome untuk Windows, dengan versi mayor yang sama dengan Google Chrome yang terinstal di komputer yang menjalankan CapSkip. User-Agent lain akan menghasilkan cookie yang ditolak oleh situs, sehingga User-Agent tersebut langsung ditolak di awal dengan error. Pilihan paling sederhana adalah tidak mengirim User-Agent sama sekali dan menggunakan User-Agent yang dikembalikan bersama cookie.
Jenis Tugas

Tiga varian dari permintaan yang sama diterima, satu untuk setiap keluarga klien yang memiliki mode cookie. Semuanya dipecahkan dengan cara yang sama; hanya nama field dan bentuk jawabannya yang berbeda.

Jenis tugasGaya APIDidukungDeskripsi
AntiCloudflareTaskCapSolverYaProxy sebagai satu field proxy berupa string. Jawabannya berisi cookie, token yang berisi nilai yang sama, serta User-Agent.
TurnstileTask dengan cloudflareTaskType disetel ke cf_clearanceCapMonsterYaProxy sebagai field terpisah. Jawabannya berisi cookie, ditambah User-Agent jika permintaan tidak mengirimkannya.
TurnstileTask tanpa websiteKeyNextCaptchaYaProxy sebagai field terpisah. Hanya dikenali selama NextCaptcha menjadi layanan yang dipilih. Jawabannya berisi cookie dan User-Agent.
Parameter AntiCloudflareTask
ParameterTipeWajibDeskripsi
clientKeyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
typeStringYaHarus AntiCloudflareTask.
websiteURLStringYaURL lengkap http atau https dari halaman yang menampilkan tantangan.
proxyStringYaProxy yang digunakan untuk pemecahan. Menerima IP:PORT:LOGIN:PASSWORD, LOGIN:PASSWORD@IP:PORT, http://LOGIN:PASSWORD@IP:PORT (juga https://, socks5://, socks5h://) dan socks5:IP:PORT:LOGIN:PASSWORD. Login dan kata sandi bersifat opsional.
userAgentStringTidakUser-Agent yang akan Anda kirim bersama cookie. Lihat Sebelum Memulai untuk mengetahui nilai yang diterima.
htmlStringTidakDiterima demi kompatibilitas dan diabaikan.
Parameter TurnstileTask (cf_clearance)
ParameterTipeWajibDeskripsi
clientKeyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
typeStringYaHarus TurnstileTask.
cloudflareTaskTypeStringYaHarus cf_clearance. Tanpa parameter ini, tugas tersebut menjadi permintaan token Turnstile.
websiteURLStringYaURL lengkap http atau https dari halaman yang menampilkan tantangan.
websiteKeyStringTidakDiterima demi kompatibilitas. Halaman ini tidak memiliki sitekey untuk diberikan, jadi nilai apa pun bisa digunakan.
proxyTypeString
Nilai default: http
Tidakhttp, https, socks5 atau socks5h.
proxyAddressStringYaAlamat IP atau nama host proxy.
proxyPortIntegerYaPort proxy.
proxyLoginStringTidakLogin proxy.
proxyPasswordStringTidakKata sandi proxy. Digunakan persis seperti yang dikirim, jadi karakter seperti @ dan : aman digunakan.
userAgentStringTidakUser-Agent yang akan Anda kirim bersama cookie. Lihat Sebelum Memulai untuk mengetahui nilai yang diterima.
htmlPageBase64StringTidakDiterima demi kompatibilitas dan diabaikan.

Varian NextCaptcha menggunakan field proxyType, proxyAddress, proxyPort, proxyLogin dan proxyPassword yang sama, dengan type disetel ke TurnstileTask dan tanpa websiteKey.

Mengirim Tugas

Kirim permintaan HTTP POST dengan body JSON ke endpoint API CapSkip Anda (/createTask).

Kirim AntiCloudflareTask:

curl -X POST \
-H "Content-Type: application/json" \
-d '{
    "clientKey": "YOUR_API_KEY",
    "task": {
        "type": "AntiCloudflareTask",
        "websiteURL": "https://www.example.com/",
        "proxy": "203.0.113.10:8080:login:password"
    }
}' \
http://127.0.0.1:8080/createTask

Kirim TurnstileTask dengan cloudflareTaskType:

curl -X POST \
-H "Content-Type: application/json" \
-d '{
    "clientKey": "YOUR_API_KEY",
    "task": {
        "type": "TurnstileTask",
        "cloudflareTaskType": "cf_clearance",
        "websiteURL": "https://www.example.com/",
        "websiteKey": "xxxxxx",
        "proxyType": "http",
        "proxyAddress": "203.0.113.10",
        "proxyPort": 8080,
        "proxyLogin": "login",
        "proxyPassword": "password"
    }
}' \
http://127.0.0.1:8080/createTask

Jika permintaan diterima, CapSkip mengembalikan ID tugas. Permintaan yang dibuat saat pengaturan nonaktif, tanpa proxy, atau dengan User-Agent yang tidak dapat digunakan akan ditolak di sini, pada permintaan pengiriman itu sendiri, sebelum pekerjaan apa pun dilakukan.

{
    "errorId": 0,
    "errorCode": "",
    "errorDescription": "",
    "taskId": "2122988149"
}
Mendapatkan Hasil

Tunggu sekitar 5 detik, lalu kirim permintaan HTTP POST ke /getTaskResult dengan ID tugas. Ulangi setiap beberapa detik selama statusnya processing. Sebagian besar halaman berhasil dilewati dalam 5 hingga 20 detik; proxy yang lambat akan menambah waktu tersebut.

curl -X POST \
-H "Content-Type: application/json" \
-d '{"clientKey": "YOUR_API_KEY", "taskId": "2122988149"}' \
http://127.0.0.1:8080/getTaskResult
{
    "errorId": 0,
    "taskId": "2122988149",
    "status": "processing"
}

Jawaban siap untuk AntiCloudflareTask. token berisi nilai yang sama dengan cookie:

{
    "errorId": 0,
    "errorCode": "",
    "errorDescription": "",
    "taskId": "2122988149",
    "solution": {
        "cookies": {
            "cf_clearance": "3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2"
        },
        "token": "3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2",
        "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36"
    },
    "status": "ready"
}

Jawaban siap untuk TurnstileTask dengan cloudflareTaskType. Jika permintaan menyertakan userAgent, solusinya hanya berupa cookie, karena cookie terikat pada User-Agent yang Anda kirim. Jika tidak, userAgent ditambahkan agar Anda tahu User-Agent mana yang harus digunakan:

{
    "errorId": 0,
    "errorCode": "",
    "errorDescription": "",
    "taskId": "2122988149",
    "solution": {
        "cf_clearance": "3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2",
        "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36"
    },
    "status": "ready"
}

Varian NextCaptcha menjawab dengan cf_clearance dan userAgent berdampingan di dalam solution.

Menggunakan Cookie

Kirim cookie bersama setiap permintaan ke situs, melalui proxy yang sama dan dengan User-Agent yang sama. Ubah salah satunya, dan Cloudflare akan kembali menampilkan halaman tantangan.

curl -x "http://login:[email protected]:8080" \
-A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36" \
-b "cf_clearance=3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2" \
https://www.example.com/

Cookie berlaku selama yang diizinkan oleh pengaturan Cloudflare situs itu sendiri, sering kali 30 menit dan terkadang jauh lebih lama. Saat halaman tantangan muncul kembali, kirim tugas baru. Jika Anda merotasi proxy, lakukan pemecahan sekali per proxy: cookie yang diperoleh pada satu alamat tidak berlaku di alamat lain.

Kesalahan

Penolakan dikembalikan pada permintaan createTask itu sendiri. Kegagalan pemecahan dikembalikan pada getTaskResult dengan status disetel ke failed. Saat NextCaptcha dipilih, kode dan status HTTP mengikuti tabel error milik NextCaptcha sendiri.

KodeArti
ERROR_TASK_NOT_SUPPORTEDKembalikan cookie cf_clearance dalam keadaan nonaktif di CapSkip.
ERROR_PROXY_MISSINGTurnstileTask (varian): tidak ada proxy yang dapat digunakan dalam permintaan.
ERROR_WRONG_USERAGENTTurnstileTask (varian): User-Agent bukan Chrome untuk Windows dengan versi mayor yang sama dengan Google Chrome yang terinstal di komputer CapSkip.
ERROR_BAD_PARAMETERSAntiCloudflareTask (varian): tidak ada proxy yang dapat digunakan atau User-Agent tidak dapat digunakan. Pada kedua varian: websiteURL tidak disertakan.
ERROR_PAGEURLwebsiteURL bukan URL http atau https lengkap.
ERROR_PROXY_BANNEDCloudflare memblokir alamat proxy secara langsung. Gunakan proxy lain.
ERROR_PROXY_CONNECT_REFUSEDHalaman tidak dapat dijangkau melalui proxy. Periksa apakah proxy aktif dan data login sudah benar.
ERROR_CAPTCHA_UNSOLVABLETidak ada cookie yang diperoleh tepat waktu, atau halaman tidak menampilkan tantangan Cloudflare sama sekali (errorDescription kemudian berisi “No Cloudflare challenge on this page”). Kirim tugas baru untuk mencoba lagi.

hcaptcha solver hCaptcha

hCaptcha adalah widget CAPTCHA yang digunakan oleh banyak formulir pendaftaran, masuk, dan checkout. Pengunjung mencentang kotak centang, terkadang menjawab tantangan gambar, lalu widget menaruh token di formulir. Situs memeriksa token tersebut ke hCaptcha sebelum menerima formulir. CapSkip melewati widget untuk sitekey dan halaman yang Anda kirim lalu mengembalikan token, siap dikirim bersama formulir. hCaptcha Enterprise dan widget tak terlihat menggunakan metode yang sama.

Cara Kerjanya
  1. Temukan sitekey widget hCaptcha di halaman target (lihat di bawah).
  2. Kirim sitekey dan URL halaman ke /in.php dengan method=hcaptcha.
  3. Lakukan polling ke /res.php hingga token siap.
  4. Masukkan token ke dalam formulir, atau teruskan ke callback halaman, lalu kirim formulir.

Pemecahan biasanya memakan waktu antara 10 dan 30 detik. Lakukan polling setiap 5 detik.

Menemukan Sitekey

Sitekey adalah pengenal publik yang sama untuk setiap pengunjung halaman. Sebagian besar halaman mencantumkannya pada kontainer widget sebagai data-sitekey:

<div class="h-captcha" data-sitekey="a5f74b19-9e45-40e0-b45d-47ff91b7a6c2"></div>

Jika halaman membuat widget dengan skrip, cari opsi sitekey pada hcaptcha.render(), atau parameter sitekey= di alamat iframe hCaptcha. Widget dengan data-size="invisible" bersifat tak terlihat: kirim invisible=1 untuk widget tersebut.

Beberapa situs hCaptcha Enterprise juga meneruskan nilai rqdata ke widget, melalui hcaptcha.setData(), sebelum widget berjalan. Jika halaman melakukan ini, kirim nilai tersebut sebagai data. Nilai ini diterbitkan oleh situs untuk satu tantangan dan cepat kedaluwarsa, jadi ambil nilai baru untuk setiap tugas.

Daftar Parameter Permintaan POST
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
methodStringYaHarus hcaptcha. Menentukan bahwa Anda mengirimkan hCaptcha.
sitekeyStringYaSitekey widget hCaptcha.
pageurlStringYaURL lengkap halaman tempat widget berada.
invisibleInteger
Default: 0
Tidak1 untuk widget tak terlihat.
dataStringTidakThe rqdata nilai dari widget hCaptcha Enterprise, jika situs menetapkannya.
userAgentStringTidakUser-Agent yang akan Anda gunakan untuk mengirim formulir. CapSkip hanya menggunakannya jika cocok dengan browser yang dipakai CapSkip untuk memecahkan. Balasan selalu menyebutkan User-Agent yang digunakan untuk mendapatkan token.
proxyStringTidakAlamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD.
proxytypeStringTidakTipe proxy: HTTP, HTTPS, SOCKS5 atau SOCKS5H.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.

CapSkip tidak mewajibkan proxy untuk metode ini. Satu alamat sudah cukup untuk pengujian dan pemecahan sesekali. Di luar itu, hCaptcha menilai jaringan asal token sekaligus browsernya, dan aliran pemecahan yang terus-menerus dari satu IP adalah hal yang memang dirancang untuk ditangkap oleh batas laju dan pemeriksaan reputasinya. Untuk volume besar, konfigurasikan kumpulan proxy di Pengaturan, Jenis captcha, hCaptcha, Konfigurasi Proxy, atau kirim proxy bersama setiap tugas jika pemecahan harus berasal dari jaringan tertentu. Proxy yang dikirim bersama tugas selalu diprioritaskan di atas daftar.

Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=hcaptcha. Field formulir, query string, dan body JSON semuanya diterima dengan nama field yang identik.

Kirim hCaptcha:

curl -X POST \
-d "key=YOUR_API_KEY" \
-d "method=hcaptcha" \
-d "sitekey=a5f74b19-9e45-40e0-b45d-47ff91b7a6c2" \
--data-urlencode "pageurl=https://accounts.hcaptcha.com/demo" \
-d "json=1" \
http://127.0.0.1:8080/in.php

Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.

{
    "status": 1,
    "request": "2122988149"
}

Jika tidak, CapSkip mengembalikan kode error pada permintaan pengiriman itu sendiri, sebelum pekerjaan apa pun dilakukan:

KesalahanPenyebab
ERROR_RECAPTCHA_INVALID_SITEKEYsitekey tidak ada atau kosong.
ERROR_PAGEURLpageurl tidak ada atau bukan alamat http atau https yang valid.
ERROR_PROXY_FORMATNilai proxy tidak dapat dibaca.

Tunggu sekitar 10 detik, lalu kirim permintaan HTTP GET ke endpoint hasil (/res.php) dengan CAPTCHA ID yang Anda terima.

Daftar parameter permintaan GET
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
actionStringYaTentukan get untuk mengambil solusi CAPTCHA.
idIntegerYaID CAPTCHA yang dikembalikan oleh in.php permintaan.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

Jika widget berhasil dilewati, CapSkip mengembalikan token:

{
    "status": 1,
    "request": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2",
    "respKey": "E0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjA0...9wB1",
    "useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36"
}

request adalah tokennya. respKey adalah nilai kedua yang diberikan hCaptcha kepada widget bersama token; sebagian besar situs tidak pernah membacanya, dan nilainya bisa kosong. useragent adalah User-Agent yang digunakan untuk mendapatkan token.

Tanpa json=1, token mengikuti awalan OK| sebagai teks biasa, dan User-Agent dikirim di header X-HCaptcha-User-Agent pada respons:

OK|P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2

Jika widget belum berhasil dilewati, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.

Setiap hasil hanya dikirimkan sekali. Polling pertama yang berhasil mengembalikan token lalu membuangnya, jadi simpan token dari balasan yang membawanya.

Tugas yang tidak dapat dipecahkan mengembalikan ERROR_CAPTCHA_UNSOLVABLE. Dua kegagalan justru menyebutkan penyebabnya, karena mengirim ulang tugas yang sama akan gagal lagi: ERROR_RECAPTCHA_INVALID_SITEKEY saat hCaptcha menolak sitekey untuk halaman tersebut, jadi periksa sitekey dan pageurl, dan ERROR_PROXY_CONNECT_REFUSED saat proxy tidak dapat dijangkau.

API JSON (createTask)

hCaptcha juga diterima di /createTask, dengan hasil dibaca dari /getTaskResult. Empat jenis tugas dikenali: HCaptchaTaskProxyless dan HCaptchaEnterpriseTaskProxyless memecahkan tanpa proxy milik Anda, HCaptchaTask dan HCaptchaEnterpriseTask memakai proxy. Keempatnya dipecahkan dengan cara yang sama.

ParameterTipeWajibDeskripsi
typeStringYaSalah satu dari empat jenis tugas di atas.
websiteURLStringYaURL lengkap halaman tempat widget berada.
websiteKeyStringYaSitekey widget hCaptcha.
isInvisibleBooleanTidaktrue untuk widget tak terlihat.
enterprisePayloadObjectTidakObjek yang berisi rqdata, untuk hCaptcha Enterprise. Field rqdata di tingkat atas juga diterima.
userAgentStringTidakSama seperti in.php di atas.
proxyStringTidakProxy sebagai satu string, atau proxyType, proxyAddress, proxyPort, proxyLogin dan proxyPassword sebagai field terpisah.
curl -X POST http://127.0.0.1:8080/createTask \
-H "Content-Type: application/json" \
-d '{
    "clientKey": "YOUR_API_KEY",
    "task": {
        "type": "HCaptchaTaskProxyless",
        "websiteURL": "https://accounts.hcaptcha.com/demo",
        "websiteKey": "a5f74b19-9e45-40e0-b45d-47ff91b7a6c2"
    }
}'

Solusi memuat token dua kali, dengan nama gRecaptchaResponse dan token, sehingga klien yang ditulis untuk salah satu nama tersebut dapat membacanya tanpa perubahan:

{
    "errorId": 0,
    "status": "ready",
    "solution": {
        "gRecaptchaResponse": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2",
        "token": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2",
        "respKey": "E0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjA0...9wB1",
        "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36"
    }
}

Tugas yang gagal membawa kode error yang sama seperti di res.php, yaitu di field errorCode.

Mengirimkan Token

Di halaman, widget menuliskan tokennya ke elemen textarea tersembunyi bernama h-captcha-response (dan salinannya bernama g-recaptcha-response) di dalam formulir. Masukkan token yang Anda terima ke kedua field tersebut lalu kirim formulir. Jika widget dirender dengan data-callback, panggil fungsi tersebut dengan token sebagai gantinya, seperti yang akan dilakukan widget:

document.querySelector('[name="h-captcha-response"]').value = token;
const g = document.querySelector('[name="g-recaptcha-response"]');
if (g) g.value = token;
// atau, jika widget memiliki data-callback:
window[callbackName](token);

Saat Anda mengirim formulir tanpa browser, kirim token sebagai field h-captcha-response (dan g-recaptcha-response, jika formulir memilikinya), dengan User-Agent dari balasan.

Token hCaptcha hanya sekali pakai dan kedaluwarsa sekitar dua menit setelah diterbitkan. Kirim setiap token segera setelah Anda menerimanya, dan minta token baru untuk setiap pengiriman formulir.

Sitekey Ketat

Beberapa situs, terutama situs hCaptcha Enterprise, menolak token yang dinilai berisiko oleh hCaptcha, meskipun widget berhasil dilewati. Jika situs menolak token yang dikembalikan CapSkip, aktifkan High score mode for hCaptcha di Pengaturan, Jenis captcha, hCaptcha. Mode ini memerlukan Google Chrome yang terinstal di komputer yang menjalankan CapSkip. Gunakan juga proxy yang bagus, dan kirim formulir dari alamat yang sama serta dengan User-Agent yang disebutkan dalam balasan.

aws waf captcha solver AWS WAF CAPTCHA

AWS WAF CAPTCHA adalah teka-teki yang ditampilkan Amazon Web Services ketika firewall sebuah situs meminta bukti bahwa pengunjung adalah manusia: biasanya grid berisi sembilan gambar dengan instruksi seperti “Choose all the curtains” (pilih semua gorden), terkadang sebuah mobil mainan kecil yang harus dikemudikan sampai ujung jalur. Lolos dari teka-teki ini menghasilkan cookie aws-waf-token . Kirim nilai dari halaman yang dilindungi ke CapSkip, dan CapSkip mengembalikan hasil yang diubah menjadi cookie tersebut.

Cara Kerjanya

Situs menggunakan AWS WAF CAPTCHA dalam salah satu dari dua bentuk, dan metode ini menangani keduanya:

  • Halaman challenge. Firewall menjawab permintaan dengan status HTTP 405 dan halaman kecil sebagai pengganti konten. Halaman itu memuat objek window.gokuProps dan memuat challenge.js dan captcha.js dari host awswaf.com .
  • Widget JS-API. Halaman biasa, misalnya formulir kontak atau unduhan, memuat jsapi.js dan menggambar teka-tekinya sendiri dengan AwsWafCaptcha.renderCaptcha.

Siklus lengkapnya terdiri dari empat langkah:

  1. Baca nilai yang tercantum di bawah dari halaman yang dilindungi.
  2. Kirim nilai tersebut ke /in.php dengan method=amazon_waf.
  3. Lakukan polling ke /res.php sampai jawabannya siap.
  4. Tukarkan jawaban dengan aws-waf-token lalu kirimkan bersama permintaan Anda ke situs.
Tempat Menemukan Nilai di Halaman Challenge

Minta URL yang dilindungi dan simpan body dari respons 405 , atau buka di browser dan gunakan View Page Source. Semua yang Anda butuhkan ada di HTML:

<script>
  window.gokuProps = {
    "key": "AQIDAHjcYuEXAMPLEghicBgQ/7bFaQZ+m5FKCMDnO+vTbNg96AHDh0IR5vgzHNceHYqZR+GOAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM...",
    "iv": "CgAFRDIjfgAAA5yY",
    "context": "Rbp3r8fvbuhmrCqpUe8Mh1TLvs8OSKJZiSs2vCF4dt9rxVZI7xYJa2n5k/9r+XaXe7KUIu2I8nXTDHHkDvIOTDc2..."
  };
</script>
<script src="https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/challenge.js"></script>
<script src="https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/captcha.js"></script>
Nilai di halamanKirim sebagai
gokuProps.keysitekey. Key panjang yang biasanya diawali dengan AQIDAH. Key ini mengidentifikasi konfigurasi firewall situs.
gokuProps.iviv. Berubah di setiap halaman challenge.
gokuProps.contextcontext. Berubah di setiap halaman challenge, bersama dengan iv.
URL challenge.jschallenge_script. Alamat lengkap skrip, persis seperti yang tertulis di atribut src atribut.
URL captcha.jscaptcha_script. Alamat lengkap skrip, persis seperti yang tertulis di atribut src atribut.

Hanya sitekey dan pageurl yang wajib. iv dan context dikirim bersama: kirim keduanya atau tidak sama sekali. Setiap nilai yang tidak Anda kirim dibaca dari pageurl saat penyelesaian, yang merupakan pilihan lebih aman jika salinan halaman Anda sudah lebih dari beberapa menit.

Tempat Menemukan Nilai di Halaman Widget

Buka halaman yang menampilkan teka-teki dan cari di source-nya, atau di tab Network pada developer tools browser, skrip jsapi.js dan panggilan renderCaptcha yang sama:

<script src="https://5b7e0a19c3d8.us-east-1.captcha-sdk.awswaf.com/5b7e0a19c3d8/jsapi.js"></script>
<script>
  AwsWafCaptcha.renderCaptcha(document.getElementById("captcha"), {
    apiKey: "Xr9kEXAMPLE2bWQx1vTq8LmZ0aYc4dHs7nFp3gJt6uKw5eRi...9AbCdEfGh=_0_1",
    onSuccess: function (wafToken) { /* ... */ }
  });
</script>
Nilai di halamanKirim sebagai
apiKeysitekey. Key panjang yang diakhiri sufiks pendek, misalnya _0_1. Beberapa situs menyimpannya di file JavaScript terpisah, bukan di HTML, jadi cari apiKey di skrip yang dimuat jika tidak ada di halaman.
URL jsapi.jsjsapiScript. Alamat lengkap skrip, persis seperti yang tertulis di atribut src atribut.

Halaman widget tidak memiliki gokuProps, jadi jangan kirim iv atau context. Mengirim jsapiScript tanpa keduanya itulah yang menandai permintaan sebagai penyelesaian widget.

Jenis Tantangan

AWS WAF yang menentukan teka-teki mana yang ditampilkan. Anda tidak perlu memberi tahu CapSkip mana yang akan muncul.

ChallengeTampilanDidukungDeskripsi
Grid gambar3 x 3 petakYaSembilan gambar dan instruksi seperti “Choose all the beds” (pilih semua tempat tidur), diakhiri dengan tombol Pastikan . Teka-teki yang paling umum.
Mobil mainanSatu gambarYaMobil mainan di peta jalan kecil, yang harus dipindahkan ke ujung jalurnya.

Sesekali sebuah teka-teki tidak bisa dijawab dan hasilnya adalah ERROR_CAPTCHA_UNSOLVABLE. Kirim task baru: setiap percobaan mendapat teka-teki baru.

Daftar Parameter Permintaan POST
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
methodStringYaHarus amazon_waf. Menandakan bahwa Anda mengirim AWS WAF CAPTCHA.
sitekeyStringYaThe gokuProps.key dari halaman challenge, atau apiKey.
pageurlStringYaURL lengkap http atau https URL halaman yang dilindungi AWS WAF.
ivStringTidakThe gokuProps.iv dari halaman challenge. Kirim bersama context, atau jangan kirim keduanya.
contextStringTidakThe gokuProps.context dari halaman challenge. Kirim bersama iv, atau jangan kirim keduanya.
challenge_scriptStringTidakURL lengkap skrip halaman: challenge.js.
captcha_scriptStringTidakURL lengkap skrip halaman: captcha.js.
jsapiScriptStringTidakKhusus halaman widget: URL lengkap jsapi.js.
proxyStringTidakAlamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD.
proxytypeStringTidakTipe proxy: HTTP, HTTPS, SOCKS5 atau SOCKS5H. SOCKS4 tidak diterima.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.

Setiap URL skrip yang Anda kirim harus mengarah ke host awswaf.com . Skrip dari tempat lain ditolak karena bukan integrasi AWS WAF.

Proxy

CapSkip tidak mewajibkan proxy untuk metode ini, dan satu alamat sudah cukup untuk pengujian dan penyelesaian sesekali. Lebih dari itu, Anda membutuhkan proxy. Situs yang dilindungi AWS WAF biasanya memadukan CAPTCHA dengan rate limit dan aturan reputasi IP, sehingga aliran penyelesaian terus-menerus dari satu alamat cepat mendapat perlakuan lebih ketat lalu diblokir. Konfigurasikan daftar proxy untuk AWS WAF di Pengaturan CapSkip dan biarkan CapSkip membagi beban, atau kirim proxy per permintaan ketika token harus berasal dari jaringan tertentu.

Mengirim Tugas

Kirim permintaan HTTP POST ke endpoint API CapSkip Anda (/in.php) dengan method=amazon_waf. Field formulir, body JSON, dan query string GET semuanya diterima dengan nama field yang sama. Key berisi +, / dan =, jadi lakukan URL-encode saat mengirimnya sebagai field formulir.

Kirim halaman challenge:

curl -X POST \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "method=amazon_waf" \
--data-urlencode "sitekey=AQIDAHjcYuEXAMPLEghicBgQ/7bFaQZ+m5FKCMDnO+vTbNg96AHDh0IR5vgzHNceHYqZR+GOAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM..." \
--data-urlencode "iv=CgAFRDIjfgAAA5yY" \
--data-urlencode "context=Rbp3r8fvbuhmrCqpUe8Mh1TLvs8OSKJZiSs2vCF4dt9rxVZI7xYJa2n5k/9r+XaXe7KUIu2I8nXTDHHkDvIOTDc2..." \
--data-urlencode "challenge_script=https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/challenge.js" \
--data-urlencode "pageurl=https://www.example.com/" \
--data-urlencode "json=1" \
http://127.0.0.1:8080/in.php

Kirim halaman widget (body JSON):

curl -X POST \
-H "Content-Type: application/json" \
-d '{
    "key": "YOUR_API_KEY",
    "method": "amazon_waf",
    "sitekey": "Xr9kEXAMPLE2bWQx1vTq8LmZ0aYc4dHs7nFp3gJt6uKw5eRi...9AbCdEfGh=_0_1",
    "jsapiScript": "https://5b7e0a19c3d8.us-east-1.captcha-sdk.awswaf.com/5b7e0a19c3d8/jsapi.js",
    "pageurl": "https://www.example.com/contact",
    "json": 1
}' \
http://127.0.0.1:8080/in.php

Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Dengan json=1, responsnya berupa amplop JSON:

{
    "status": 1,
    "request": "2122988149"
}

Tidak adanya sitekey, tidak validnya pageurl, sebuah iv tanpa context (atau sebaliknya), dan proxy yang formatnya salah ditolak pada permintaan ini, sebelum pekerjaan apa pun dimulai.

Mendapatkan Hasil

Tunggu sekitar 5 detik, lalu kirim permintaan HTTP GET ke /res.php dengan ID CAPTCHA. Ulangi setiap 5 detik selama jawabannya CAPCHA_NOT_READY. Sebagian besar task siap dalam 15 detik; proxy yang lambat menambah waktunya.

ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
actionStringYaTentukan get untuk mengambil solusi CAPTCHA.
idIntegerYaID CAPTCHA yang dikembalikan oleh in.php permintaan.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

Jawabannya terdiri dari dua nilai, sehingga request berupa objek, bukan string:

{
    "status": 1,
    "request": {
        "captcha_voucher": "eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ",
        "existing_token": "7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="
    }
}

Tanpa json=1, objek yang sama muncul setelah OK| dalam satu baris:

OK|{"captcha_voucher":"eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ","existing_token":"7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="}
KolomArti
captcha_voucherBukti dari AWS WAF bahwa teka-teki telah dijawab.
existing_tokenToken tempat voucher diterbitkan. Keduanya hanya berfungsi sebagai pasangan.

Jika task gagal, /res.php mengembalikan ERROR_CAPTCHA_UNSOLVABLE, atau teks error pengganti yang dikonfigurasi di CapSkip. Kirim task baru untuk mencoba lagi.

Menukar Voucher Menjadi Cookie

AWS WAF menukar pasangan ini dengan aws-waf-token final di host token miliknya: host dan folder tempat challenge.js dimuat. Di halaman widget, temukan permintaan challenge.js tersebut di tab Network; jsapi.js memuatnya untuk Anda. Ganti challenge.js dengan voucher lalu POST pasangan tersebut sebagai JSON:

curl -X POST \
-H "Content-Type: text/plain;charset=UTF-8" \
-H "Origin: https://www.example.com" \
-d '{"captcha_voucher":"eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ","existing_token":"7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="}' \
https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/voucher

Responsnya berupa objek JSON yang field token berisi aws-waf-token. Tukarkan voucher begitu diterima, jangan disimpan untuk nanti.

Menggunakan Token

Kirim token sebagai cookie aws-waf-token di domain yang dilindungi lalu ulangi permintaan yang terkena challenge. Situs kini menjawab dengan konten aslinya, bukan halaman 405 :

curl -b "aws-waf-token=7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:HgoAxEXAMPLEcookieBBBB:Q2FwU2tpcA==" \
https://www.example.com/

Di halaman widget, ini adalah token yang sama yang diterima callback onSuccess halaman. Banyak halaman semacam ini meneruskannya sebagai cookie aws-waf-token , sebagian lagi di header permintaan x-aws-waf-token , jadi periksa apa yang dikirim permintaan milik halaman itu sendiri dan tirukan.

Token berlaku selama immunity time situs, yang di AWS WAF secara default 5 menit dan dapat diperpanjang pemilik situs. Saat challenge muncul lagi, kirim task baru.

JSON API

API JSON createTask / getTaskResult juga menerima AWS WAF, sebagai AmazonTask / AmazonTaskProxyless dan AntiAwsWafTask / AntiAwsWafTaskProxyLess, dengan nama field dan format hasil dari layanan yang sedang diemulasikan CapSkip. Beberapa format tersebut langsung mengembalikan aws-waf-token final, sehingga tidak ada voucher yang perlu ditukar. Tipe ini tidak tersedia saat NextCaptcha atau EzCaptcha menjadi layanan yang dipilih.

geetest v3 GeeTest v3

GeeTest v3 Slider adalah CAPTCHA interaktif yang dikembangkan oleh GeeTest. CAPTCHA ini memverifikasi pengguna melalui tantangan penggeser untuk membedakan manusia dari bot sekaligus memberikan pengalaman verifikasi yang cepat dan mulus.

Untuk memecahkan CAPTCHA GeeTest v3 dengan CapSkip, Anda harus terlebih dahulu memperoleh parameter CAPTCHA yang diperlukan dari situs web target. Parameter yang diperlukan adalah:

  • gt: Kunci publik situs web (statis)
  • challenge: Nilai challenge dinamis
  • api_server: domain server API GeeTest (opsional)

Nilai-nilai ini biasanya tersedia ketika situs menginisialisasi GeeTest.

Penting: Baru challenge harus diperoleh untuk setiap permintaan pemecahan. Setelah CAPTCHA dimuat di halaman, nilai sebelumnya challenge menjadi tidak valid. Anda perlu memeriksa permintaan jaringan situs web tersebut untuk mengidentifikasi permintaan yang menghasilkan challenge dan lakukan permintaan itu sebelum mengirim setiap permintaan pemecahan ke CapSkip.

Daftar Parameter Permintaan POST
Parameter Tipe Wajib Deskripsi
key String Ya* Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
method String Ya Harus geetest. Menentukan bahwa Anda mengirimkan CAPTCHA GeeTest v3.
gt String Ya The gt nilai yang diperoleh dari situs target.
challenge String Ya The challenge yang diperoleh dari situs target. Nilai baru harus diperoleh untuk setiap permintaan pemecahan.
pageurl String Ya URL lengkap halaman yang berisi CAPTCHA GeeTest.
api_server String Tidak Domain server API GeeTest yang digunakan oleh situs target (misalnya api.geetest.com atau api-na.geetest.com).
json Integer
Default: 0
Tidak 0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
proxy String Tidak Alamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT.
proxytype String Tidak Jenis proxy. Nilai yang didukung: HTTP, HTTPS, SOCKS5, SOCKS5H. Default: HTTP ketika proxy disediakan tetapi proxytype dihilangkan.

Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=geetest. Sertakan parameter GeeTest yang diperlukan dari langkah sebelumnya beserta URL lengkap halaman yang memuat CAPTCHA.

curl -X POST \
-d "key=YOUR_API_KEY" \
-d "method=geetest" \
-d "gt=f1ab2cdefa3456789012345b6c78d90e" \
-d "challenge=12345678abc90123d45678ef90123a456b" \
-d "pageurl=https://www.example.com/" \
-d "api_server=api-na.geetest.com" \
http://127.0.0.1:8080/in.php

Jika semuanya berhasil, CapSkip akan mengembalikan ID CAPTCHA sebagai teks biasa: OK|212

Jika json=1 ditetapkan, respons akan dikembalikan dalam format JSON:

{
    "status": 1,
    "request": "212"
}

Jika tidak, CapSkip akan mengembalikan kode error yang sesuai.

Tunggu sekitar 5 detik, lalu kirim permintaan HTTP GET ke res.php endpoint untuk mengambil hasilnya.

Daftar parameter permintaan GET
Parameter Tipe Wajib Deskripsi
key String Ya* Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
action String Ya Tentukan get untuk mengambil solusi CAPTCHA.
id Integer Ya ID CAPTCHA yang dikembalikan oleh in.php permintaan.
json Integer
Default: 0
Tidak 0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=212&json=1"

Jika CAPTCHA berhasil dipecahkan, CapSkip akan mengembalikan solusinya dalam format JSON:

{
    "status": 1,
    "request": "{\"geetest_challenge\":\"1a2b3456cd67890e12345fab678901c2de\",\"geetest_validate\":\"09fe8d7c6ba54f32e1dcb0a9fedc8765\",\"geetest_seccode\":\"12fe3d4c56789ba01f2e345d6789c012|jordan\"}"
}

Jika CAPTCHA belum terpecahkan, CapSkip akan mengembalikan: CAPCHA_NOT_READY

Tunggu 5 detik dan ulangi permintaan. Jika terjadi kesalahan, CapSkip akan mengembalikan kode error yang sesuai. Gunakan nilai yang dikembalikan CapSkip saat mengirimkan permintaan Anda ke situs web target menggunakan kolom berikut:

  • geetest_challenge
  • geetest_validate
  • geetest_seccode

altcha solver ALTCHA

ALTCHA adalah CAPTCHA berbasis proof of work. Tidak ada gambar yang harus dibaca dan tidak ada audio yang harus diputar. Situs target menerbitkan sebuah challenge, dan klien harus melakukan brute force untuk menemukan angka yang memenuhinya. CapSkip menghitung angka tersebut dan mengembalikan payload yang seharusnya dihasilkan oleh widget.

Cara Kerjanya

Pertahanannya berupa biaya CPU, bukan pengenalan. Server menyatakan sebuah target dan rentang pencarian (maxnumber), lalu klien melakukan hash terhadap kandidat hingga salah satunya cocok. Dari situ muncul dua hal yang tidak biasa untuk sebuah tipe CAPTCHA.

Pertama, pemecahannya bersifat deterministik. Tidak ada model dan tidak ada angka akurasi, karena jawabannya ada di dalam rentang yang ditentukan atau challenge-nya memang tidak valid. Tidak pernah ada yang salah dibaca.

Kedua, waktu pemecahan ditentukan oleh situs target, bukan oleh CapSkip. Widget referensi secara default memakai rentang 1.000.000, yang hanya butuh beberapa milidetik. Situs bebas menaikkannya, dan sebagian memakai 999.999.999, yang berarti sekitar 500 juta hash untuk challenge rata-rata. Jika sebuah situs lambat dipecahkan, bacalah nilai maxnumber terlebih dahulu.

Siklus lengkapnya terdiri dari empat langkah:

  1. Ambil challenge dari endpoint tempat widget membacanya.
  2. Kirimkan ke /in.php dengan method=altcha.
  3. Lakukan polling ke /res.php hingga token siap.
  4. Kirim kembali token tersebut ke form target pada altcha kolom.
Yang Anda Butuhkan Sebelum Memecahkan

Challenge, dalam salah satu dari dua bentuk. Keduanya diterima, jadi kirim mana pun yang sudah dimiliki scraper Anda.

Parameter Gunakan saat
challenge_json Anda sudah memegang dokumen challenge. CapSkip memecahkannya secara lokal dan sama sekali tidak melakukan request jaringan, sehingga inilah jalur tercepat.
challenge_url Anda hanya memegang endpoint yang menyajikan challenge. CapSkip mengambilnya, melalui proxy Anda jika Anda mengirimkannya, lalu memecahkannya.
Tempat Menemukan Challenge

Buka developer tools browser, pindah ke tab Network pada halaman target, lalu cari request yang dibuat oleh elemen <altcha-widget> untuk mengambil challenge-nya. Biasanya berupa path seperti /altcha/challenge. URL request tersebut adalah nilai untuk challenge_url, dan JSON yang dikembalikannya adalah nilai untuk challenge_json.

Atribut widget yang menyebutkan endpoint ini berubah antar versi, jadi bacalah source halaman alih-alih berasumsi. Widget v1 dan v2 memakai challengeurl="...", sedangkan v3 dan versi setelahnya memakai challenge="..." untuk URL maupun data inline. Sebagian deployment membuat challenge di dalam halaman itu sendiri dan tidak melakukan request sama sekali.

Dokumen challenge terlihat seperti ini:

{
    "algorithm": "SHA-256",
    "challenge": "3dd28253be6cc0c54d95f7f98c517e68a1b2c3d4e5f60718293a4b5c6d7e8f90",
    "salt": "46d5b1c8871e5152d902ee3f?expires=1893456000",
    "signature": "4b1cf0e0be0f4e5247e50b0f9a4498301234567890abcdef1234567890abcdef",
    "maxnumber": 1000000
}
Challenge Kedaluwarsa, dan Jendela Waktunya Singkat

Setiap challenge membawa masa berlakunya sendiri, baik di dalam query string salt maupun sebagai parameters.expiresAt. Setelah masa itu lewat, situs target menolak solusi dengan kegagalan verifikasi polos yang terlihat persis seperti jawaban salah. Jendela waktu sesempit dua menit pun umum dijumpai.

Ambil challenge tepat sebelum membuat task, dan kirimkan token dengan segera. Jangan mengumpulkan challenge lebih awal, dan jangan menahan token selama pengguna mengisi form. Jika Anda mengirim challenge_url alih-alih challenge_json, CapSkip akan mengambil ulang secara otomatis ketika sebuah challenge kedaluwarsa saat masih berada di antrean.

Daftar Parameter Permintaan POST
Parameter Tipe Wajib Deskripsi
key String Ya* Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
method String Ya Harus altcha. Menyatakan bahwa Anda mengirimkan challenge ALTCHA.
pageurl String Ya URL lengkap halaman asal challenge tersebut.
challenge_url String Ya* Endpoint tempat CapSkip harus mengambil challenge. Wajib kecuali challenge_json dikirim.
challenge_json String Ya* Dokumen challenge itu sendiri, berupa string JSON. Wajib kecuali challenge_url dikirim.
proxy String Tidak Alamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD. Hanya digunakan untuk pengambilan challenge_url tersebut.
proxytype String Tidak Tipe proxy: HTTP, HTTPS, SOCKS5 atau SOCKS5H.
json Integer
Default: 0
Tidak 0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.

Kirim salah satu dari challenge_url atau challenge_json. Mengirim keduanya diperbolehkan, dan dokumen inline yang akan dipakai, karena pengambilan hanya akan mengambil ulang apa yang sudah Anda miliki.

Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=altcha. Form field dan JSON body sama-sama diterima dengan nama field yang identik, dan GET juga bisa digunakan, karena ALTCHA tidak membawa gambar yang perlu diunggah.

Mengirim ALTCHA (form field):

curl -X POST \
-d "key=YOUR_API_KEY" \
-d "method=altcha" \
-d "pageurl=https://www.example.com/signup" \
--data-urlencode "challenge_url=https://www.example.com/captcha/api/altcha/challenge" \
-d "json=1" \
http://127.0.0.1:8080/in.php

Mengirim ALTCHA (JSON body):

curl -X POST \
-H "Content-Type: application/json" \
-d '{
    "key": "YOUR_API_KEY",
    "method": "altcha",
    "pageurl": "https://www.example.com/signup",
    "challenge_url": "https://www.example.com/captcha/api/altcha/challenge",
    "json": 1
}' \
http://127.0.0.1:8080/in.php

JSON body memungkinkan tiga hal yang tidak bisa dilakukan oleh form encoding. Flag bisa berupa boolean asli ("json": true), challenge_json bisa berupa dokumen bersarang alih-alih string yang di-escape, dan field yang diatur ke null dianggap tidak dikirim.

Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.

{
    "status": 1,
    "request": "2122988149"
}

Jika tidak, CapSkip mengembalikan kode error yang sesuai. Challenge inline yang formatnya salah ditolak pada request pengiriman itu sendiri, bukan setelah polling, sehingga Anda langsung mengetahuinya pada request yang bermasalah.

Tunggu sekitar 5 detik, lalu kirim request HTTP GET ke endpoint hasil (/res.php) dengan CAPTCHA ID yang Anda terima.

Daftar parameter permintaan GET
Parameter Tipe Wajib Deskripsi
key String Ya* Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
action String Ya Tentukan get untuk mengambil solusi CAPTCHA.
id Integer Ya ID CAPTCHA yang dikembalikan oleh in.php permintaan.
json Integer
Default: 0
Tidak 0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

Jika CAPTCHA sudah dipecahkan, CapSkip mengembalikan solusinya dalam format JSON:

{
    "status": 1,
    "request": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiM2RkMi...",
    "solution": {
        "token": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiM2RkMi...",
        "number": 9661
    },
    "cost": "0.0020",
    "createTime": 1788863246,
    "endTime": 1788863246,
    "errorId": 0,
    "solveCount": 1
}

request dan solution.token selalu berisi string yang sama, jadi baca mana pun yang diharapkan oleh klien Anda. number adalah counter yang memecahkan challenge, dikembalikan demi kelengkapan. Tanpa json=1, jawabannya cukup berupa OK|<token>.

Jika CAPTCHA belum dipecahkan, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.

Kendalikan loop polling Anda berdasarkan errorId, bukan berdasarkan status. status adalah bilangan bulat 1 yang selalu dikembalikan oleh kontrak res.php dan itulah yang dibaca oleh setiap SDK yang kompatibel. Jika Anda menulis klien Anda berdasarkan halaman dokumentasi yang menampilkan "status": "ready", periksa errorId === 0 atau keberadaan solution.token sebagai gantinya.

Mengirimkan Token

Widget ALTCHA menempatkan payload-nya pada form field bernama altcha. Kirimkan token apa adanya pada field tersebut, persis seperti yang akan dilakukan widget:

POST https://www.example.com/signup
Content-Type: application/x-www-form-urlencoded

email=someone%40example.com&altcha=eyJhbGdvcml0aG0iOiJTSEEtMjU2Iiwi...

Bentuk internal payload mengikuti challenge yang menghasilkannya. Challenge legacy menghasilkan dokumen datar yang memuat number, sedangkan challenge PoW v2 menghasilkan dokumen yang menyarangkan challenge asli di bawah challenge dan jawabannya di bawah solution. Perlakukan token sebagai nilai opaque dan teruskan tanpa perubahan, karena situs target sudah mengetahui bentuk mana yang diharapkannya.

Sebagian integrasi justru membaca payload dari field pada JSON body, jadi periksa apa yang dikirim oleh proses submit milik halaman itu sendiri lalu tirulah. Jangan melakukan re-encode, memangkas, atau mengubah urutan token. Token tersebut adalah base64 dari sebuah dokumen JSON yang field-nya tercakup dalam tanda tangan HMAC milik server, sehingga modifikasi apa pun akan membuatnya tidak valid.

Algoritma yang Didukung

Anda tidak perlu mencari tahu skema mana yang digunakan sebuah situs. CapSkip membaca challenge dan memilih sendiri algoritmanya.

Skema Generasi Didukung Deskripsi
Legacy PoW v1 Ya Cari n yang membuat SHA(salt + n) sama dengan challenge. SHA-1, SHA-256, SHA-384, dan SHA-512 semuanya didukung. Inilah bentuk yang masih dijalankan oleh sebagian besar deployment.
PBKDF2 PoW v2 Ya Cari counter yang derived key-nya diawali dengan prefix target. SHA-256, SHA-384, dan SHA-512 didukung. Inilah default yang direkomendasikan ALTCHA sendiri.
SHA PoW v2 Ya Varian hash iteratif dari skema yang sama.
Argon2id PoW v2 Tidak Fungsi derivasi kunci yang memory hard. Ditolak, bukan dicoba.
scrypt PoW v2 Tidak Fungsi derivasi kunci yang memory hard. Ditolak, bukan dicoba.

Kedua mode effort berfungsi dan tidak memerlukan apa pun dari Anda. Pada mode deterministik , server menghitung target terlebih dahulu sehingga waktu pemecahan dapat diprediksi, sedangkan pada mode probabilistik , waktu pemecahan bervariasi dari satu challenge ke challenge berikutnya. Ketiga tipe widget (native, checkbox dan switch) didukung, karena tipe hanya menentukan gaya visual kontrol dan tidak pernah sampai ke API.

Argon2id dan scrypt ditolak, bukan dicoba. Task yang memakai salah satunya akan mengembalikan ERROR_CAPTCHA_UNSOLVABLE dalam waktu sekitar sepertiga detik dan tidak pernah dicoba ulang, sehingga tidak pernah salah dipecahkan secara diam-diam. Karena ALTCHA merekomendasikan PBKDF2 sebagai default-nya, hal ini hanya memengaruhi sebagian kecil situs.

captchafox solver CaptchaFox

CaptchaFox adalah CAPTCHA yang berfokus pada privasi dan menilai browser itu sendiri, bukan meminta pengunjung membaca apa pun. Sebagian besar pengunjung tidak pernah melihat teka-teki sama sekali. CapSkip memecahkannya dengan menjalankan widget asli di browser asli, lalu mengembalikan token verifikasi yang akan dihasilkan widget tersebut.

Cara Kerjanya

CaptchaFox mengambil keputusan dalam tiga lapisan, dan hanya lapisan terakhir yang terlihat. Widget menjalankan proof of work singkat, mengumpulkan sekumpulan besar sinyal browser, lalu mengirim keduanya ke API miliknya sendiri. Jika bukti itu memuaskan layanan tersebut, token langsung diterbitkan dan tidak ada teka-teki yang ditampilkan sama sekali. Tantangan interaktif hanya muncul ketika bukti tersebut tidak lolos.

Bentuk seperti itu punya satu konsekuensi praktis yang perlu Anda ketahui sebelum melakukan integrasi. Token dihasilkan oleh sesi browser yang sungguhan, bukan oleh perhitungan atas parameter yang Anda kirimkan, sehingga CapSkip memuat widget terhadap URL halaman Anda dan membiarkannya berjalan. Anda memberi CapSkip site key dan halamannya, lalu CapSkip mengembalikan token.

Siklus lengkapnya terdiri dari empat langkah:

  1. Baca site key dari halaman target.
  2. Kirimkan ke /in.php dengan method=captchafox.
  3. Lakukan polling ke /res.php hingga token siap.
  4. Kirim kembali token tersebut ke form target pada cf-captcha-response kolom.
Yang Anda Butuhkan Sebelum Memecahkan

Dua nilai, dan keduanya dibaca langsung dari halaman target. Tidak ada dokumen tantangan yang perlu ditangkap dan tidak ada yang kedaluwarsa selagi Anda mengantrekan tugas.

ParameterDari mana asalnya
sitekeyKunci publik yang dipakai untuk merender widget. Kunci ini bukan rahasia, sama untuk setiap pengunjung, dan secara konvensi diawali dengan sk_.
pageurlURL lengkap dari halaman tempat widget muncul. CaptchaFox memeriksanya terhadap daftar domain tempat key tersebut didaftarkan, jadi URL itu harus halaman yang sebenarnya.
Tempat Menemukan Site Key

Buka developer tools browser pada halaman target dan cari container CaptchaFox. Situs merender widget dengan salah satu dari dua cara, dan key tersebut terlihat pada keduanya.

<!-- Automatic rendering: the key is an attribute -->
<div class="captchafox" data-sitekey="sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G"></div>

<!-- Explicit rendering: the key is in the render call -->
<script>
  captchafox.render("#container", {
    sitekey: "sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G",
    onVerify: function (token) { /* ... */ }
  });
</script>

Jika keduanya tidak ada di HTML yang dikirimkan karena halaman membangun widget saat runtime, buka tab Network dan cari permintaan ke api.captchafox.com. Key tersebut adalah segmen path setelah /captcha/.

URL Halaman Harus Cocok dengan Key

Key CaptchaFox didaftarkan terhadap daftar domain yang diizinkan, dan layanan tersebut memeriksa host sebelum menerbitkan apa pun. Key yang benar tetapi dipakai pada halaman di luar daftar itu akan ditolak secara permanen, bukan sesekali.

CapSkip melaporkan kasus tersebut alih-alih mencobanya ulang, karena percobaan ulang tidak akan membantu. Jika sebuah site key langsung gagal secara konsisten, pastikan bahwa pageurl adalah halaman tempat widget benar-benar berjalan, bukan halaman pencarian, redirect, atau tautan pendek yang mengarah ke tempat lain.

Jenis Tantangan

Anda tidak memilih tantangan mana yang muncul. CaptchaFox yang menentukan, dan CapSkip menangani apa pun yang diberikan kepadanya.

ChallengeMuncul ketikaDidukungDeskripsi
InvisibleBiasanyaYaBukti dari browser memuaskan layanan tersebut dan token diterbitkan tanpa ada apa pun yang ditampilkan di layar. Ini adalah jalur yang umum dan paling cepat.
GeserTerkadangYaTeka-teki geser yang mengharuskan sebuah potongan diseret ke dalam celah. CapSkip menemukan lokasi targetnya dan menyelesaikan seretan tersebut.
Pilih gambarJarangTidakKisi gambar yang harus dipilih. Dilaporkan sebagai tidak dapat dipecahkan agar klien Anda bisa mencoba lagi ke tantangan yang baru, bukan menunggu sampai batas waktu habis.
AudioJarangTidakOpsi cadangan untuk aksesibilitas. Dilaporkan sebagai tidak dapat dipecahkan dengan alasan yang sama.

Dua tantangan yang tidak didukung itu jarang terjadi, dan percobaan ulang biasanya memunculkan tantangan yang berbeda. Perlakukan hasil tidak dapat dipecahkan sebagai sinyal untuk mengirim ulang, bukan sebagai kegagalan permanen dari key tersebut.

Daftar Parameter Permintaan POST
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
methodStringYaHarus captchafox. Menentukan bahwa Anda mengirimkan CAPTCHA CaptchaFox.
sitekeyStringYaSite key yang dibaca dari halaman target, secara konvensi berawalan sk_.
pageurlStringYaURL lengkap dari halaman tempat widget muncul.
api_serverStringTidakEntry point widget yang akan dimuat. Nilai defaultnya adalah https://cdn.captchafox.com/. Lihat Memilih Sumber Widget di bawah.
useragentStringTidakDiterima demi kompatibilitas dengan layanan lain dan tidak diterapkan. Sebagai gantinya, gunakan userAgent yang dikembalikan bersama hasil.
proxyStringTidakAlamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD.
proxytypeStringTidakTipe proxy: HTTP, HTTPS, SOCKS5 atau SOCKS5H.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.

Tidak seperti kebanyakan layanan, CapSkip tidak mewajibkan proxy untuk metode ini. Meski begitu, Anda akan membutuhkan proxy begitu mulai memecahkan dalam volume berapa pun: CaptchaFox menilai jaringan tempat widget berjalan, bukan hanya browsernya, sehingga pemecahan berulang dari satu alamat mendorong alamat itu ke arah challenge interaktif dan, setelahnya, ke arah penolakan. Satu alamat sudah cukup untuk pengujian dan pemecahan sesekali. Di luar itu, konfigurasikan proxy pool di CapSkip dan biarkan beban dibagi, atau kirim proxy per permintaan bila token harus berasal dari jaringan tertentu.

Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=captchafox. Form field dan JSON body sama-sama diterima dengan nama field yang identik, dan GET juga berfungsi, karena CaptchaFox tidak membawa gambar untuk diunggah.

Kirim CaptchaFox (kolom formulir):

curl -X POST \
-d "key=YOUR_API_KEY" \
-d "method=captchafox" \
-d "sitekey=sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G" \
-d "pageurl=https://www.example.com/signup" \
-d "json=1" \
http://127.0.0.1:8080/in.php

Kirim CaptchaFox (body JSON):

curl -X POST \
-H "Content-Type: application/json" \
-d '{
    "key": "YOUR_API_KEY",
    "method": "captchafox",
    "sitekey": "sk_xtNxpk6fCdFbxh1_xJeGflSdCE9tn99G",
    "pageurl": "https://www.example.com/signup",
    "json": 1
}' \
http://127.0.0.1:8080/in.php

Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.

{
    "status": 1,
    "request": "2122988149"
}

Jika tidak, CapSkip mengembalikan kode error yang sesuai. Site key yang hilang atau URL halaman yang tidak dapat dipakai ditolak pada permintaan submit itu sendiri, bukan setelah polling, sehingga Anda mengetahuinya pada permintaan yang memang salah.

Tunggu sekitar 5 detik, lalu kirim request HTTP GET ke endpoint hasil (/res.php) dengan ID CAPTCHA yang Anda terima. Pemecahan CaptchaFox menjalankan sesi browser sungguhan, jadi perkirakan waktunya lebih lama daripada metode berbasis perhitungan seperti ALTCHA, dan lebih lama lagi bila tantangan interaktif ditampilkan.

Daftar parameter permintaan GET
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
actionStringYaTentukan get untuk mengambil solusi CAPTCHA.
idIntegerYaID CAPTCHA yang dikembalikan oleh in.php permintaan.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

Jika CAPTCHA sudah dipecahkan, CapSkip mengembalikan solusinya dalam format JSON:

{
    "status": 1,
    "request": "177f50c25b845601e5c779cdb51b040d523e8ab69efb4d5b343e28df07d05076",
    "solution": {
        "token": "177f50c25b845601e5c779cdb51b040d523e8ab69efb4d5b343e28df07d05076",
        "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
    },
    "cost": "0.00145",
    "createTime": 1788863246,
    "endTime": 1788863262,
    "errorId": 0,
    "solveCount": 1,
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}

request dan solution.token selalu berisi string yang sama, jadi bacalah mana pun yang diharapkan oleh klien Anda. Tanpa json=1, jawabannya cukup berupa OK|<token>.

Jika solve melaporkannya, User-Agent browser dikembalikan sebagai userAgent, baik di tingkat teratas maupun di dalam solution. Dalam mode teks biasa, baca nilainya dari header X-CaptchaFox-User-Agent yang ada di respons. Kirim User-Agent tersebut saat Anda mengirim token.

Jika CAPTCHA belum dipecahkan, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.

Kendalikan loop polling Anda berdasarkan errorId, bukan berdasarkan status. status adalah bilangan bulat 1 yang selalu dikembalikan oleh kontrak res.php dan itulah yang dibaca oleh setiap SDK yang kompatibel. Jika Anda menulis klien Anda berdasarkan halaman dokumentasi yang menampilkan "status": "ready", periksa errorId === 0 atau keberadaan solution.token sebagai gantinya.

Mengirimkan Token

Widget CaptchaFox menaruh tokennya di kolom formulir bernama cf-captcha-response. Kirimkan token apa adanya pada field tersebut, persis seperti yang akan dilakukan widget:

POST https://www.example.com/signup
Content-Type: application/x-www-form-urlencoded

email=someone%40example.com&cf-captcha-response=177f50c25b845601e5c779cdb51b040d...

Sebagian integrasi justru membaca token dari field pada body JSON, jadi periksa apa yang dikirim oleh proses submit halaman itu sendiri dan tirukan. Perlakukan token sebagai nilai buram dan teruskan tanpa diubah. Token diverifikasi di sisi server terhadap sesi yang menghasilkannya, sehingga perubahan apa pun membuatnya tidak valid.

Token berumur pendek. Kirimkan segera alih-alih menahannya selagi pengguna mengisi formulir, dan pecahkan lagi bila formulir ditinggalkan lalu dilanjutkan kembali.

Memilih Sumber Widget

CaptchaFox menerbitkan widgetnya dari dua tempat, dan tempat mana yang dimuat sebuah situs menentukan bentuk token yang diharapkannya kembali. Kirim api_server hanya bila halaman target tidak memakai nilai default.

api_serverTokenBawaanDeskripsi
https://cdn.captchafox.com/BiasaYaWidget standar, dipakai oleh sebagian besar situs. Inilah yang dimuat CapSkip bila Anda tidak mengirim apa pun.
https://s.uicdn.com/mampkg/Berawalan MAM_TidakBuild paket yang disematkan sebagian platform. Build ini mengembalikan token yang berawalan MAM_. Kirimkan path paket lengkap persis seperti yang muncul di tag script halaman tersebut.

Baca nilainya dari tag <script> yang memuat widget di halaman target. Jika Anda mengirim yang salah, pemecahan tetap berhasil, tetapi token kembali dalam format yang tidak akan diterima situs target, yang terlihat seperti kegagalan verifikasi diam-diam alih-alih sebuah error.

capy puzzle solver Capy Puzzle

Capy Puzzle adalah CAPTCHA drag and drop: sebuah potongan dipotong dari sebuah foto dan pengunjung menggesernya kembali ke lubang asalnya. CapSkip mengembalikan ketiga nilai yang seharusnya ditulis widget ke dalam halaman, siap Anda kirim bersama formulir Anda.

Cara Kerjanya

Capy berbeda dari CAPTCHA lain di halaman ini karena tidak ada satu pun bagian tantangannya yang diterbitkan oleh server. Widget membuat sendiri challenge key miliknya, meminta puzzle yang sesuai dengan key tersebut kepada Capy API, lalu pengunjung menyeret potongannya ke tempatnya. Tidak ada token yang perlu diambil lebih dulu dan tidak ada handshake yang perlu diulang.

Jawabannya bukan sebuah koordinat. Widget mencatat jalur yang dilalui potongan saat diseret dan mengodekannya sebagai string, sehingga yang Anda kirimkan kembali ke situs target adalah seretan yang masuk akal, bukan sebuah titik tujuan. CapSkip menyusun jalur itu untuk Anda.

Siklus lengkapnya terdiri dari empat langkah:

  1. Baca CAPTCHA key dari halaman target.
  2. Kirimkan ke /in.php dengan method=capy.
  3. Lakukan polling ke /res.php hingga solusinya siap.
  4. Kirim ketiga nilai yang dikembalikan tersebut ke dalam formulir target.
Yang Anda Butuhkan Sebelum Memecahkan

Dua nilai, dan keduanya dibaca langsung dari halaman target.

ParameterDari mana asalnya
captchakeyCapy key publik milik situs, yang secara konvensi berawalan PUZZLE_. Key ini muncul pada kode sumber halaman sebagai capy_captchakey, dan pada URL script widget sebagai parameter k pada query string.
pageurlURL lengkap dari halaman tempat widget muncul. Capy tidak pernah melihat nilai ini, tetapi key didaftarkan terhadap situs tertentu, jadi kirimkan halaman yang sebenarnya.

Ada nilai ketiga yang perlu Anda periksa, api_server, yaitu root dari Capy API tempat key tersebut berada. Baca nilainya dari tag script yang sama. Secara default CapSkip memakai https://jp.api.capy.me, yaitu tempat layanan aktifnya berada, dan hanya perlu Anda ubah bila halaman target mengarah ke tempat lain.

Beberapa layanan pemecah CAPTCHA masih mendokumentasikan api.capy.me tanpa awalan regionalnya. Host tersebut sudah tidak dapat di-resolve lagi. Jika Anda menyalinnya dari tempat lain, hapus saja dan biarkan CapSkip memakai nilai defaultnya.

Tempat Menemukan CAPTCHA Key

Buka developer tools browser pada halaman target dan cari widget Capy. Key tersebut terlihat pada kedua cara situs memuatnya.

<!-- In the page source, as the widget configuration -->
<div id="capy"></div>
<script>
  window.capyOptions = {
    captchakey: "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
    puzzle_div: "capy"
  };
</script>

<!-- Or in the script URL itself, as the k parameter -->
<script src="https://jp.api.capy.me/puzzle/get_js/?k=PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v"></script>

Root dari URL script tersebut, https://jp.api.capy.me/ pada contoh di atas, adalah nilai api_server yang bisa Anda kirim bila memang diperlukan.

Jawabannya Tiga Nilai, Bukan Sebuah Token

Inilah satu-satunya perbedaan struktural dari semua metode lain di halaman ini, dan sebaiknya Anda membacanya sebelum menulis klien Anda. reCAPTCHA, Turnstile, dan CaptchaFox sama-sama kembali sebagai satu string buram. Solusi Capy berupa tiga nilai terpisah yang hanya berfungsi bila dipakai bersama-sama.

Nilai yang dikembalikanMasuk ke kolom formulir target
captchakeycapy_captchakey
challengekeycapy_challengekey
answercapy_answer

Karena OK|<token> polos hanya punya ruang untuk satu nilai dan bukan tiga, /res.php mengembalikan seluruh objek solusi untuk metode ini. Balasan teks biasa memuatnya, begitu pula field request pada balasan JSON. Field keempat, respKey, dikembalikan sebagai string kosong demi kompatibilitas dengan klien yang ditulis untuk layanan lain. Field ini tidak membawa apa pun untuk pemecahan puzzle dan bisa diabaikan.

Daftar Parameter Permintaan POST
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
methodStringYaHarus capy. Menentukan bahwa Anda mengirimkan CAPTCHA Capy Puzzle.
captchakeyStringYaCAPTCHA key yang dibaca dari halaman target, secara konvensi berawalan PUZZLE_. sitekey dan websiteKey diterima sebagai alias.
pageurlStringYaURL lengkap dari halaman tempat widget muncul.
api_serverStringTidakRoot dari Capy API tempat key tersebut berada. Nilai defaultnya adalah https://jp.api.capy.me.
versionString
Default: puzzle
TidakKeluarga tantangan. Hanya puzzle yang dipecahkan. Lihat Puzzle dan Avatar di bawah.
userAgentStringTidakUser-Agent yang dikirim bersama permintaan puzzle. Opsional, dan jarang diperlukan.
proxyStringTidakAlamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD.
proxytypeStringTidakTipe proxy: HTTP, HTTPS, SOCKS5 atau SOCKS5H.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.

CapSkip tidak mewajibkan proxy untuk metode ini, tetapi Anda akan membutuhkan proxy begitu mulai memecahkan dalam volume berapa pun. Setiap pemecahan mengambil puzzle baru dari Capy API lewat permintaan langsung, dan aliran permintaan seperti itu dari satu alamat persis pola yang ingin ditangkap oleh rate limiting. Satu alamat sudah cukup untuk pengujian dan pemecahan sesekali. Di luar itu, konfigurasikan proxy pool di CapSkip dan biarkan beban dibagi, atau kirim proxy per permintaan bila sebuah pemecahan harus berasal dari jaringan tertentu.

Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=capy. Kolom formulir, query string, dan body JSON semuanya diterima dengan nama field yang sama, karena Capy tidak membawa gambar untuk diunggah.

Kirim Capy Puzzle (kolom formulir):

curl -X POST \
-d "key=YOUR_API_KEY" \
-d "method=capy" \
-d "captchakey=PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v" \
-d "pageurl=https://www.example.com/login" \
-d "json=1" \
http://127.0.0.1:8080/in.php

Kirim Capy Puzzle (body JSON):

curl -X POST \
-H "Content-Type: application/json" \
-d '{
    "key": "YOUR_API_KEY",
    "method": "capy",
    "captchakey": "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
    "api_server": "https://jp.api.capy.me/",
    "pageurl": "https://www.example.com/login",
    "json": 1
}' \
http://127.0.0.1:8080/in.php

Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.

{
    "status": 1,
    "request": "2122988149"
}

Jika tidak, CapSkip mengembalikan kode error yang sesuai. CAPTCHA key yang hilang, URL halaman yang tidak dapat dipakai, atau api_server yang bukan berupa URL akan ditolak pada permintaan submit itu sendiri, bukan setelah polling, sehingga Anda mengetahuinya pada permintaan yang memang salah.

Tunggu kira-kira 3 detik, lalu kirim permintaan HTTP GET ke endpoint hasil (/res.php) dengan ID CAPTCHA yang Anda terima. Setiap pemecahan sengaja ditahan sampai mencapai durasi yang masuk akal bagi manusia sebelum dikembalikan, dengan alasan yang dijelaskan di bagian Timing di bawah.

Daftar parameter permintaan GET
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
actionStringYaTentukan get untuk mengambil solusi CAPTCHA.
idIntegerYaID CAPTCHA yang dikembalikan oleh in.php permintaan.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

Jika CAPTCHA sudah dipecahkan, CapSkip mengembalikan solusinya dalam format JSON:

{
    "status": 1,
    "request": {
        "captchakey": "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
        "challengekey": "BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP",
        "answer": "0xax8ex0xax84x0xkx7qx0x18x76x0x1ix6sx0x26x68x0x2gx5kx0x34x50x",
        "respKey": ""
    },
    "solution": {
        "captchakey": "PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v",
        "challengekey": "BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP",
        "answer": "0xax8ex0xax84x0xkx7qx0x18x76x0x1ix6sx0x26x68x0x2gx5kx0x34x50x",
        "respKey": ""
    },
    "cost": "0.00299",
    "createTime": 1788863246,
    "endTime": 1788863250,
    "errorId": 0,
    "solveCount": 1
}

request dan solution membawa objek yang sama, jadi bacalah mana pun yang diharapkan oleh klien Anda. Tanpa json=1, objek yang sama mengikuti prefiks OK| sebagai satu baris JSON, dan inilah yang akan dikembalikan oleh klien yang membaca res.php sebagai teks biasa:

OK|{"captchakey":"PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v","challengekey":"BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP","answer":"0xax8ex0xax84x0xkx7qx","respKey":""}

Jika CAPTCHA belum dipecahkan, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sebagaimana pada setiap metode lain. Tunggu 3 detik, lalu ulangi permintaan tersebut.

Setiap hasil hanya dikirimkan satu kali. Polling pertama yang berhasil mengembalikan solusinya lalu membuangnya, dan setiap polling berikutnya untuk ID yang sama mengembalikan body kosong, jadi simpan nilai dari balasan yang membawanya.

Mengirimkan Solusinya

Ketiga nilai tersebut masuk ke kolom formulir yang seharusnya diisi sendiri oleh widget Capy. Kirimkan apa adanya:

<input type="hidden" name="capy_captchakey"   value="PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v">
<input type="hidden" name="capy_challengekey" value="BalY2gJaI8uA2SGVOZhqBQ3V0CYSNNGP">
<input type="hidden" name="capy_answer"       value="0xax8ex0xax84x0xkx7qx0x18x76x0x1ix6sx">

Jangan memangkas, meng-encode ulang, atau dengan cara lain membersihkan string answer tersebut. Nilai itu adalah jalur seretan yang seharusnya dicatat oleh widget, dan backend situs target memverifikasinya terhadap tantangan yang diterbitkannya, sehingga perubahan apa pun membuatnya tidak valid.

Challenge key hanya sekali pakai dan berumur pendek. CapSkip membuat yang baru untuk setiap pemecahan dan puzzle terikat pada key itu, jadi kirimkan ketiga nilai tersebut segera alih-alih menyimpannya di cache, dan jangan pernah memakai ulang challengekey untuk pengiriman kedua.

Timing: Capy Menolak Jawaban yang Datang Terlalu Cepat

Inilah bagian dari Capy yang bisa menghabiskan waktu Anda seharian bila Anda membangunnya sendiri. Capy mengukur jeda waktu nyata antara saat puzzle diterbitkan dan saat jawaban diterima, lalu menolak apa pun yang terlihat di luar kemampuan manusia. Penolakannya memakai pesan yang sama dengan jawaban yang salah, sehingga pemecahan yang benar-benar tepat tetapi dikembalikan dalam 200 milidetik tidak dapat dibedakan dari pemecah yang rusak.

Diukur pada halaman masuk milik Capy sendiri, dengan jawaban benar yang dijaga tetap sama:

Waktu dari puzzle hingga verifikasiHasil
0.48 secondsRefused
1,03 detik ke atas, diuji hingga 4 detikAccepted

Karena itu CapSkip menahan setiap hasil sampai cukup waktu berlalu sejak puzzle digambar, kira-kira dua kali lipat dari batas bawah yang terukur, karena batas itu milik Capy dan bisa berubah. Penundaan ini diterapkan otomatis pada setiap pemecahan dan tidak ada yang perlu dikonfigurasi. Penundaan itu mengorbankan latensi, bukan throughput, dan bila Anda melakukan polling untuk hasilnya, penundaan itu tidak terlihat, karena tugasnya sekadar memakan waktu sekitar dua detik.

Puzzle dan Avatar

Capy menerbitkan dua keluarga tantangan. Keduanya merupakan tantangan yang berbeda di balik endpoint yang berbeda, dan CapSkip memecahkan salah satunya.

versionChallengeDidukungDeskripsi
puzzleAssemble a puzzleYaNilai default, dan inilah yang dipakai hampir semua penerapan. Sebuah potongan diseret kembali ke lubang tempat potongan itu dipotong.
avatarDrag an objectTidakJenis tantangan yang terpisah. Ditolak pada saat submit dengan ERROR_BAD_PARAMETERS alih-alih dijawab.

Tidak mengirim version berarti puzzle, sehingga sebagian besar integrasi tidak pernah menyetelnya. Permintaan avatar sengaja ditolak alih-alih dicoba: menjawabnya sebagai puzzle akan mengembalikan solusi yang justru ditolak situs target, dan itu lebih buruk daripada error yang jelas karena terlihat seperti pemecah yang gagal, bukan tantangan yang tidak didukung.

friendly captcha solver Friendly Captcha

Friendly Captcha meminta browser pengunjung mengerjakan sepotong hitungan aritmetika, alih-alih meminta pengunjung melakukan apa pun. Tidak ada gambar yang harus diklik, tidak ada slider dan tidak ada audio fallback, jadi tidak ada apa pun di layar yang bisa salah dikerjakan. CapSkip mengembalikan token yang seharusnya dihasilkan widget, siap Anda kirim bersama formulir Anda.

Cara Kerjanya

Friendly Captcha adalah CAPTCHA proof of work. Widget diberi sebuah setelan tingkat kesulitan, mencari nilai yang hash-nya berada di bawah ambang tersebut, lalu menuliskan hasilnya ke sebuah hidden field di formulir Anda. Tidak ada apa pun yang ditampilkan kepada pengunjung, dan justru itulah inti produknya: halaman yang memakainya terlihat seperti halaman tanpa CAPTCHA.

Ada dua protokol yang sama sekali berbeda yang beredar dengan satu nama ini, dan sitekey tidak memberi tahu Anda protokol mana yang dipakai sebuah situs. Keduanya hanya berbagi merek dan namespace sitekey, selebihnya tidak ada. Menentukan pilihan di antara keduanya adalah hal pertama yang harus benar dalam sebuah integrasi, jadi ada bagiannya sendiri di bawah.

Siklus lengkapnya terdiri dari empat langkah:

  1. Baca sitekey dari halaman target, berikut URL script widget-nya.
  2. Kirim keduanya ke /in.php dengan method=friendly_captcha.
  3. Lakukan polling ke /res.php hingga token siap.
  4. Masukkan token ke kolom formulir yang seharusnya diisi widget, lalu kirim formulirnya.

Waktu pemecahan bukan angka tetap pada metode ini. Layanan tersebut menentukan seberapa besar pekerjaan yang pantas bagi sebuah permintaan tepat pada saat permintaan itu dibuat, sehingga sitekey yang sama bisa jauh lebih mahal pada satu waktu dibanding waktu lain. Perhitungkan hal itu dalam polling Anda, alih-alih mengasumsikan durasi yang tetap.

Yang Anda Butuhkan Sebelum Memecahkan

Dua nilai bersifat wajib, dan satu nilai ketiga sebaiknya ikut dikirim setiap kali Anda bisa mendapatkannya.

ParameterDari mana asalnya
sitekeyThe data-sitekey atribut pada elemen widget, yaitu elemen yang membawa class="frc-captcha".
pageurlURL lengkap dari halaman tempat widget muncul.
module_scriptThe src dari tag script widget yang membawa type="module". Tidak wajib, tetapi justru inilah yang memberi tahu CapSkip versi protokol mana yang dipakai situs tersebut, jadi kirimkan bila halamannya memilikinya.
Versi 1 dan Versi 2

Ini bagian yang akan menghabiskan waktu Anda satu sore penuh bila Anda melewatinya. Kedua versi sama-sama aktif, keduanya dipakai, dan sitekey yang terdaftar untuk satu versi juga dilayani oleh endpoint versi lainnya. Memecahkan versi yang keliru akan memberi Anda token yang bentuknya benar tetapi ditolak situs target, tanpa petunjuk di mana pun bahwa versilah masalahnya.

versionPaket widgetDidukungDeskripsi
v1friendly-challengeYaWidget open source yang asli. Script-nya adalah widget.module.min.js atau widget.min.js. Inilah nilai default ketika tidak ada penanda lain.
v2@friendlycaptcha/sdkYaSDK yang berlaku saat ini. Script-nya adalah site.min.js. Halaman yang memuat script ini adalah v2, apa pun tampilan lainnya.

CapSkip menentukan versinya dengan urutan berikut, dan berhenti pada jawaban pertama:

  1. The version parameter, bila Anda mengirimkannya. v1 dan v2 adalah penulisan yang dikenali; sedangkan 1 atau 2 saja juga diterima.
  2. URL script widget, dari module_script atau nomodule_script. Inilah sinyal paling andal yang ada, karena inilah build yang benar-benar dimuat oleh situs tersebut.
  3. Bila keduanya tidak ada, v1.

CapSkip tidak menanyakan kepada layanan tersebut versi mana yang dimiliki sebuah sitekey, karena layanan itu akan menjawab untuk versi mana pun. Kirimkan version, atau kirimkan URL script-nya, dan pertanyaan itu tidak akan pernah muncul.

Tempat Menemukan Sitekey

Buka developer tools browser pada halaman target dan cari elemen widget-nya. Sitekey dan script-nya terletak berdekatan di dalam kode sumber halaman, dan keduanya sudah memberi Anda semua yang dibutuhkan metode ini.

<!-- Version 1: the friendly-challenge widget -->
<div class="frc-captcha" data-sitekey="FCMEXAMPLE1234AB"></div>
<script type="module" src="https://cdn.example.com/[email protected]/widget.module.min.js"></script>
<script nomodule src="https://cdn.example.com/[email protected]/widget.min.js"></script>

<!-- Version 2: the @friendlycaptcha/sdk widget -->
<div class="frc-captcha" data-sitekey="FCMEXAMPLE1234AB"></div>
<script type="module" src="https://cdn.example.com/@friendlycaptcha/[email protected]/site.min.js"></script>

Sebagian penerapan menyajikan script dari domain mereka sendiri, bukan dari CDN. Yang menentukan adalah nama file-nya, bukan host asalnya.

Daftar Parameter Permintaan POST
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
methodStringYaHarus friendly_captcha. Menentukan bahwa Anda mengirimkan Friendly Captcha.
sitekeyStringYaThe data-sitekey nilai yang dibaca dari elemen widget pada halaman target.
pageurlStringYaURL lengkap dari halaman tempat widget muncul.
versionString
Default: v1
TidakVersi protokol, v1 atau v2. Lihat Versi 1 dan Versi 2 di atas.
module_scriptStringTidakThe src dari tag script widget yang membawa type="module". Dipakai untuk menentukan versinya ketika version tidak dikirim.
nomodule_scriptStringTidakThe src dari tag script widget yang membawa nomodule. Dibaca dengan alasan yang sama.
api_serverStringTidakKhusus CapSkip. Endpoint residensi data tempat sitekey tersebut terdaftar. Menerima global (nilai default), eu, atau sebuah URL lengkap. Lihat Residensi Data di bawah.
useragentStringTidakUser-Agent yang dikirim bersama permintaan. Opsional, dan jarang diperlukan.
proxyStringTidakAlamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD.
proxytypeStringTidakTipe proxy: HTTP, HTTPS, SOCKS5 atau SOCKS5H.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.

CapSkip tidak mewajibkan proxy untuk metode ini, dan di sini Anda akan membutuhkannya lebih cepat dibanding hampir semua metode lain di halaman ini. Layanan tersebut menentukan seberapa besar pekerjaan yang pantas bagi setiap permintaan, dan menaikkan angka itu untuk alamat yang sudah sering dilihatnya: diukur pada satu sitekey dari satu alamat, setelan tingkat kesulitannya naik terus sepanjang satu sesi pengujian, dan rentang resmi antara alamat yang masih baru dan alamat yang sudah banyak dipakai mendekati tiga puluh kali lipat pekerjaan untuk token yang sama. Satu alamat sudah cukup untuk pengujian dan pemecahan sesekali. Di luar itu, konfigurasikan proxy pool di CapSkip dan biarkan beban dibagi, atau kirim proxy per permintaan bila sebuah pemecahan harus berasal dari jaringan tertentu.

Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=friendly_captcha. Kolom formulir, query string, dan body JSON semuanya diterima dengan nama field yang sama, karena metode ini tidak membawa gambar untuk diunggah.

Kirim Friendly Captcha (kolom formulir):

curl -X POST \
-d "key=YOUR_API_KEY" \
-d "method=friendly_captcha" \
-d "sitekey=FCMEXAMPLE1234AB" \
-d "pageurl=https://www.example.com/signup" \
-d "version=v2" \
-d "json=1" \
http://127.0.0.1:8080/in.php

Kirim Friendly Captcha (body JSON, dengan URL script alih-alih version yang eksplisit):

curl -X POST \
-H "Content-Type: application/json" \
-d '{
    "key": "YOUR_API_KEY",
    "method": "friendly_captcha",
    "sitekey": "FCMEXAMPLE1234AB",
    "pageurl": "https://www.example.com/signup",
    "module_script": "https://cdn.example.com/@friendlycaptcha/[email protected]/site.min.js",
    "nomodule_script": "https://cdn.example.com/@friendlycaptcha/[email protected]/site.compat.js",
    "json": 1
}' \
http://127.0.0.1:8080/in.php

Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.

{
    "status": 1,
    "request": "2122988149"
}

Jika tidak, CapSkip mengembalikan kode error yang sesuai. Sitekey yang hilang atau URL halaman yang tidak dapat dipakai akan ditolak pada permintaan submit itu sendiri, bukan setelah polling, sehingga Anda mengetahuinya pada permintaan yang memang salah.

Tunggu sekitar 5 detik, lalu kirim request HTTP GET ke endpoint hasil (/res.php) dengan CAPTCHA ID yang Anda terima.

Daftar parameter permintaan GET
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
actionStringYaTentukan get untuk mengambil solusi CAPTCHA.
idIntegerYaID CAPTCHA yang dikembalikan oleh in.php permintaan.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

Jika CAPTCHA berhasil dipecahkan, CapSkip mengembalikan token dalam format JSON. Token tersebut ada di request, dan solution.token membawa string yang sama untuk klien yang mengharapkannya di sana:

{
    "status": 1,
    "request": "c62c4da36bbaf7f253873035832709ef.aqwpWwdbzRWKY/UQAQwwpgAAAAAAAAAAM7hBvJOzqjc=.AAAAAArcCQABAAAAxv8QAAIAAACKYRgA.AgAB",
    "solution": {
        "token": "c62c4da36bbaf7f253873035832709ef.aqwpWwdbzRWKY/UQAQwwpgAAAAAAAAAAM7hBvJOzqjc=.AAAAAArcCQABAAAAxv8QAAIAAACKYRgA.AgAB"
    },
    "cost": "0.00299",
    "createTime": 1789667786,
    "endTime": 1789667807,
    "errorId": 0,
    "solveCount": 1
}

Tanpa json=1, token yang sama mengikuti prefiks OK| sebagai teks biasa, dan itulah yang akan diberikan oleh klien yang membaca res.php sebagai teks:

OK|c62c4da36bbaf7f253873035832709ef.aqwpWwdbzRWKY/UQAQwwpgAAAAAAAAAAM7hBvJOzqjc=.AAAAAArcCQABAAAAxv8QAAIAAACKYRgA.AgAB

Jika CAPTCHA belum dipecahkan, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.

Setiap hasil hanya dikirimkan satu kali. Polling pertama yang berhasil mengembalikan token lalu membuangnya, dan setiap polling berikutnya untuk ID yang sama mengembalikan body kosong, jadi simpan token dari balasan yang membawanya.

Kedua versi menghasilkan token dengan bentuk dan ukuran yang sangat berbeda. Token v1 terdiri dari empat bagian yang dipisahkan titik dan panjangnya beberapa ratus karakter, seperti contoh di atas. Token v2 berupa satu string buram yang diawali AQQA. dan panjangnya sekitar enam kilobyte, jadi pastikan apa pun yang membawanya, entah sebuah hidden field, kolom database atau permintaan yang diteruskan lewat proxy, berukuran cukup untuk itu.

Mengirimkan Token

Token tersebut masuk ke hidden field yang seharusnya diisi sendiri oleh widget, dan kedua versi tidak memakai nama field yang sama. Hal ini kerap menjebak orang yang memindahkan integrasi v1 yang sudah berjalan ke situs v2.

versionKolom formulir tempat token dimasukkan
v1frc-captcha-solution
v2frc-captcha-response
<!-- Versi 1 -->
<input type="hidden" name="frc-captcha-solution" value="c62c4da3...AgAB">

<!-- Versi 2 -->
<input type="hidden" name="frc-captcha-response" value="AQQA.vW7kd3CujKT8PaQgEcW18QaH...">

Kirim token apa adanya. Jangan memangkasnya, meng-encode ulang, atau membuang karakter yang tampak seperti padding: setiap bagiannya diverifikasi terhadap tantangan yang menerbitkannya, sehingga perubahan apa pun membuatnya tidak valid.

Sebuah situs bebas mengganti nama field tersebut, dan sebagian memang melakukannya. Bila halaman yang Anda integrasikan memakai nama lain, baca nama itu dari elemen widget dan pakai nama tersebut. Bila halaman itu mendefinisikan sebuah callback untuk widget-nya, memanggil callback tersebut dengan token sebagai satu-satunya argumen memberi hasil yang sama.

Residensi Data

Friendly Captcha menjalankan endpoint terpisah untuk wilayah residensi data yang berbeda, dan setiap sitekey hanya milik salah satunya. Keduanya akan menerbitkan token untuk sitekey yang sama, sehingga mengirim permintaan ke endpoint yang keliru menghasilkan token yang di sini terlihat sepenuhnya valid tetapi ditolak situs target tanpa keterangan yang lebih berguna selain verifikasi yang gagal.

Widget menyebutkan wilayahnya melalui atribut data-api-endpoint pada elemennya. Bila halaman target memilikinya, kirimkan nilai yang sama sebagai api_server. Parameter ini khusus CapSkip dan tidak memiliki padanan di tempat lain, jadi klien yang ditulis untuk layanan lain tidak akan mengirimkannya: tambahkan sendiri ketika halaman target berada di endpoint regional.

api_serverYang dipilih
globalNilai default. Dipakai ketika atributnya tidak ada, dan itulah kasus yang umum.
euEndpoint Eropa, dipilih dengan data-api-endpoint="eu".
A full URLPenerapan self hosted atau penerapan kustom lainnya. Kirim endpoint persis seperti yang diberikan halaman tersebut.

datadome solver DataDome

DataDome adalah perlindungan bot di balik banyak toko besar, situs berita, dan marketplace. Saat meragukan seorang pengunjung, situs menjawab dengan halaman blokir alih-alih kontennya, dan halaman itu berisi slider atau pemeriksaan perangkat singkat. Lolos dari tantangan itu akan memasang cookie datadome yang membuat permintaan yang membawanya diloloskan. CapSkip melewati tantangan yang Anda kirim dan mengembalikan cookie tersebut, sehingga skrip yang tidak memiliki browser sendiri tetap dapat terus mengambil data dari situs.

Cara Kerjanya

Permintaan yang diblokir kembali dengan status 403 (terkadang 401) dan halaman HTML kecil. Halaman itu memuat objek skrip, var dd={...}, dan memuat tantangan di dalam iframe dari geo.captcha-delivery.com. Alamat iframe inilah yang dibutuhkan CapSkip: alamat ini disebut captcha_url di bawah.

DataDome menampilkan dua jenis tantangan, dan CapSkip menangani keduanya melalui satu metode ini:

  • Slider. Jalur iframe-nya adalah /captcha/ dan pengunjung menggeser slider, terkadang ke sebuah kepingan puzzle.
  • Pemeriksaan perangkat. Jalur iframe-nya adalah /interstitial/ dan halaman menampilkan “Verifying the device” selama beberapa detik. Jika pemeriksaan tidak terpenuhi, DataDome beralih ke slider, dan CapSkip mengikutinya.

Siklus lengkapnya terdiri dari empat langkah:

  1. Kirim permintaan ke halaman target dan terima halaman blokir DataDome.
  2. Susun captcha_url dari halaman tersebut (lihat di bawah), lalu kirimkan ke /in.php dengan method=datadome.
  3. Lakukan polling ke /res.php hingga cookie siap.
  4. Ulangi permintaan Anda dengan cookie tersebut, User-Agent yang sama, dan alamat IP yang sama.

Pemecahan biasanya memakan waktu antara 3 dan 20 detik. Pemeriksaan perangkat berada di ujung singkat rentang tersebut, sedangkan slider di ujung panjang.

Cookie Terikat pada Satu IP dan Satu Browser

DataDome mengikat cookie ke alamat IP dan User-Agent yang mendapatkannya. Cookie yang dipakai ulang dari alamat lain, atau dengan User-Agent lain, biasanya ditolak dan halaman blokir muncul kembali. Dari situ berlaku dua aturan:

  • Pemecahan harus berasal dari alamat yang akan Anda gunakan untuk memakai cookie. Jika permintaan Anda keluar melalui proxy, kirim proxy tersebut bersama tugas. Jika permintaan berasal dari komputer yang menjalankan CapSkip, jangan kirim proxy.
  • Kirim User-Agent yang akan Anda gunakan. User-Agent tersebut harus Chrome untuk Windows dengan versi mayor yang sama dengan browser yang digunakan CapSkip untuk memecahkan. User-Agent lain akan menghasilkan cookie yang ditolak situs, sehingga langsung ditolak sejak awal dengan ERROR_WRONG_USERAGENT. User-Agent Firefox, Safari, Edge, dan seluler ditolak dengan alasan yang sama.

Jika halaman blokir itu sendiri menyatakan bahwa alamat tersebut dicekal, tidak ada yang dikirim dari alamat itu yang bisa lolos, sehingga tugas langsung ditolak dengan ERROR_PROXY_BANNED alih-alih dicoba. Anda dapat mengenalinya lebih awal: objek dd berisi 't':'bv' alih-alih 't':'fe'. Ganti alamat dan minta halaman itu lagi.

Menyusun captcha_url

Jika halaman blokir yang Anda terima sudah berisi iframe, ambil atribut src tersebut apa adanya. Sebagian besar halaman blokir justru membangun iframe dengan skrip, sehingga Anda menyusun alamat yang sama dari objek dd tersebut. Halaman blokir terlihat seperti ini:

<script>
var dd={'rt':'c','cid':'AHrlqAAAAAMA7KBvCr0n4cEAG330MA==','hsh':'D013AA612AB2224D03B2318D0F5B19','t':'fe','s':45225,'e':'549255a0289eaf17af60822309ab8db4','host':'geo.captcha-delivery.com','cookie':'KzE6_pZBBTHdCdvZkauT9VAshi0wS7~v5_M_MacEtdw8'}
</script>
<script src="https://ct.captcha-delivery.com/c.js"></script>

Nilai dari rt menentukan jalurnya: c berarti https://geo.captcha-delivery.com/captcha/ dan i berarti https://geo.captcha-delivery.com/interstitial/. Query string disusun dari field lainnya:

Parameter URLNilai
initialCidThe cid kolom.
hashThe hsh kolom.
cidThe cookie kolom.
tThe t field. Hanya ada pada /captcha/ saja.
refererURL halaman yang Anda minta.
sThe s kolom.
eThe e field, jika ada.
bThe b field. Hanya ada pada /interstitial/ saja.
dmSelalu cd.

Lakukan URL encode pada setiap nilai. Dalam JavaScript:

const dd = JSON.parse(html.match(/var dd=(\{[^}]*\})/)[1].replace(/'/g, '"'));
const path = dd.rt === 'i' ? 'interstitial' : 'captcha';
const q = new URLSearchParams({ initialCid: dd.cid, hash: dd.hsh, cid: dd.cookie });
if (dd.t) q.set('t', dd.t);
q.set('referer', pageUrl);
q.set('s', dd.s);
if (dd.e) q.set('e', dd.e);
if (dd.b) q.set('b', dd.b);
q.set('dm', 'cd');
const captchaUrl = `https://${dd.host || 'geo.captcha-delivery.com'}/${path}/?${q}`;

Setiap halaman blokir adalah tantangan baru. Kirimkan segera setelah Anda menerimanya, dan minta halaman itu lagi untuk tugas berikutnya alih-alih memakai ulang salinan lama dari captcha_url.

Daftar Parameter Permintaan POST
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
methodStringYaHarus datadome. Menandakan bahwa Anda mengirim tantangan DataDome.
captcha_urlStringYaAlamat iframe tantangan di geo.captcha-delivery.com. Lihat Menyusun captcha_url di atas.
pageurlStringYaURL lengkap halaman yang mengembalikan halaman blokir.
userAgentStringTidakUser-Agent yang akan Anda kirim bersama cookie: Chrome untuk Windows, dengan versi mayor yang sama dengan browser yang digunakan CapSkip untuk memecahkan. Jika Anda tidak mengirimkannya, CapSkip menggunakan User-Agent browser tersebut, dan balasan menyebutkannya sehingga Anda dapat menyalinnya apa adanya.
proxyStringTidakAlamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD. Kirim proxy yang akan digunakan oleh permintaan Anda berikutnya.
proxytypeStringTidakTipe proxy: HTTP, HTTPS, SOCKS5 atau SOCKS5H.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.

CapSkip tidak mewajibkan proxy untuk metode ini. Satu alamat sudah cukup untuk pengujian dan pemecahan sesekali. Lebih dari itu, DataDome menilai alamat sama ketatnya dengan browser, dan aliran halaman blokir yang terus-menerus dari satu IP berakhir dengan pencekalan IP tersebut di situs itu. Pada volume besar, kirim permintaan dan tugas Anda melalui kumpulan proxy residensial, satu proxy per tugas, dan gunakan setiap cookie melalui proxy yang mendapatkannya. Gunakan proxy sticky, yaitu proxy yang mempertahankan IP keluar yang sama setidaknya selama beberapa menit. Proxy yang mengganti IP-nya di setiap koneksi tidak dapat menghasilkan cookie yang berfungsi: challenge dimuat dari beberapa alamat, dan cookie ditolak dari alamat berikutnya.

CapSkip juga memiliki daftar proxy DataDome sendiri, di Pengaturan, Jenis captcha, DataDome, Konfigurasi Proxy. Tugas yang dikirim tanpa proxy dipecahkan melalui daftar tersebut. Biarkan kosong kecuali permintaan yang membawa cookie juga melewati proxy yang sama, karena cookie hanya akan berfungsi dari alamat yang memecahkannya. Balasan menyebutkan proxy yang digunakan setiap tugas. Proxy yang dikirim bersama tugas selalu lebih diprioritaskan daripada daftar tersebut.

Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=datadome. Field formulir, query string, dan body JSON semuanya diterima dengan nama field yang identik.

Kirim DataDome:

curl -X POST \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "method=datadome" \
--data-urlencode "captcha_url=https://geo.captcha-delivery.com/captcha/?initialCid=AHrlqAAAAAMA7KBvCr0n4cEAG330MA%3D%3D&hash=D013AA612AB2224D03B2318D0F5B19&cid=KzE6_pZBBTHdCdvZkauT9VAshi0wS7~v5_M_MacEtdw8&t=fe&referer=https%3A%2F%2Fwww.example.com%2F&s=45225&e=549255a0289eaf17af60822309ab8db4&dm=cd" \
--data-urlencode "pageurl=https://www.example.com/" \
--data-urlencode "userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36" \
--data-urlencode "proxy=login:[email protected]:8080" \
--data-urlencode "proxytype=HTTP" \
--data-urlencode "json=1" \
http://127.0.0.1:8080/in.php

Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.

{
    "status": 1,
    "request": "2122988149"
}

Jika tidak, CapSkip mengembalikan kode error pada permintaan pengiriman itu sendiri, sebelum pekerjaan apa pun dilakukan:

KesalahanPenyebab
ERROR_BAD_PARAMETERScaptcha_url tidak ada atau bukan alamat tantangan DataDome.
ERROR_PAGEURLpageurl tidak ada atau bukan alamat http atau https yang valid.
ERROR_WRONG_USERAGENTUser-Agent bukan Chrome untuk Windows dengan versi mayor yang digunakan CapSkip untuk memecahkan.
ERROR_PROXY_BANNEDHalaman blokir menyatakan bahwa alamat ini dicekal (t=bv).
ERROR_PROXY_FORMATNilai proxy tidak dapat dibaca.

Tunggu sekitar 5 detik, lalu kirim request HTTP GET ke endpoint hasil (/res.php) dengan CAPTCHA ID yang Anda terima.

Daftar parameter permintaan GET
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
actionStringYaTentukan get untuk mengambil solusi CAPTCHA.
idIntegerYaID CAPTCHA yang dikembalikan oleh in.php permintaan.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

Jika tantangan berhasil dilewati, CapSkip mengembalikan cookie persis seperti yang ditetapkan DataDome, termasuk atributnya:

{
    "status": 1,
    "request": "datadome=FAPPpli4jkT1MZGtgF8ez7mjSz8MrJ9fGRNE51Gj79cq9fXp5xn~F1P5APWjqvJojf4U9dq0R81Xaj2hpYtjle95mkg; Max-Age=31536000; Domain=.example.com; Path=/; Secure; SameSite=Lax",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
    "proxy": "203.0.113.10:8080"
}

userAgent adalah User-Agent yang digunakan saat cookie diperoleh: yang Anda kirim, atau yang digunakan CapSkip jika Anda tidak mengirimkannya. Kirimkan bersama setiap permintaan yang membawa cookie.

proxy hanya muncul jika tugas Anda tidak mengirim proxy dan CapSkip mengambil satu dari daftar proxy DataDome miliknya. Isinya adalah proxy tersebut dalam format host:port, tanpa login, dan cookie hanya berfungsi melaluinya. Jika tugas mengirim proxy sendiri, atau CapSkip memecahkan tanpa proxy, field ini tidak ada.

Tanpa json=1, cookie muncul setelah awalan OK| sebagai teks biasa, dan dua nilai yang sama dikirim dalam header X-DataDome-User-Agent dan X-DataDome-Proxy pada respons.

OK|datadome=FAPPpli4jkT1MZGtgF8ez7mjSz8MrJ9fGRNE51Gj79cq9fXp5xn~F1P5APWjqvJojf4U9dq0R81Xaj2hpYtjle95mkg; Max-Age=31536000; Domain=.example.com; Path=/; Secure; SameSite=Lax

Jika tantangan belum dilewati, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.

Setiap hasil dikirimkan satu kali. Polling pertama yang berhasil mengembalikan cookie lalu membuangnya, jadi simpan cookie dari balasan yang membawanya.

Tugas yang tidak dapat dilewati mengembalikan ERROR_CAPTCHA_UNSOLVABLE. Dua kegagalan justru menyebutkan alamatnya, karena mengirim ulang melalui alamat itu akan gagal lagi: ERROR_PROXY_BANNED saat DataDome mencekal alamat tersebut selama pemecahan, dan ERROR_PROXY_CONNECT_REFUSED saat proxy tidak dapat dijangkau.

Menggunakan Cookie

Bagian sebelum titik koma pertama adalah cookie itu sendiri. Kirimkan bersama permintaan Anda berikutnya, melalui proxy yang sama dan dengan User-Agent yang sama yang Anda kirim dalam tugas:

curl "https://www.example.com/" \
-x "http://login:[email protected]:8080" \
-A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36" \
-b "datadome=FAPPpli4jkT1MZGtgF8ez7mjSz8MrJ9fGRNE51Gj79cq9fXp5xn~F1P5APWjqvJojf4U9dq0R81Xaj2hpYtjle95mkg"

Jika Anda menggunakan cookie jar, Anda dapat menyimpan seluruh string sebagai gantinya: Domain, Path dan Max-Age adalah nilai yang dipilih DataDome untuk situs tersebut.

DataDome dapat mengirim cookie datadome pengganti pada respons berikutnya. Simpan yang terbaru, seperti yang dilakukan browser. Jika halaman blokir tetap muncul kembali, situs telah memutuskan untuk menantang lagi: susun captcha_url baru dari halaman itu dan kirim tugas baru.

mtcaptcha solver MTCaptcha

MTCaptcha adalah CAPTCHA teks yang dipakai pada formulir login, pendaftaran, dan kontak. Pengunjung mengetik karakter terdistorsi yang ditampilkan dalam gambar, lalu widget memasukkan token terverifikasi ke formulir. CapSkip menerima sitekey dan alamat halaman yang Anda kirim, lalu mengembalikan token MTCaptcha yang valid dan siap dikirim bersama formulir.

Cara Kerjanya

Widget MTCaptcha dikonfigurasi di halaman dengan sitekey yang diawali MTPublic-. Saat pengunjung lolos tantangan, MTCaptcha menerbitkan token yang diawali v1(, dan widget menuliskannya ke kolom formulir tersembunyi bernama mtcaptcha-verifiedtoken. Situs memeriksa token tersebut ke MTCaptcha saat formulir diterima.

CapSkip hanya membutuhkan sitekey dan alamat halaman. Anda tidak perlu memuat atau memecahkan widget sendiri: gambar yang tampil di browser Anda tidak pernah dikirim, dan token yang dikembalikan CapSkip diterima dengan sendirinya. Siklus lengkapnya terdiri dari tiga langkah:

  1. Kirim sitekey dan URL halaman ke /in.php dengan method=mt_captcha.
  2. Lakukan polling ke /res.php hingga token siap.
  3. Kirim formulir dengan token di mtcaptcha-verifiedtoken.
Menemukan Sitekey

Sebagian besar halaman mengonfigurasi widget dengan objek mtcaptchaConfig di sumber halaman:

<script>
var mtcaptchaConfig = {
  "sitekey": "MTPublic-KzqLY1cKH",
  "action": "login"
};
</script>

Salin sitekey persis seperti yang tertulis. Jika objek tersebut juga menetapkan action, kirim juga nilai itu. Jika widget sudah tampil di layar, sitekey yang sama ada di alamat iframe-nya di service.mtcaptcha.com, di query string-nya sebagai sitekey.

Daftar Parameter Permintaan POST
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
methodStringYaHarus mt_captcha. Menandakan bahwa Anda mengirim tantangan MTCaptcha. mtcaptcha juga diterima.
sitekeyStringYaSitekey MTCaptcha dari halaman, diawali dengan MTPublic-.
pageurlStringYaURL lengkap halaman tempat widget berada. MTCaptcha hanya menerbitkan token untuk domain tempat sitekey didaftarkan, jadi kirim alamat halaman yang sebenarnya.
actionStringTidakNama action yang ditetapkan halaman di objek mtcaptchaConfig miliknya, jika ada.
userAgentStringTidakUser-Agent yang dikirim ke MTCaptcha. Jika Anda tidak mengirimnya, CapSkip memakai User-Agent Chrome untuk Windows.
proxyStringTidakAlamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD.
proxytypeStringTidakTipe proxy: HTTP, HTTPS, SOCKS4, SOCKS5 atau SOCKS5H.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.

CapSkip tidak mewajibkan proxy untuk metode ini. Satu alamat cukup untuk pengujian dan pemecahan sesekali. Lebih dari itu, siapkan pool proxy: setiap pemecahan meminta tantangan baru dari layanan MTCaptcha, dan aliran permintaan terus-menerus dari satu alamat adalah hal yang memang ditangkap oleh rate limiting. Tambahkan pool di Pengaturan, Jenis captcha, MTCaptcha, Konfigurasi Proxy, dan tugas yang dikirim tanpa proxy akan dibagi ke pool tersebut. Kirim proxy bersama tugas jika pemecahan harus berasal dari jaringan tertentu. Proxy yang dikirim bersama tugas selalu lebih diutamakan daripada daftar.

Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=mt_captcha. Field formulir, query string, dan body JSON semuanya diterima dengan nama field yang identik.

Kirim MTCaptcha:

curl -X POST \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "method=mt_captcha" \
--data-urlencode "sitekey=MTPublic-KzqLY1cKH" \
--data-urlencode "pageurl=https://www.example.com/login" \
--data-urlencode "action=login" \
--data-urlencode "json=1" \
http://127.0.0.1:8080/in.php

Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.

{
    "status": 1,
    "request": "2122988149"
}

Jika tidak, CapSkip mengembalikan kode error pada permintaan pengiriman itu sendiri, sebelum pekerjaan apa pun dilakukan:

KesalahanPenyebab
ERROR_BAD_PARAMETERSsitekey tidak ada atau bukan sitekey MTCaptcha (MTPublic- diikuti huruf, angka, - atau _).
ERROR_PAGEURLpageurl tidak ada atau bukan alamat http atau https yang valid.
ERROR_PROXY_FORMATNilai proxy tidak dapat dibaca.

Tunggu sekitar 5 detik, lalu kirim request HTTP GET ke endpoint hasil (/res.php) dengan CAPTCHA ID yang Anda terima.

Daftar parameter permintaan GET
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
actionStringYaTentukan get untuk mengambil solusi CAPTCHA.
idIntegerYaID CAPTCHA yang dikembalikan oleh in.php permintaan.
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

Jika tantangan sudah lolos, CapSkip mengembalikan token MTCaptcha:

{
    "status": 1,
    "request": "v1(23ed91f2,61d9f4fe,MTPublic-KzqLY1cKH,079c683122559a6f**)"
}

Tanpa json=1, token mengikuti awalan OK| sebagai teks biasa:

OK|v1(23ed91f2,61d9f4fe,MTPublic-KzqLY1cKH,079c683122559a6f**)

Jika tantangan belum dilewati, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.

Setiap hasil hanya dikirimkan sekali. Polling pertama yang berhasil mengembalikan token lalu membuangnya, jadi simpan token dari balasan yang membawanya.

Tugas yang tidak dapat dilewati mengembalikan ERROR_CAPTCHA_UNSOLVABLE. Dua kegagalan justru menunjuk tugasnya, karena mengirim ulang tanpa perubahan akan gagal lagi: ERROR_RECAPTCHA_INVALID_SITEKEY saat MTCaptcha tidak mengenali sitekey, dan ERROR_RECAPTCHA_INVALID_DOMAIN saat sitekey tidak diizinkan di domain pageurl. Kedua kode tetap memakai nama lamanya dan berlaku untuk semua metode.

Mengirimkan Token

Masukkan token ke kolom formulir mtcaptcha-verifiedtoken lalu kirim formulir seperti yang dilakukan halaman. Jika Anda mengirim formulir sendiri:

curl -X POST "https://www.example.com/login" \
--data-urlencode "username=alice" \
--data-urlencode "password=YOUR_PASSWORD" \
--data-urlencode "mtcaptcha-verifiedtoken=v1(23ed91f2,61d9f4fe,MTPublic-KzqLY1cKH,079c683122559a6f**)"

Di browser yang Anda kendalikan, isi kolom tersembunyi sebelum formulir dikirim:

document.querySelector('input[name="mtcaptcha-verifiedtoken"]').value = token;

Token berumur pendek dan sekali pakai: MTCaptcha hanya menerimanya satu kali, dan hanya dalam beberapa menit setelah diterbitkan. Gunakan segera setelah diterima, dan minta token baru untuk setiap pengiriman formulir. Situs memverifikasi token di servernya sendiri dengan panggilan checktoken milik MTCaptcha, yang memeriksa sitekey dan domain, sehingga token hanya berlaku di situs tempat token itu diminta.

Menggunakan Proxy

Untuk reCAPTCHA v2, v3, Invisible, Enterprise, Cloudflare, GeeTest, ALTCHA, CaptchaFox, Capy Puzzle, dan Friendly Captcha, Anda dapat mengirimkan proxy bersama setiap tugas. CapSkip akan memecahkan CAPTCHA melalui proxy tersebut alih-alih menggunakan kumpulan proxy yang dikonfigurasi di aplikasi CapSkip.

Ini berguna ketika situs web target memeriksa bahwa token CAPTCHA dihasilkan dari alamat IP yang sama dengan permintaan Anda sendiri, misalnya situs di balik Cloudflare, penilaian reCAPTCHA yang ketat, atau halaman yang dibatasi secara geografis.

Daftar Parameter Permintaan POST
Parameter Tipe Wajib Deskripsi
proxy String Tidak Alamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT
proxytype String Tidak Jenis proxy. Nilai yang didukung: HTTP, HTTPS, SOCKS5, SOCKS5H. Default: HTTP ketika proxy disediakan tetapi proxytype dihilangkan.

Kode Kesalahan

KodeArti
ERROR_KEY_DOES_NOT_EXISTKunci API tidak valid.
ERROR_WRONG_USER_KEYKunci API tidak ada atau kosong.
ERROR_WRONG_METHODMetode HTTP tidak valid atau action parameter.
ERROR_WRONG_ID_FORMATFormat ID captcha tidak valid.
ERROR_BAD_PARAMETERSParameter wajib hilang atau tidak valid.
ERROR_UPLOADTidak ada data gambar yang diberikan atau unggahan gagal.
ERROR_INVALID_IMAGEFormat gambar tidak valid atau data gambar rusak.
ERROR_INVALID_BASE64Pengodean base64 tidak valid.
ERROR_TOO_BIG_CAPTCHA_FILESIZEUkuran gambar melebihi 600 kB atau dimensinya melebihi 1000px.
ERROR_CAPTCHA_UNSOLVABLEGagal memecahkan captcha. Kirim tugas baru dan coba lagi.
ERROR_GOOGLEKEYTidak valid googlekey parameter.
ERROR_PAGEURLTidak valid pageurl parameter.
ERROR_ZERO_BALANCEAPI key tidak lagi memiliki kredit untuk metode ini.
ERROR_PROXY_FORMATThe proxy tidak dapat diuraikan.
ERROR_TASK_NOT_SUPPORTEDJenis tugas tidak didukung, atau pengaturannya dinonaktifkan di CapSkip.
ERROR_PROXY_MISSINGTugas ini memerlukan proxy, dan permintaan tidak membawa proxy yang dapat digunakan.
ERROR_WRONG_USERAGENTUser-Agent dalam permintaan tidak dapat digunakan untuk tugas ini.
ERROR_PROXY_BANNEDSitus target memblokir alamat proxy. Gunakan proxy lain.
ERROR_PROXY_CONNECT_REFUSEDTarget tidak dapat dijangkau melalui proxy.
ERROR_RECAPTCHA_INVALID_SITEKEYThe sitekey tidak ada, atau layanan CAPTCHA menolaknya untuk halaman ini.
ERROR_RECAPTCHA_INVALID_SITEKEYPenyedia CAPTCHA tidak mengenali sitekey. Periksa sitekey yang Anda kirim.
ERROR_RECAPTCHA_INVALID_DOMAINSitekey tidak diizinkan di domain pageurl. Kirim alamat halaman tempat widget sebenarnya berada.
CAPCHA_NOT_READYCaptcha masih diproses. Lanjutkan polling.
(respons kosong)Hasilnya sudah diambil, atau ID tersebut tidak ada.