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 mengirimkan permintaan dan mengambil hasil. CapSkip mendukung beberapa keluarga API, termasuk API bergaya 2Captcha (in.php / res.php), API JSON createTask / getTaskResult yang dipakai AntiCaptcha, CapMonster, dan CapSolver, serta API REST 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
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 POSTTipeWajibDeskripsi
keyStringYa Kunci API CapSkip Anda.
methodStringYa post: kirim gambar menggunakan multipart/form-data
base64: kirim gambar sebagai string berenkode Base64
fileFileYa* File gambar CAPTCHA.
* Wajib saat method=post.
bodyStringYa* Data gambar CAPTCHA berenkode Base64.
* Wajib saat method=base64.
jsonInteger
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 GETTipeWajibDeskripsi
keyStringYa Kunci API CapSkip Anda.
actionStringYa get: ambil jawaban untuk CAPTCHA yang dikirimkan.
idIntegerYa ID CAPTCHA yang dikembalikan oleh in.php.
jsonInteger
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
ParameterTipeWajibDeskripsi
keyStringYa Kunci API CapSkip Anda.
methodStringYa userrecaptcha: menentukan permintaan reCAPTCHA v2.
googlekeyStringYa Nilai dari k atau data-sitekey parameter yang ditemukan di halaman target.
pageurlStringYa URL lengkap halaman tempat reCAPTCHA berada.
enterpriseInteger
Default: 0
Tidak 1: menandakan reCAPTCHA Enterprise v2.
0: reCAPTCHA v2 standar.
invisibleInteger
Default: 0
Tidak 1: menandakan Invisible reCAPTCHA.
0: reCAPTCHA checkbox standar.
data-sStringTidak Nilai dari data-s yang ditemukan pada halaman. Berlaku untuk Google Search dan layanan Google tertentu.
jsonInteger
Default: 0
Tidak 0: respons dikembalikan sebagai teks biasa.
1: respons dikembalikan dalam format JSON.
proxyStringTidakAlamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT
proxytypeStringTidakJenis 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 GETTipeWajibDeskripsi
keyStringYa Kunci API CapSkip Anda.
actionStringYa get: ambil jawaban untuk CAPTCHA yang dikirimkan.
idIntegerYa ID CAPTCHA yang dikembalikan oleh in.php.
jsonInteger
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"

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

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
ParameterTipeWajibDeskripsi
keyStringYa Kunci API CapSkip Anda.
methodStringYa userrecaptcha: menentukan permintaan reCAPTCHA.
versionStringYa v3: menunjukkan bahwa permintaan tersebut untuk reCAPTCHA v3.
googlekeyStringYa Nilai dari data-sitekey parameter yang ditemukan di halaman target.
pageurlStringYa URL lengkap halaman tempat reCAPTCHA berada.
enterpriseInteger
Default: 0
Tidak 1: menandakan reCAPTCHA Enterprise v3.
0: reCAPTCHA v3 standar.
actionString
Default: verify
Tidak Nilai dari action parameter yang didefinisikan di halaman.
min_scoreFloatTidak 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.
jsonInteger
Default: 0
Tidak 0: respons dikembalikan sebagai teks biasa.
1: respons dikembalikan dalam format JSON.
proxyStringTidakAlamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT
proxytypeStringTidakJenis 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

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 GETTipeWajibDeskripsi
keyStringYa Kunci API CapSkip Anda.
actionStringYa get: ambil jawaban untuk CAPTCHA yang dikirimkan.
idIntegerYa ID CAPTCHA yang dikembalikan oleh in.php.
jsonInteger
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"

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
ParameterTipeWajibDeskripsi
keyStringYa Kunci API CapSkip Anda.
methodStringYa turnstile: menentukan permintaan Cloudflare Turnstile.
sitekeyStringYa Nilai dari data-sitekey parameter yang ditemukan di halaman target.
pageurlStringYa URL lengkap halaman tempat challenge Turnstile berada.
actionStringTidak Nilai action opsional yang didefinisikan di data-action atribut atau diteruskan ke turnstile.render().
dataStringTidak Nilai dari cData yang diteruskan ke turnstile.render() atau didefinisikan di data-cdata atribut.
pagedataStringTidak Nilai dari chlPageData yang diteruskan ke turnstile.render().
jsonInteger
Default: 0
Tidak 0: respons dikembalikan sebagai teks biasa.
1: respons dikembalikan dalam format JSON.
proxyStringTidakAlamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT
proxytypeStringTidakJenis 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 (challenge; 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 GETTipeWajibDeskripsi
keyStringYa Kunci API CapSkip Anda.
actionStringYa get: ambil jawaban untuk CAPTCHA yang dikirimkan.
idIntegerYa ID CAPTCHA yang dikembalikan oleh in.php.
jsonInteger
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"

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
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
methodStringYaHarus geetest. Menentukan bahwa Anda mengirimkan CAPTCHA GeeTest v3.
gtStringYaThe gt nilai yang diperoleh dari situs target.
challengeStringYaThe challenge yang diperoleh dari situs target. Nilai baru harus diperoleh untuk setiap permintaan pemecahan.
pageurlStringYaURL lengkap halaman yang berisi CAPTCHA GeeTest.
api_serverStringTidakDomain server API GeeTest yang digunakan oleh situs target (misalnya api.geetest.com atau api-na.geetest.com).
jsonInteger
Default: 0
Tidak0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON.
proxyStringTidakAlamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT.
proxytypeStringTidakJenis 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
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=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.

ParameterGunakan saat
challenge_jsonAnda sudah memegang dokumen challenge. CapSkip memecahkannya secara lokal dan sama sekali tidak melakukan request jaringan, sehingga inilah jalur tercepat.
challenge_urlAnda 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
ParameterTipeWajibDeskripsi
keyStringYa*Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan.
methodStringYaHarus altcha. Menyatakan bahwa Anda mengirimkan challenge ALTCHA.
pageurlStringYaURL lengkap halaman asal challenge tersebut.
challenge_urlStringYa*Endpoint tempat CapSkip harus mengambil challenge. Wajib kecuali challenge_json dikirim.
challenge_jsonStringYa*Dokumen challenge itu sendiri, berupa string JSON. Wajib kecuali challenge_url dikirim.
proxyStringTidakAlamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD. Hanya digunakan untuk pengambilan challenge_url tersebut.
proxytypeStringTidakTipe proxy: HTTP, HTTPS, SOCKS5 atau SOCKS5H.
jsonInteger
Default: 0
Tidak0 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
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": "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-urlencodedemail=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.

SkemaGenerasiDidukungDeskripsi
Legacy PoWv1YaCari 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.
PBKDF2PoW v2YaCari counter yang derived key-nya diawali dengan prefix target. SHA-256, SHA-384, dan SHA-512 didukung. Inilah default yang direkomendasikan ALTCHA sendiri.
SHAPoW v2YaVarian hash iteratif dari skema yang sama.
Argon2idPoW v2TidakFungsi derivasi kunci yang memory hard. Ditolak, bukan dicoba.
scryptPoW v2TidakFungsi 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. CapSkip memecahkan CAPTCHA di browser sungguhan dan memakai identitas konsisten milik browser tersebut.
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"
},
"cost": "0.00145",
"createTime": 1788863246,
"endTime": 1788863262,
"errorId": 0,
"solveCount": 1
}

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 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-urlencodedemail=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.

Menggunakan Proxy

Untuk reCAPTCHA v2, v3, Invisible, Enterprise, dan Cloudflare, 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
ParameterTipeWajibDeskripsi
proxyStringTidakAlamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT
proxytypeStringTidakJenis 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.
CAPCHA_NOT_READYCaptcha masih diproses. Lanjutkan polling.
(respons kosong)Hasilnya sudah diambil, atau ID tersebut tidak ada.