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 API | Layanan |
|---|---|
| gaya 2captcha | 2captcha.com, rucaptcha.com, solvecaptcha.com, captchas.io |
| JSON (createTask / getTaskResult) | anti-captcha.com, capmonster.cloud, capsolver.com |
| DeathByCaptcha | deathbycaptcha.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
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.

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: 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.

Harap diperhatikan: Dalam beberapa kasus, konten halaman dihasilkan secara dinamis, dan
g-recaptcha-responseelement 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 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 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
sizeproperti disetel keinvisible, 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 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.jsskrip dimuat denganrender=SITEKEYparameter, misalnya:https://www.google.com/recaptcha/api.js?render=SITEKEYThe
___grecaptcha_cfg.clientsarray berisi entri dengan indeks numerik yang tinggi, seperticlients[100000]
Untuk memecahkan reCAPTCHA v3, identifikasi parameter berikut:
- sitekey
Ini dapat ditemukan direnderparameter dariapi.jsURL skrip. Ia juga dapat muncul di URL iframe, di dalam kode JavaScript yang memanggilgrecaptcha.execute(), atau di dalam___grecaptcha_cfgobjek konfigurasi. - action
Temukan ini dengan memeriksa kode JavaScript untuk panggilan kegrecaptcha.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". - 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
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: 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 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.jsalih-alihapi.js, misalnya:<script src="https://recaptcha.net/recaptcha/enterprise.js" async defer></script>
Kode JavaScript situs memanggil
grecaptcha.enterprise.METHODalih-alihgrecaptcha.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.

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
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
sitekeyfrom the page.Kirim ke CapSkip API bersama dengan seluruh
pageurl.Setelah menerima token, masukkan ke dalam
cf-turnstile-responsekolom.Dalam beberapa implementasi, token mungkin juga perlu ditempatkan di
g-recaptcha-responsekolom.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:
cDatachlPageDataaction
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 (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 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"
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
challengeharus diperoleh untuk setiap permintaan pemecahan. Setelah CAPTCHA dimuat di halaman, nilai sebelumnyachallengemenjadi tidak valid. Anda perlu memeriksa permintaan jaringan situs web tersebut untuk mengidentifikasi permintaan yang menghasilkanchallengedan 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_challengegeetest_validategeetest_seccode
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:
- Ambil challenge dari endpoint tempat widget membacanya.
- Kirimkan ke
/in.phpdenganmethod=altcha. - Lakukan polling ke
/res.phphingga token siap. - Kirim kembali token tersebut ke form target pada
altchakolom.
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.phpJSON 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-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.
| 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 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:
- Baca site key dari halaman target.
- Kirimkan ke
/in.phpdenganmethod=captchafox. - Lakukan polling ke
/res.phphingga token siap. - Kirim kembali token tersebut ke form target pada
cf-captcha-responsekolom.
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.
| Parameter | Dari mana asalnya |
|---|---|
| sitekey | Kunci publik yang dipakai untuk merender widget. Kunci ini bukan rahasia, sama untuk setiap pengunjung, dan secara konvensi diawali dengan sk_. |
| pageurl | URL 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.
| Challenge | Muncul ketika | Didukung | Deskripsi |
|---|---|---|---|
| Invisible | Biasanya | Ya | Bukti dari browser memuaskan layanan tersebut dan token diterbitkan tanpa ada apa pun yang ditampilkan di layar. Ini adalah jalur yang umum dan paling cepat. |
| Geser | Terkadang | Ya | Teka-teki geser yang mengharuskan sebuah potongan diseret ke dalam celah. CapSkip menemukan lokasi targetnya dan menyelesaikan seretan tersebut. |
| Pilih gambar | Jarang | Tidak | Kisi 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. |
| Audio | Jarang | Tidak | Opsi 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| method | String | Ya | Harus captchafox. Menentukan bahwa Anda mengirimkan CAPTCHA CaptchaFox. |
| sitekey | String | Ya | Site key yang dibaca dari halaman target, secara konvensi berawalan sk_. |
| pageurl | String | Ya | URL lengkap dari halaman tempat widget muncul. |
| api_server | String | Tidak | Entry point widget yang akan dimuat. Nilai defaultnya adalah https://cdn.captchafox.com/. Lihat Memilih Sumber Widget di bawah. |
| useragent | String | Tidak | Diterima demi kompatibilitas dengan layanan lain dan tidak diterapkan. CapSkip memecahkan CAPTCHA di browser sungguhan dan memakai identitas konsisten milik browser tersebut. |
| proxy | String | Tidak | Alamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD. |
| 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. |
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.phpJika 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
| 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": "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_server | Token | Bawaan | Deskripsi |
|---|---|---|---|
| https://cdn.captchafox.com/ | Biasa | Ya | Widget standar, dipakai oleh sebagian besar situs. Inilah yang dimuat CapSkip bila Anda tidak mengirim apa pun. |
| https://s.uicdn.com/mampkg/ | Berawalan MAM_ | Tidak | Build 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 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:
- Baca CAPTCHA key dari halaman target.
- Kirimkan ke
/in.phpdenganmethod=capy. - Lakukan polling ke
/res.phphingga solusinya siap. - Kirim ketiga nilai yang dikembalikan tersebut ke dalam formulir target.
Yang Anda Butuhkan Sebelum Memecahkan
Dua nilai, dan keduanya dibaca langsung dari halaman target.
| Parameter | Dari mana asalnya |
|---|---|
| captchakey | Capy 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. |
| pageurl | URL 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 dikembalikan | Masuk ke kolom formulir target |
|---|---|
| captchakey | capy_captchakey |
| challengekey | capy_challengekey |
| answer | capy_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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| method | String | Ya | Harus capy. Menentukan bahwa Anda mengirimkan CAPTCHA Capy Puzzle. |
| captchakey | String | Ya | CAPTCHA key yang dibaca dari halaman target, secara konvensi berawalan PUZZLE_. sitekey dan websiteKey diterima sebagai alias. |
| pageurl | String | Ya | URL lengkap dari halaman tempat widget muncul. |
| api_server | String | Tidak | Root dari Capy API tempat key tersebut berada. Nilai defaultnya adalah https://jp.api.capy.me. |
| version | String Default: puzzle | Tidak | Keluarga tantangan. Hanya puzzle yang dipecahkan. Lihat Puzzle dan Avatar di bawah. |
| userAgent | String | Tidak | User-Agent yang dikirim bersama permintaan puzzle. Opsional, dan jarang diperlukan. |
| proxy | String | Tidak | Alamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD. |
| 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. |
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.phpJika 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
| 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": {
"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 verifikasi | Hasil |
|---|---|
| 0.48 seconds | Refused |
| 1,03 detik ke atas, diuji hingga 4 detik | Accepted |
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.
| version | Challenge | Didukung | Deskripsi |
|---|---|---|---|
| puzzle | Assemble a puzzle | Ya | Nilai default, dan inilah yang dipakai hampir semua penerapan. Sebuah potongan diseret kembali ke lubang tempat potongan itu dipotong. |
| avatar | Drag an object | Tidak | Jenis 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 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:
- Baca sitekey dari halaman target, berikut URL script widget-nya.
- Kirim keduanya ke
/in.phpdenganmethod=friendly_captcha. - Lakukan polling ke
/res.phphingga token siap. - 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.
| Parameter | Dari mana asalnya |
|---|---|
| sitekey | The data-sitekey atribut pada elemen widget, yaitu elemen yang membawa class="frc-captcha". |
| pageurl | URL lengkap dari halaman tempat widget muncul. |
| module_script | The 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.
| version | Paket widget | Didukung | Deskripsi |
|---|---|---|---|
| v1 | friendly-challenge | Ya | Widget 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/sdk | Ya | SDK 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:
- The
versionparameter, bila Anda mengirimkannya.v1danv2adalah penulisan yang dikenali; sedangkan1atau2saja juga diterima. - URL script widget, dari
module_scriptataunomodule_script. Inilah sinyal paling andal yang ada, karena inilah build yang benar-benar dimuat oleh situs tersebut. - 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| method | String | Ya | Harus friendly_captcha. Menentukan bahwa Anda mengirimkan Friendly Captcha. |
| sitekey | String | Ya | The data-sitekey nilai yang dibaca dari elemen widget pada halaman target. |
| pageurl | String | Ya | URL lengkap dari halaman tempat widget muncul. |
| version | String Default: v1 | Tidak | Versi protokol, v1 atau v2. Lihat Versi 1 dan Versi 2 di atas. |
| module_script | String | Tidak | The src dari tag script widget yang membawa type="module". Dipakai untuk menentukan versinya ketika version tidak dikirim. |
| nomodule_script | String | Tidak | The src dari tag script widget yang membawa nomodule. Dibaca dengan alasan yang sama. |
| api_server | String | Tidak | Khusus CapSkip. Endpoint residensi data tempat sitekey tersebut terdaftar. Menerima global (nilai default), eu, atau sebuah URL lengkap. Lihat Residensi Data di bawah. |
| useragent | String | Tidak | User-Agent yang dikirim bersama permintaan. Opsional, dan jarang diperlukan. |
| proxy | String | Tidak | Alamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD. |
| 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. |
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.phpJika 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
| 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 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.
| version | Kolom formulir tempat token dimasukkan |
|---|---|
| v1 | frc-captcha-solution |
| v2 | frc-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_server | Yang dipilih |
|---|---|
| global | Nilai default. Dipakai ketika atributnya tidak ada, dan itulah kasus yang umum. |
| eu | Endpoint Eropa, dipilih dengan data-api-endpoint="eu". |
| A full URL | Penerapan 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
| 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
| Kode | Arti |
|---|---|
ERROR_KEY_DOES_NOT_EXIST | Kunci API tidak valid. |
ERROR_WRONG_USER_KEY | Kunci API tidak ada atau kosong. |
ERROR_WRONG_METHOD | Metode HTTP tidak valid atau action parameter. |
ERROR_WRONG_ID_FORMAT | Format ID captcha tidak valid. |
ERROR_BAD_PARAMETERS | Parameter wajib hilang atau tidak valid. |
ERROR_UPLOAD | Tidak ada data gambar yang diberikan atau unggahan gagal. |
ERROR_INVALID_IMAGE | Format gambar tidak valid atau data gambar rusak. |
ERROR_INVALID_BASE64 | Pengodean base64 tidak valid. |
ERROR_TOO_BIG_CAPTCHA_FILESIZE | Ukuran gambar melebihi 600 kB atau dimensinya melebihi 1000px. |
ERROR_CAPTCHA_UNSOLVABLE | Gagal memecahkan captcha. Kirim tugas baru dan coba lagi. |
ERROR_GOOGLEKEY | Tidak valid googlekey parameter. |
ERROR_PAGEURL | Tidak valid pageurl parameter. |
ERROR_ZERO_BALANCE | API key tidak lagi memiliki kredit untuk metode ini. |
ERROR_PROXY_FORMAT | The proxy tidak dapat diuraikan. |
CAPCHA_NOT_READY | Captcha masih diproses. Lanjutkan polling. |
| (respons kosong) | Hasilnya sudah diambil, atau ID tersebut tidak ada. |
