Dokumentasi API
Referensi untuk endpoint yang tersedia, format permintaan, parameter, dan contoh respons untuk mengintegrasikan API ke dalam aplikasi Anda.
Dokumentasi ini ditujukan untuk pengembang yang ingin mengintegrasikan CapSkip langsung ke skrip, aplikasi, atau sistem otomatisasi mereka sendiri. Pengguna perangkat lunak pihak ketiga sebaiknya mengikuti bagian Tutorials untuk instruksi penyiapan.
CapSkip mengemulasi API layanan pemecahan CAPTCHA yang banyak dipakai, sehingga dapat terhubung ke perangkat lunak pihak ketiga yang kompatibel tanpa memerlukan modifikasi apa pun. Integrasi biasanya hanya memerlukan CapSkip dalam keadaan berjalan.
Dokumentasi ini menjelaskan cara mengirim permintaan dan mengambil hasil. CapSkip mendukung beberapa keluarga API, termasuk API gaya 2Captcha (in.php / res.php), API JSON createTask / getTaskResult yang digunakan oleh AntiCaptcha, CapMonster, CapSolver, NextCaptcha, dan EzCaptcha, serta REST API DeathByCaptcha. Layanan dalam keluarga yang sama berbagi endpoint, format permintaan, dan format respons yang sama. Hanya base URL (host dan port) yang berbeda untuk setiap layanan.
| Keluarga API | Layanan |
|---|---|
| gaya 2captcha | 2captcha.com, rucaptcha.com, solvecaptcha.com, captchas.io |
| JSON (createTask / getTaskResult) | anti-captcha.com, capmonster.cloud, capsolver.com, nextcaptcha.com, ez-captcha.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 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON, termasuk nilai userAgent jika tersedia.
|
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
Jika CAPTCHA telah dipecahkan, CapSkip akan merespons dalam teks biasa atau JSON dan mengembalikan token jawabannya. Token-nya akan terlihat seperti berikut:
03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq-uBO5mVm2XRikL8iKOWr0aG50sCuej9bXx5qcviUGSm4iK4NC_Q88flavWhaTXSh0VxoihBwBjXxwXuJZ-WGN5Sy4dtUl2wbpMqAj8Zwup1vyCaQJWFvRjYGWJ_TQBKTXNB5CCOgncqLetmJ6B6Cos7qoQyaB8ZzBOTGf5KSP6e-K9niYs772f53Oof6aJeSUDNjiKG9gN3FTrdwKwdnAwEYX-F37sI_vLB1Zs8NQo0PObHYy0b0sf7WSLkzzcIgW9GR0FwcCCm1P8lB-50GQHPEBJUHNnhJyDzwRoRAkVzrf7UkV8wKCdTwrrWqiYDgbrzURfHc2ESsp020MicJTasSiXmNRgryt-gf50q5BMkiRH7osm4DoUgsjc_XyQiEmQmxl5sqZP7aKsaE-EM00x59XsPzD3m3YI6SRCFRUevSyumBd7KmXE8VuzIO9lgnnbka4-eZynZa6vbB9cO3QjLH0xSG3-egcplD1uLGh79wC34RF49Ui3eHwua4S9XHpH6YBe7gXzz6_mv-o-fxrOuphwfrtwvvi2FGfpTexWvxhqWICMFTTjFBCEGEgj7_IFWEKirXW2RTZCVF0Gid7EtIsoEeZkPbrcUISGmgtiJkJ_KojuKwImF0G0CsTlxYTOU2sPsd5o1JDt65wGniQR2IZufnPbbK76Yh_KI2DY4cUxMfcb2fAXcFMc9dcpHg6f9wBXhUtFYTu6pi5LhhGuhpkiGcv6vWYNxMrpWJW_pV7q8mPilwkAP-zw5MJxkgijl2wDMpM-UUQ_k37FVtf-ndbQAIPG7S469doZMmb5IZYgvcB4ojqCW3Vz6Q
Setiap token disertai User-Agent browser yang digunakan untuk mendapatkannya. Dengan json=1 responsnya menyertakan userAgent sebagai kolom di samping request. Dalam mode teks biasa, baca nilai yang sama dari header X-Recaptcha-User-Agent yang ada di respons. Jika Anda menggunakan JSON API, getTaskResult mengembalikannya sebagai solution.userAgent. Kirim User-Agent ini saat Anda mengirim token, karena beberapa situs memeriksa bahwa keduanya cocok. Kolom dan header tersebut dihilangkan jika tidak ada User-Agent yang tersedia.
{
"status": 1,
"request": "03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq...",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}
Jika CAPTCHA belum terpecahkan, CapSkip akan mengembalikan CAPCHA_NOT_READY. Dalam kasus ini, tunggu 5 detik dan ulangi permintaan. Jika CapSkip mengembalikan body respons yang kosong, hasilnya sudah pernah diambil atau ID tersebut tidak ada. Setiap hasil hanya dapat dibaca satu kali.
Temukan elemen dengan ID g-recaptcha-response dan buat terlihat dengan menghapus display: none gaya.

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
Setiap token disertai User-Agent browser yang digunakan untuk mendapatkannya. Dengan json=1 responsnya menyertakan userAgent sebagai kolom di samping request. Dalam mode teks biasa, baca nilai yang sama dari header X-Recaptcha-User-Agent yang ada di respons. Jika Anda menggunakan JSON API, getTaskResult mengembalikannya sebagai solution.userAgent. Kirim User-Agent ini saat Anda mengirim token, karena beberapa situs memeriksa bahwa keduanya cocok. Kolom dan header tersebut dihilangkan jika tidak ada User-Agent yang tersedia.
{
"status": 1,
"request": "03AHJ_Vuve5Asa4koK3KSMyUkCq0vUFCR5Im4CwB7PzO3dCxIo11i53epEraq...",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}
Jika CAPTCHA belum terpecahkan, CapSkip akan mengembalikan CAPCHA_NOT_READY. Tunggu 5 detik dan ulangi permintaan. Jika CapSkip mengembalikan body respons yang kosong, hasilnya sudah pernah diambil atau ID tersebut tidak ada. Setiap hasil hanya dapat dibaca satu kali.
Daftar parameter permintaan GET
| Parameter GET | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya | Kunci API CapSkip Anda. |
| action | String | Ya | get: ambil jawaban untuk CAPTCHA yang dikirimkan. |
| id | Integer | Ya |
ID CAPTCHA yang dikembalikan oleh in.php.
|
| json | Integer Default: 0 |
Tidak |
0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON, termasuk nilai userAgent jika tersedia.
|
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
Setelah menerima token dari CapSkip, Anda harus mengirimkannya dengan benar ke situs web target. Cara terbaik untuk memahami cara kerjanya adalah dengan mengamati permintaan yang dikirim saat menyelesaikan verifikasi sebagai pengguna biasa. Sebagian besar browser menyediakan alat pengembang dengan Network tab yang memungkinkan Anda memeriksa permintaan keluar.
Dalam kebanyakan kasus, token dikirim melalui permintaan POST. Nama parameternya mungkin g-recaptcha-response, mirip dengan reCAPTCHA v2, atau sesuatu seperti g-recaptcha-response-100000. Dalam beberapa implementasi, nama parameter yang berbeda mungkin digunakan.
Anda perlu memeriksa permintaan jaringan untuk menentukan bagaimana token dikirimkan lalu menyusun permintaan Anda sesuai dengan itu.
reCAPTCHA 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 (halaman challenge, dengan action, data, pagedata opsional):
curl -X POST -d "key=YOUR_API_KEY&method=turnstile&sitekey=0x4AAAAAAABUYP0XeMJF0xoy&pageurl=https://example.com&action=managed&data=...&pagedata=..." http://127.0.0.1:8080/in.php
Jika permintaan berhasil, CapSkip akan mengembalikan ID CAPTCHA sebagai teks biasa: OK|12345
Jika json=1 ditetapkan, respons akan dikembalikan dalam format JSON:
{
"status":1,
"request":"12345"
}
Jika terjadi kesalahan, CapSkip akan mengembalikan kode error.
Gunakan ID yang dikembalikan untuk mengambil hasilnya dari /res.php endpoint dari API.
Daftar parameter permintaan GET
| Parameter GET | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya | Kunci API CapSkip Anda. |
| action | String | Ya | get: ambil jawaban untuk CAPTCHA yang dikirimkan. |
| id | Integer | Ya |
ID CAPTCHA yang dikembalikan oleh in.php.
|
| json | Integer Default: 0 |
Tidak |
0 - respons dikembalikan sebagai teks biasa. 1 - respons dikembalikan dalam format JSON, termasuk userAgent nilai. |
Untuk Cloudflare Turnstile, pemecah menggunakan User-Agent browser tertentu, dan Anda harus mengirim User-Agent yang sama saat mengirim token. Dengan json=1 responsnya menyertakan userAgent kolom. Dalam mode teks biasa, baca nilai yang sama dari X-Turnstile-User-Agent header respons.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"
Beberapa situs di balik Cloudflare menghentikan setiap pengunjung di halaman penuh bertuliskan “Just a moment...” sebelum menampilkan konten apa pun. Melewati halaman tersebut akan menyetel cookie cf_clearance dan setiap permintaan berikutnya yang membawa cookie tersebut akan langsung diloloskan. CapSkip melewati halaman untuk URL yang Anda kirim dan mengembalikan cookie-nya, sehingga skrip atau alat yang tidak memiliki browser sendiri dapat mengambil situs tersebut dengan permintaan HTTP biasa.
Cara Kerjanya
Metode ini untuk tantangan halaman penuh. Jika situs justru menampilkan widget Turnstile di dalam formulir, yang Anda butuhkan adalah token, bukan cookie: lihat bagian Cloudflare Turnstile di atas.
Cloudflare mengikat cookie cf_clearance ke alamat IP dan User-Agent yang memperolehnya. Cookie yang digunakan ulang dari alamat lain, atau dengan User-Agent lain, akan ditolak dan halaman tantangan muncul kembali. Itulah sebabnya setiap permintaan untuk metode ini menyertakan proxy Anda, dan jawabannya memberi tahu User-Agent mana yang harus Anda kirim.
Siklus lengkapnya terdiri dari empat langkah:
- Aktifkan Kembalikan cookie cf_clearance di CapSkip (lihat di bawah).
- Kirim URL halaman dan proxy Anda ke
/createTask. - Lakukan polling ke
/getTaskResulthingga cookie siap. - Kirim permintaan Anda sendiri melalui proxy yang sama, dengan User-Agent yang sama dan cookie tersebut.
Metode ini tersedia pada API JSON createTask / getTaskResult saja. Antarmuka lama in.php / res.php tidak memiliki mode cookie.
Sebelum Memulai
Metode ini nonaktif secara default. Buka CapSkip, masuk ke Pengaturan, Jenis captcha, Cloudflare, lalu aktifkan Kembalikan cookie cf_clearance. Selama nonaktif, setiap permintaan untuk metode ini ditolak dengan ERROR_TASK_NOT_SUPPORTED. Perubahan ini berlaku mulai permintaan berikutnya; tidak ada yang perlu dimulai ulang.
Dua hal wajib ada di setiap permintaan:
- Proxy. Cookie hanya berlaku dari alamat yang memperolehnya, jadi permintaan harus menyebutkan proxy yang akan Anda gunakan sesudahnya. Permintaan tanpa proxy ditolak sebelum pekerjaan apa pun dilakukan. Proxy HTTP, HTTPS, SOCKS5, dan SOCKS5H diterima; SOCKS4 tidak.
- User-Agent yang sesuai, jika Anda mengirimkannya. User-Agent tersebut harus berupa User-Agent Chrome untuk Windows, dengan versi mayor yang sama dengan Google Chrome yang terinstal di komputer yang menjalankan CapSkip. User-Agent lain akan menghasilkan cookie yang ditolak oleh situs, sehingga User-Agent tersebut langsung ditolak di awal dengan error. Pilihan paling sederhana adalah tidak mengirim User-Agent sama sekali dan menggunakan User-Agent yang dikembalikan bersama cookie.
Jenis Tugas
Tiga varian dari permintaan yang sama diterima, satu untuk setiap keluarga klien yang memiliki mode cookie. Semuanya dipecahkan dengan cara yang sama; hanya nama field dan bentuk jawabannya yang berbeda.
| Jenis tugas | Gaya API | Didukung | Deskripsi |
|---|---|---|---|
AntiCloudflareTask | CapSolver | Ya | Proxy sebagai satu field proxy berupa string. Jawabannya berisi cookie, token yang berisi nilai yang sama, serta User-Agent. |
TurnstileTask dengan cloudflareTaskType disetel ke cf_clearance | CapMonster | Ya | Proxy sebagai field terpisah. Jawabannya berisi cookie, ditambah User-Agent jika permintaan tidak mengirimkannya. |
TurnstileTask tanpa websiteKey | NextCaptcha | Ya | Proxy sebagai field terpisah. Hanya dikenali selama NextCaptcha menjadi layanan yang dipilih. Jawabannya berisi cookie dan User-Agent. |
Parameter AntiCloudflareTask
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| clientKey | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| type | String | Ya | Harus AntiCloudflareTask. |
| websiteURL | String | Ya | URL lengkap http atau https dari halaman yang menampilkan tantangan. |
| proxy | String | Ya | Proxy yang digunakan untuk pemecahan. Menerima IP:PORT:LOGIN:PASSWORD, LOGIN:PASSWORD@IP:PORT, http://LOGIN:PASSWORD@IP:PORT (juga https://, socks5://, socks5h://) dan socks5:IP:PORT:LOGIN:PASSWORD. Login dan kata sandi bersifat opsional. |
| userAgent | String | Tidak | User-Agent yang akan Anda kirim bersama cookie. Lihat Sebelum Memulai untuk mengetahui nilai yang diterima. |
| html | String | Tidak | Diterima demi kompatibilitas dan diabaikan. |
Parameter TurnstileTask (cf_clearance)
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| clientKey | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| type | String | Ya | Harus TurnstileTask. |
| cloudflareTaskType | String | Ya | Harus cf_clearance. Tanpa parameter ini, tugas tersebut menjadi permintaan token Turnstile. |
| websiteURL | String | Ya | URL lengkap http atau https dari halaman yang menampilkan tantangan. |
| websiteKey | String | Tidak | Diterima demi kompatibilitas. Halaman ini tidak memiliki sitekey untuk diberikan, jadi nilai apa pun bisa digunakan. |
| proxyType | String Nilai default: http | Tidak | http, https, socks5 atau socks5h. |
| proxyAddress | String | Ya | Alamat IP atau nama host proxy. |
| proxyPort | Integer | Ya | Port proxy. |
| proxyLogin | String | Tidak | Login proxy. |
| proxyPassword | String | Tidak | Kata sandi proxy. Digunakan persis seperti yang dikirim, jadi karakter seperti @ dan : aman digunakan. |
| userAgent | String | Tidak | User-Agent yang akan Anda kirim bersama cookie. Lihat Sebelum Memulai untuk mengetahui nilai yang diterima. |
| htmlPageBase64 | String | Tidak | Diterima demi kompatibilitas dan diabaikan. |
Varian NextCaptcha menggunakan field proxyType, proxyAddress, proxyPort, proxyLogin dan proxyPassword yang sama, dengan type disetel ke TurnstileTask dan tanpa websiteKey.
Mengirim Tugas
Kirim permintaan HTTP POST dengan body JSON ke endpoint API CapSkip Anda (/createTask).
Kirim AntiCloudflareTask:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "AntiCloudflareTask",
"websiteURL": "https://www.example.com/",
"proxy": "203.0.113.10:8080:login:password"
}
}' \
http://127.0.0.1:8080/createTask
Kirim TurnstileTask dengan cloudflareTaskType:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "TurnstileTask",
"cloudflareTaskType": "cf_clearance",
"websiteURL": "https://www.example.com/",
"websiteKey": "xxxxxx",
"proxyType": "http",
"proxyAddress": "203.0.113.10",
"proxyPort": 8080,
"proxyLogin": "login",
"proxyPassword": "password"
}
}' \
http://127.0.0.1:8080/createTask
Jika permintaan diterima, CapSkip mengembalikan ID tugas. Permintaan yang dibuat saat pengaturan nonaktif, tanpa proxy, atau dengan User-Agent yang tidak dapat digunakan akan ditolak di sini, pada permintaan pengiriman itu sendiri, sebelum pekerjaan apa pun dilakukan.
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"taskId": "2122988149"
}
Mendapatkan Hasil
Tunggu sekitar 5 detik, lalu kirim permintaan HTTP POST ke /getTaskResult dengan ID tugas. Ulangi setiap beberapa detik selama statusnya processing. Sebagian besar halaman berhasil dilewati dalam 5 hingga 20 detik; proxy yang lambat akan menambah waktu tersebut.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"clientKey": "YOUR_API_KEY", "taskId": "2122988149"}' \
http://127.0.0.1:8080/getTaskResult
{
"errorId": 0,
"taskId": "2122988149",
"status": "processing"
}
Jawaban siap untuk AntiCloudflareTask. token berisi nilai yang sama dengan cookie:
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"taskId": "2122988149",
"solution": {
"cookies": {
"cf_clearance": "3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2"
},
"token": "3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36"
},
"status": "ready"
}
Jawaban siap untuk TurnstileTask dengan cloudflareTaskType. Jika permintaan menyertakan userAgent, solusinya hanya berupa cookie, karena cookie terikat pada User-Agent yang Anda kirim. Jika tidak, userAgent ditambahkan agar Anda tahu User-Agent mana yang harus digunakan:
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"taskId": "2122988149",
"solution": {
"cf_clearance": "3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36"
},
"status": "ready"
}
Varian NextCaptcha menjawab dengan cf_clearance dan userAgent berdampingan di dalam solution.
Menggunakan Cookie
Kirim cookie bersama setiap permintaan ke situs, melalui proxy yang sama dan dengan User-Agent yang sama. Ubah salah satunya, dan Cloudflare akan kembali menampilkan halaman tantangan.
curl -x "http://login:[email protected]:8080" \ -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36" \ -b "cf_clearance=3gBq2EXAMPLE9vRk7pT0c1aZ.uWx4yNq8mLs-1792066388-1.2.1.1-Qx7aEXAMPLEpZ0kR3vT9wYb2" \ https://www.example.com/
Cookie berlaku selama yang diizinkan oleh pengaturan Cloudflare situs itu sendiri, sering kali 30 menit dan terkadang jauh lebih lama. Saat halaman tantangan muncul kembali, kirim tugas baru. Jika Anda merotasi proxy, lakukan pemecahan sekali per proxy: cookie yang diperoleh pada satu alamat tidak berlaku di alamat lain.
Kesalahan
Penolakan dikembalikan pada permintaan createTask itu sendiri. Kegagalan pemecahan dikembalikan pada getTaskResult dengan status disetel ke failed. Saat NextCaptcha dipilih, kode dan status HTTP mengikuti tabel error milik NextCaptcha sendiri.
| Kode | Arti |
|---|---|
ERROR_TASK_NOT_SUPPORTED | Kembalikan cookie cf_clearance dalam keadaan nonaktif di CapSkip. |
ERROR_PROXY_MISSING | TurnstileTask (varian): tidak ada proxy yang dapat digunakan dalam permintaan. |
ERROR_WRONG_USERAGENT | TurnstileTask (varian): User-Agent bukan Chrome untuk Windows dengan versi mayor yang sama dengan Google Chrome yang terinstal di komputer CapSkip. |
ERROR_BAD_PARAMETERS | AntiCloudflareTask (varian): tidak ada proxy yang dapat digunakan atau User-Agent tidak dapat digunakan. Pada kedua varian: websiteURL tidak disertakan. |
ERROR_PAGEURL | websiteURL bukan URL http atau https lengkap. |
ERROR_PROXY_BANNED | Cloudflare memblokir alamat proxy secara langsung. Gunakan proxy lain. |
ERROR_PROXY_CONNECT_REFUSED | Halaman tidak dapat dijangkau melalui proxy. Periksa apakah proxy aktif dan data login sudah benar. |
ERROR_CAPTCHA_UNSOLVABLE | Tidak ada cookie yang diperoleh tepat waktu, atau halaman tidak menampilkan tantangan Cloudflare sama sekali (errorDescription kemudian berisi “No Cloudflare challenge on this page”). Kirim tugas baru untuk mencoba lagi. |
hCaptcha adalah widget CAPTCHA yang digunakan oleh banyak formulir pendaftaran, masuk, dan checkout. Pengunjung mencentang kotak centang, terkadang menjawab tantangan gambar, lalu widget menaruh token di formulir. Situs memeriksa token tersebut ke hCaptcha sebelum menerima formulir. CapSkip melewati widget untuk sitekey dan halaman yang Anda kirim lalu mengembalikan token, siap dikirim bersama formulir. hCaptcha Enterprise dan widget tak terlihat menggunakan metode yang sama.
Cara Kerjanya
- Temukan sitekey widget hCaptcha di halaman target (lihat di bawah).
- Kirim sitekey dan URL halaman ke
/in.phpdenganmethod=hcaptcha. - Lakukan polling ke
/res.phphingga token siap. - Masukkan token ke dalam formulir, atau teruskan ke callback halaman, lalu kirim formulir.
Pemecahan biasanya memakan waktu antara 10 dan 30 detik. Lakukan polling setiap 5 detik.
Menemukan Sitekey
Sitekey adalah pengenal publik yang sama untuk setiap pengunjung halaman. Sebagian besar halaman mencantumkannya pada kontainer widget sebagai data-sitekey:
<div class="h-captcha" data-sitekey="a5f74b19-9e45-40e0-b45d-47ff91b7a6c2"></div>
Jika halaman membuat widget dengan skrip, cari opsi sitekey pada hcaptcha.render(), atau parameter sitekey= di alamat iframe hCaptcha. Widget dengan data-size="invisible" bersifat tak terlihat: kirim invisible=1 untuk widget tersebut.
Beberapa situs hCaptcha Enterprise juga meneruskan nilai rqdata ke widget, melalui hcaptcha.setData(), sebelum widget berjalan. Jika halaman melakukan ini, kirim nilai tersebut sebagai data. Nilai ini diterbitkan oleh situs untuk satu tantangan dan cepat kedaluwarsa, jadi ambil nilai baru untuk setiap tugas.
Daftar Parameter Permintaan POST
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| method | String | Ya | Harus hcaptcha. Menentukan bahwa Anda mengirimkan hCaptcha. |
| sitekey | String | Ya | Sitekey widget hCaptcha. |
| pageurl | String | Ya | URL lengkap halaman tempat widget berada. |
| invisible | Integer Default: 0 | Tidak | 1 untuk widget tak terlihat. |
| data | String | Tidak | The rqdata nilai dari widget hCaptcha Enterprise, jika situs menetapkannya. |
| userAgent | String | Tidak | User-Agent yang akan Anda gunakan untuk mengirim formulir. CapSkip hanya menggunakannya jika cocok dengan browser yang dipakai CapSkip untuk memecahkan. Balasan selalu menyebutkan User-Agent yang digunakan untuk mendapatkan token. |
| 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. Satu alamat sudah cukup untuk pengujian dan pemecahan sesekali. Di luar itu, hCaptcha menilai jaringan asal token sekaligus browsernya, dan aliran pemecahan yang terus-menerus dari satu IP adalah hal yang memang dirancang untuk ditangkap oleh batas laju dan pemeriksaan reputasinya. Untuk volume besar, konfigurasikan kumpulan proxy di Pengaturan, Jenis captcha, hCaptcha, Konfigurasi Proxy, atau kirim proxy bersama setiap tugas jika pemecahan harus berasal dari jaringan tertentu. Proxy yang dikirim bersama tugas selalu diprioritaskan di atas daftar.
Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=hcaptcha. Field formulir, query string, dan body JSON semuanya diterima dengan nama field yang identik.
Kirim hCaptcha:
curl -X POST \ -d "key=YOUR_API_KEY" \ -d "method=hcaptcha" \ -d "sitekey=a5f74b19-9e45-40e0-b45d-47ff91b7a6c2" \ --data-urlencode "pageurl=https://accounts.hcaptcha.com/demo" \ -d "json=1" \ http://127.0.0.1:8080/in.php
Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.
{
"status": 1,
"request": "2122988149"
}
Jika tidak, CapSkip mengembalikan kode error pada permintaan pengiriman itu sendiri, sebelum pekerjaan apa pun dilakukan:
| Kesalahan | Penyebab |
|---|---|
| ERROR_RECAPTCHA_INVALID_SITEKEY | sitekey tidak ada atau kosong. |
| ERROR_PAGEURL | pageurl tidak ada atau bukan alamat http atau https yang valid. |
| ERROR_PROXY_FORMAT | Nilai proxy tidak dapat dibaca. |
Tunggu sekitar 10 detik, lalu kirim permintaan HTTP GET ke endpoint hasil (/res.php) dengan CAPTCHA ID yang Anda terima.
Daftar parameter permintaan GET
| 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 widget berhasil dilewati, CapSkip mengembalikan token:
{
"status": 1,
"request": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2",
"respKey": "E0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjA0...9wB1",
"useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36"
}
request adalah tokennya. respKey adalah nilai kedua yang diberikan hCaptcha kepada widget bersama token; sebagian besar situs tidak pernah membacanya, dan nilainya bisa kosong. useragent adalah User-Agent yang digunakan untuk mendapatkan token.
Tanpa json=1, token mengikuti awalan OK| sebagai teks biasa, dan User-Agent dikirim di header X-HCaptcha-User-Agent pada respons:
OK|P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2
Jika widget belum berhasil dilewati, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.
Setiap hasil hanya dikirimkan sekali. Polling pertama yang berhasil mengembalikan token lalu membuangnya, jadi simpan token dari balasan yang membawanya.
Tugas yang tidak dapat dipecahkan mengembalikan ERROR_CAPTCHA_UNSOLVABLE. Dua kegagalan justru menyebutkan penyebabnya, karena mengirim ulang tugas yang sama akan gagal lagi: ERROR_RECAPTCHA_INVALID_SITEKEY saat hCaptcha menolak sitekey untuk halaman tersebut, jadi periksa sitekey dan pageurl, dan ERROR_PROXY_CONNECT_REFUSED saat proxy tidak dapat dijangkau.
API JSON (createTask)
hCaptcha juga diterima di /createTask, dengan hasil dibaca dari /getTaskResult. Empat jenis tugas dikenali: HCaptchaTaskProxyless dan HCaptchaEnterpriseTaskProxyless memecahkan tanpa proxy milik Anda, HCaptchaTask dan HCaptchaEnterpriseTask memakai proxy. Keempatnya dipecahkan dengan cara yang sama.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| type | String | Ya | Salah satu dari empat jenis tugas di atas. |
| websiteURL | String | Ya | URL lengkap halaman tempat widget berada. |
| websiteKey | String | Ya | Sitekey widget hCaptcha. |
| isInvisible | Boolean | Tidak | true untuk widget tak terlihat. |
| enterprisePayload | Object | Tidak | Objek yang berisi rqdata, untuk hCaptcha Enterprise. Field rqdata di tingkat atas juga diterima. |
| userAgent | String | Tidak | Sama seperti in.php di atas. |
| proxy | String | Tidak | Proxy sebagai satu string, atau proxyType, proxyAddress, proxyPort, proxyLogin dan proxyPassword sebagai field terpisah. |
curl -X POST http://127.0.0.1:8080/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "HCaptchaTaskProxyless",
"websiteURL": "https://accounts.hcaptcha.com/demo",
"websiteKey": "a5f74b19-9e45-40e0-b45d-47ff91b7a6c2"
}
}'
Solusi memuat token dua kali, dengan nama gRecaptchaResponse dan token, sehingga klien yang ditulis untuk salah satu nama tersebut dapat membacanya tanpa perubahan:
{
"errorId": 0,
"status": "ready",
"solution": {
"gRecaptchaResponse": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2",
"token": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2",
"respKey": "E0_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjA0...9wB1",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36"
}
}
Tugas yang gagal membawa kode error yang sama seperti di res.php, yaitu di field errorCode.
Mengirimkan Token
Di halaman, widget menuliskan tokennya ke elemen textarea tersembunyi bernama h-captcha-response (dan salinannya bernama g-recaptcha-response) di dalam formulir. Masukkan token yang Anda terima ke kedua field tersebut lalu kirim formulir. Jika widget dirender dengan data-callback, panggil fungsi tersebut dengan token sebagai gantinya, seperti yang akan dilakukan widget:
document.querySelector('[name="h-captcha-response"]').value = token;
const g = document.querySelector('[name="g-recaptcha-response"]');
if (g) g.value = token;
// atau, jika widget memiliki data-callback:
window[callbackName](token);
Saat Anda mengirim formulir tanpa browser, kirim token sebagai field h-captcha-response (dan g-recaptcha-response, jika formulir memilikinya), dengan User-Agent dari balasan.
Token hCaptcha hanya sekali pakai dan kedaluwarsa sekitar dua menit setelah diterbitkan. Kirim setiap token segera setelah Anda menerimanya, dan minta token baru untuk setiap pengiriman formulir.
Sitekey Ketat
Beberapa situs, terutama situs hCaptcha Enterprise, menolak token yang dinilai berisiko oleh hCaptcha, meskipun widget berhasil dilewati. Jika situs menolak token yang dikembalikan CapSkip, aktifkan High score mode for hCaptcha di Pengaturan, Jenis captcha, hCaptcha. Mode ini memerlukan Google Chrome yang terinstal di komputer yang menjalankan CapSkip. Gunakan juga proxy yang bagus, dan kirim formulir dari alamat yang sama serta dengan User-Agent yang disebutkan dalam balasan.
AWS WAF CAPTCHA adalah teka-teki yang ditampilkan Amazon Web Services ketika firewall sebuah situs meminta bukti bahwa pengunjung adalah manusia: biasanya grid berisi sembilan gambar dengan instruksi seperti “Choose all the curtains” (pilih semua gorden), terkadang sebuah mobil mainan kecil yang harus dikemudikan sampai ujung jalur. Lolos dari teka-teki ini menghasilkan cookie aws-waf-token . Kirim nilai dari halaman yang dilindungi ke CapSkip, dan CapSkip mengembalikan hasil yang diubah menjadi cookie tersebut.
Cara Kerjanya
Situs menggunakan AWS WAF CAPTCHA dalam salah satu dari dua bentuk, dan metode ini menangani keduanya:
- Halaman challenge. Firewall menjawab permintaan dengan status HTTP
405dan halaman kecil sebagai pengganti konten. Halaman itu memuat objekwindow.gokuPropsdan memuatchallenge.jsdancaptcha.jsdari hostawswaf.com. - Widget JS-API. Halaman biasa, misalnya formulir kontak atau unduhan, memuat
jsapi.jsdan menggambar teka-tekinya sendiri denganAwsWafCaptcha.renderCaptcha.
Siklus lengkapnya terdiri dari empat langkah:
- Baca nilai yang tercantum di bawah dari halaman yang dilindungi.
- Kirim nilai tersebut ke
/in.phpdenganmethod=amazon_waf. - Lakukan polling ke
/res.phpsampai jawabannya siap. - Tukarkan jawaban dengan
aws-waf-tokenlalu kirimkan bersama permintaan Anda ke situs.
Tempat Menemukan Nilai di Halaman Challenge
Minta URL yang dilindungi dan simpan body dari respons 405 , atau buka di browser dan gunakan View Page Source. Semua yang Anda butuhkan ada di HTML:
<script>
window.gokuProps = {
"key": "AQIDAHjcYuEXAMPLEghicBgQ/7bFaQZ+m5FKCMDnO+vTbNg96AHDh0IR5vgzHNceHYqZR+GOAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM...",
"iv": "CgAFRDIjfgAAA5yY",
"context": "Rbp3r8fvbuhmrCqpUe8Mh1TLvs8OSKJZiSs2vCF4dt9rxVZI7xYJa2n5k/9r+XaXe7KUIu2I8nXTDHHkDvIOTDc2..."
};
</script>
<script src="https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/challenge.js"></script>
<script src="https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/captcha.js"></script>
| Nilai di halaman | Kirim sebagai |
|---|---|
| gokuProps.key | sitekey. Key panjang yang biasanya diawali dengan AQIDAH. Key ini mengidentifikasi konfigurasi firewall situs. |
| gokuProps.iv | iv. Berubah di setiap halaman challenge. |
| gokuProps.context | context. Berubah di setiap halaman challenge, bersama dengan iv. |
| URL challenge.js | challenge_script. Alamat lengkap skrip, persis seperti yang tertulis di atribut src atribut. |
| URL captcha.js | captcha_script. Alamat lengkap skrip, persis seperti yang tertulis di atribut src atribut. |
Hanya sitekey dan pageurl yang wajib. iv dan context dikirim bersama: kirim keduanya atau tidak sama sekali. Setiap nilai yang tidak Anda kirim dibaca dari pageurl saat penyelesaian, yang merupakan pilihan lebih aman jika salinan halaman Anda sudah lebih dari beberapa menit.
Tempat Menemukan Nilai di Halaman Widget
Buka halaman yang menampilkan teka-teki dan cari di source-nya, atau di tab Network pada developer tools browser, skrip jsapi.js dan panggilan renderCaptcha yang sama:
<script src="https://5b7e0a19c3d8.us-east-1.captcha-sdk.awswaf.com/5b7e0a19c3d8/jsapi.js"></script>
<script>
AwsWafCaptcha.renderCaptcha(document.getElementById("captcha"), {
apiKey: "Xr9kEXAMPLE2bWQx1vTq8LmZ0aYc4dHs7nFp3gJt6uKw5eRi...9AbCdEfGh=_0_1",
onSuccess: function (wafToken) { /* ... */ }
});
</script>
| Nilai di halaman | Kirim sebagai |
|---|---|
| apiKey | sitekey. Key panjang yang diakhiri sufiks pendek, misalnya _0_1. Beberapa situs menyimpannya di file JavaScript terpisah, bukan di HTML, jadi cari apiKey di skrip yang dimuat jika tidak ada di halaman. |
| URL jsapi.js | jsapiScript. Alamat lengkap skrip, persis seperti yang tertulis di atribut src atribut. |
Halaman widget tidak memiliki gokuProps, jadi jangan kirim iv atau context. Mengirim jsapiScript tanpa keduanya itulah yang menandai permintaan sebagai penyelesaian widget.
Jenis Tantangan
AWS WAF yang menentukan teka-teki mana yang ditampilkan. Anda tidak perlu memberi tahu CapSkip mana yang akan muncul.
| Challenge | Tampilan | Didukung | Deskripsi |
|---|---|---|---|
| Grid gambar | 3 x 3 petak | Ya | Sembilan gambar dan instruksi seperti “Choose all the beds” (pilih semua tempat tidur), diakhiri dengan tombol Pastikan . Teka-teki yang paling umum. |
| Mobil mainan | Satu gambar | Ya | Mobil mainan di peta jalan kecil, yang harus dipindahkan ke ujung jalurnya. |
Sesekali sebuah teka-teki tidak bisa dijawab dan hasilnya adalah ERROR_CAPTCHA_UNSOLVABLE. Kirim task baru: setiap percobaan mendapat teka-teki baru.
Daftar Parameter Permintaan POST
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| method | String | Ya | Harus amazon_waf. Menandakan bahwa Anda mengirim AWS WAF CAPTCHA. |
| sitekey | String | Ya | The gokuProps.key dari halaman challenge, atau apiKey. |
| pageurl | String | Ya | URL lengkap http atau https URL halaman yang dilindungi AWS WAF. |
| iv | String | Tidak | The gokuProps.iv dari halaman challenge. Kirim bersama context, atau jangan kirim keduanya. |
| context | String | Tidak | The gokuProps.context dari halaman challenge. Kirim bersama iv, atau jangan kirim keduanya. |
| challenge_script | String | Tidak | URL lengkap skrip halaman: challenge.js. |
| captcha_script | String | Tidak | URL lengkap skrip halaman: captcha.js. |
| jsapiScript | String | Tidak | Khusus halaman widget: URL lengkap jsapi.js. |
| 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. SOCKS4 tidak diterima. |
| json | Integer Default: 0 | Tidak | 0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON. |
Setiap URL skrip yang Anda kirim harus mengarah ke host awswaf.com . Skrip dari tempat lain ditolak karena bukan integrasi AWS WAF.
Proxy
CapSkip tidak mewajibkan proxy untuk metode ini, dan satu alamat sudah cukup untuk pengujian dan penyelesaian sesekali. Lebih dari itu, Anda membutuhkan proxy. Situs yang dilindungi AWS WAF biasanya memadukan CAPTCHA dengan rate limit dan aturan reputasi IP, sehingga aliran penyelesaian terus-menerus dari satu alamat cepat mendapat perlakuan lebih ketat lalu diblokir. Konfigurasikan daftar proxy untuk AWS WAF di Pengaturan CapSkip dan biarkan CapSkip membagi beban, atau kirim proxy per permintaan ketika token harus berasal dari jaringan tertentu.
Mengirim Tugas
Kirim permintaan HTTP POST ke endpoint API CapSkip Anda (/in.php) dengan method=amazon_waf. Field formulir, body JSON, dan query string GET semuanya diterima dengan nama field yang sama. Key berisi +, / dan =, jadi lakukan URL-encode saat mengirimnya sebagai field formulir.
Kirim halaman challenge:
curl -X POST \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "method=amazon_waf" \ --data-urlencode "sitekey=AQIDAHjcYuEXAMPLEghicBgQ/7bFaQZ+m5FKCMDnO+vTbNg96AHDh0IR5vgzHNceHYqZR+GOAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM..." \ --data-urlencode "iv=CgAFRDIjfgAAA5yY" \ --data-urlencode "context=Rbp3r8fvbuhmrCqpUe8Mh1TLvs8OSKJZiSs2vCF4dt9rxVZI7xYJa2n5k/9r+XaXe7KUIu2I8nXTDHHkDvIOTDc2..." \ --data-urlencode "challenge_script=https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/challenge.js" \ --data-urlencode "pageurl=https://www.example.com/" \ --data-urlencode "json=1" \ http://127.0.0.1:8080/in.php
Kirim halaman widget (body JSON):
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"method": "amazon_waf",
"sitekey": "Xr9kEXAMPLE2bWQx1vTq8LmZ0aYc4dHs7nFp3gJt6uKw5eRi...9AbCdEfGh=_0_1",
"jsapiScript": "https://5b7e0a19c3d8.us-east-1.captcha-sdk.awswaf.com/5b7e0a19c3d8/jsapi.js",
"pageurl": "https://www.example.com/contact",
"json": 1
}' \
http://127.0.0.1:8080/in.php
Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Dengan json=1, responsnya berupa amplop JSON:
{
"status": 1,
"request": "2122988149"
}
Tidak adanya sitekey, tidak validnya pageurl, sebuah iv tanpa context (atau sebaliknya), dan proxy yang formatnya salah ditolak pada permintaan ini, sebelum pekerjaan apa pun dimulai.
Mendapatkan Hasil
Tunggu sekitar 5 detik, lalu kirim permintaan HTTP GET ke /res.php dengan ID CAPTCHA. Ulangi setiap 5 detik selama jawabannya CAPCHA_NOT_READY. Sebagian besar task siap dalam 15 detik; proxy yang lambat menambah waktunya.
| 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"
Jawabannya terdiri dari dua nilai, sehingga request berupa objek, bukan string:
{
"status": 1,
"request": {
"captcha_voucher": "eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ",
"existing_token": "7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="
}
}
Tanpa json=1, objek yang sama muncul setelah OK| dalam satu baris:
OK|{"captcha_voucher":"eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ","existing_token":"7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="}
| Kolom | Arti |
|---|---|
| captcha_voucher | Bukti dari AWS WAF bahwa teka-teki telah dijawab. |
| existing_token | Token tempat voucher diterbitkan. Keduanya hanya berfungsi sebagai pasangan. |
Jika task gagal, /res.php mengembalikan ERROR_CAPTCHA_UNSOLVABLE, atau teks error pengganti yang dikonfigurasi di CapSkip. Kirim task baru untuk mencoba lagi.
Menukar Voucher Menjadi Cookie
AWS WAF menukar pasangan ini dengan aws-waf-token final di host token miliknya: host dan folder tempat challenge.js dimuat. Di halaman widget, temukan permintaan challenge.js tersebut di tab Network; jsapi.js memuatnya untuk Anda. Ganti challenge.js dengan voucher lalu POST pasangan tersebut sebagai JSON:
curl -X POST \
-H "Content-Type: text/plain;charset=UTF-8" \
-H "Origin: https://www.example.com" \
-d '{"captcha_voucher":"eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ","existing_token":"7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="}' \
https://3f2a9c7d41b0.edge.sdk.awswaf.com/3f2a9c7d41b0/8e51d0c7a2f4/voucher
Responsnya berupa objek JSON yang field token berisi aws-waf-token. Tukarkan voucher begitu diterima, jangan disimpan untuk nanti.
Menggunakan Token
Kirim token sebagai cookie aws-waf-token di domain yang dilindungi lalu ulangi permintaan yang terkena challenge. Situs kini menjawab dengan konten aslinya, bukan halaman 405 :
curl -b "aws-waf-token=7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:HgoAxEXAMPLEcookieBBBB:Q2FwU2tpcA==" \ https://www.example.com/
Di halaman widget, ini adalah token yang sama yang diterima callback onSuccess halaman. Banyak halaman semacam ini meneruskannya sebagai cookie aws-waf-token , sebagian lagi di header permintaan x-aws-waf-token , jadi periksa apa yang dikirim permintaan milik halaman itu sendiri dan tirukan.
Token berlaku selama immunity time situs, yang di AWS WAF secara default 5 menit dan dapat diperpanjang pemilik situs. Saat challenge muncul lagi, kirim task baru.
JSON API
API JSON createTask / getTaskResult juga menerima AWS WAF, sebagai AmazonTask / AmazonTaskProxyless dan AntiAwsWafTask / AntiAwsWafTaskProxyLess, dengan nama field dan format hasil dari layanan yang sedang diemulasikan CapSkip. Beberapa format tersebut langsung mengembalikan aws-waf-token final, sehingga tidak ada voucher yang perlu ditukar. Tipe ini tidak tersedia saat NextCaptcha atau EzCaptcha menjadi layanan yang dipilih.
GeeTest v3 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.php
JSON body memungkinkan tiga hal yang tidak bisa dilakukan oleh form encoding. Flag bisa berupa boolean asli ("json": true), challenge_json bisa berupa dokumen bersarang alih-alih string yang di-escape, dan field yang diatur ke null dianggap tidak dikirim.
Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.
{
"status": 1,
"request": "2122988149"
}
Jika tidak, CapSkip mengembalikan kode error yang sesuai. Challenge inline yang formatnya salah ditolak pada request pengiriman itu sendiri, bukan setelah polling, sehingga Anda langsung mengetahuinya pada request yang bermasalah.
Tunggu sekitar 5 detik, lalu kirim request HTTP GET ke endpoint hasil (/res.php) dengan CAPTCHA ID yang Anda terima.
Daftar parameter permintaan GET
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| action | String | Ya | Tentukan get untuk mengambil solusi CAPTCHA. |
| id | Integer | Ya | ID CAPTCHA yang dikembalikan oleh in.php permintaan. |
| json | Integer Default: 0 |
Tidak | 0 mengembalikan respons sebagai teks biasa. 1 mengembalikan respons sebagai JSON. |
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"
Jika CAPTCHA sudah dipecahkan, CapSkip mengembalikan solusinya dalam format JSON:
{
"status": 1,
"request": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiM2RkMi...",
"solution": {
"token": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiM2RkMi...",
"number": 9661
},
"cost": "0.0020",
"createTime": 1788863246,
"endTime": 1788863246,
"errorId": 0,
"solveCount": 1
}
request dan solution.token selalu berisi string yang sama, jadi baca mana pun yang diharapkan oleh klien Anda. number adalah counter yang memecahkan challenge, dikembalikan demi kelengkapan. Tanpa json=1, jawabannya cukup berupa OK|<token>.
Jika CAPTCHA belum dipecahkan, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.
Kendalikan loop polling Anda berdasarkan errorId, bukan berdasarkan status. status adalah bilangan bulat 1 yang selalu dikembalikan oleh kontrak res.php dan itulah yang dibaca oleh setiap SDK yang kompatibel. Jika Anda menulis klien Anda berdasarkan halaman dokumentasi yang menampilkan "status": "ready", periksa errorId === 0 atau keberadaan solution.token sebagai gantinya.
Mengirimkan Token
Widget ALTCHA menempatkan payload-nya pada form field bernama altcha. Kirimkan token apa adanya pada field tersebut, persis seperti yang akan dilakukan widget:
POST https://www.example.com/signup Content-Type: application/x-www-form-urlencoded email=someone%40example.com&altcha=eyJhbGdvcml0aG0iOiJTSEEtMjU2Iiwi...
Bentuk internal payload mengikuti challenge yang menghasilkannya. Challenge legacy menghasilkan dokumen datar yang memuat number, sedangkan challenge PoW v2 menghasilkan dokumen yang menyarangkan challenge asli di bawah challenge dan jawabannya di bawah solution. Perlakukan token sebagai nilai opaque dan teruskan tanpa perubahan, karena situs target sudah mengetahui bentuk mana yang diharapkannya.
Sebagian integrasi justru membaca payload dari field pada JSON body, jadi periksa apa yang dikirim oleh proses submit milik halaman itu sendiri lalu tirulah. Jangan melakukan re-encode, memangkas, atau mengubah urutan token. Token tersebut adalah base64 dari sebuah dokumen JSON yang field-nya tercakup dalam tanda tangan HMAC milik server, sehingga modifikasi apa pun akan membuatnya tidak valid.
Algoritma yang Didukung
Anda tidak perlu mencari tahu skema mana yang digunakan sebuah situs. CapSkip membaca challenge dan memilih sendiri algoritmanya.
| Skema | Generasi | Didukung | Deskripsi |
|---|---|---|---|
| Legacy PoW | v1 | Ya | Cari n yang membuat SHA(salt + n) sama dengan challenge. SHA-1, SHA-256, SHA-384, dan SHA-512 semuanya didukung. Inilah bentuk yang masih dijalankan oleh sebagian besar deployment. |
| PBKDF2 | PoW v2 | Ya | Cari counter yang derived key-nya diawali dengan prefix target. SHA-256, SHA-384, dan SHA-512 didukung. Inilah default yang direkomendasikan ALTCHA sendiri. |
| SHA | PoW v2 | Ya | Varian hash iteratif dari skema yang sama. |
| Argon2id | PoW v2 | Tidak | Fungsi derivasi kunci yang memory hard. Ditolak, bukan dicoba. |
| scrypt | PoW v2 | Tidak | Fungsi derivasi kunci yang memory hard. Ditolak, bukan dicoba. |
Kedua mode effort berfungsi dan tidak memerlukan apa pun dari Anda. Pada mode deterministik , server menghitung target terlebih dahulu sehingga waktu pemecahan dapat diprediksi, sedangkan pada mode probabilistik , waktu pemecahan bervariasi dari satu challenge ke challenge berikutnya. Ketiga tipe widget (native, checkbox dan switch) didukung, karena tipe hanya menentukan gaya visual kontrol dan tidak pernah sampai ke API.
Argon2id dan scrypt ditolak, bukan dicoba. Task yang memakai salah satunya akan mengembalikan ERROR_CAPTCHA_UNSOLVABLE dalam waktu sekitar sepertiga detik dan tidak pernah dicoba ulang, sehingga tidak pernah salah dipecahkan secara diam-diam. Karena ALTCHA merekomendasikan PBKDF2 sebagai default-nya, hal ini hanya memengaruhi sebagian kecil situs.
CaptchaFox 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. Sebagai gantinya, gunakan userAgent yang dikembalikan bersama hasil. |
| 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.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
| 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",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
},
"cost": "0.00145",
"createTime": 1788863246,
"endTime": 1788863262,
"errorId": 0,
"solveCount": 1,
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}
request dan solution.token selalu berisi string yang sama, jadi bacalah mana pun yang diharapkan oleh klien Anda. Tanpa json=1, jawabannya cukup berupa OK|<token>.
Jika solve melaporkannya, User-Agent browser dikembalikan sebagai userAgent, baik di tingkat teratas maupun di dalam solution. Dalam mode teks biasa, baca nilainya dari header X-CaptchaFox-User-Agent yang ada di respons. Kirim User-Agent tersebut saat Anda mengirim token.
Jika CAPTCHA belum dipecahkan, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.
Kendalikan loop polling Anda berdasarkan errorId, bukan berdasarkan status. status adalah bilangan bulat 1 yang selalu dikembalikan oleh kontrak res.php dan itulah yang dibaca oleh setiap SDK yang kompatibel. Jika Anda menulis klien Anda berdasarkan halaman dokumentasi yang menampilkan "status": "ready", periksa errorId === 0 atau keberadaan solution.token sebagai gantinya.
Mengirimkan Token
Widget CaptchaFox menaruh tokennya di kolom formulir bernama cf-captcha-response. Kirimkan token apa adanya pada field tersebut, persis seperti yang akan dilakukan widget:
POST https://www.example.com/signup Content-Type: application/x-www-form-urlencoded email=someone%40example.com&cf-captcha-response=177f50c25b845601e5c779cdb51b040d...
Sebagian integrasi justru membaca token dari field pada body JSON, jadi periksa apa yang dikirim oleh proses submit halaman itu sendiri dan tirukan. Perlakukan token sebagai nilai buram dan teruskan tanpa diubah. Token diverifikasi di sisi server terhadap sesi yang menghasilkannya, sehingga perubahan apa pun membuatnya tidak valid.
Token berumur pendek. Kirimkan segera alih-alih menahannya selagi pengguna mengisi formulir, dan pecahkan lagi bila formulir ditinggalkan lalu dilanjutkan kembali.
Memilih Sumber Widget
CaptchaFox menerbitkan widgetnya dari dua tempat, dan tempat mana yang dimuat sebuah situs menentukan bentuk token yang diharapkannya kembali. Kirim api_server hanya bila halaman target tidak memakai nilai default.
| api_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.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
| 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.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
| 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. |
DataDome adalah perlindungan bot di balik banyak toko besar, situs berita, dan marketplace. Saat meragukan seorang pengunjung, situs menjawab dengan halaman blokir alih-alih kontennya, dan halaman itu berisi slider atau pemeriksaan perangkat singkat. Lolos dari tantangan itu akan memasang cookie datadome yang membuat permintaan yang membawanya diloloskan. CapSkip melewati tantangan yang Anda kirim dan mengembalikan cookie tersebut, sehingga skrip yang tidak memiliki browser sendiri tetap dapat terus mengambil data dari situs.
Cara Kerjanya
Permintaan yang diblokir kembali dengan status 403 (terkadang 401) dan halaman HTML kecil. Halaman itu memuat objek skrip, var dd={...}, dan memuat tantangan di dalam iframe dari geo.captcha-delivery.com. Alamat iframe inilah yang dibutuhkan CapSkip: alamat ini disebut captcha_url di bawah.
DataDome menampilkan dua jenis tantangan, dan CapSkip menangani keduanya melalui satu metode ini:
- Slider. Jalur iframe-nya adalah
/captcha/dan pengunjung menggeser slider, terkadang ke sebuah kepingan puzzle. - Pemeriksaan perangkat. Jalur iframe-nya adalah
/interstitial/dan halaman menampilkan “Verifying the device” selama beberapa detik. Jika pemeriksaan tidak terpenuhi, DataDome beralih ke slider, dan CapSkip mengikutinya.
Siklus lengkapnya terdiri dari empat langkah:
- Kirim permintaan ke halaman target dan terima halaman blokir DataDome.
- Susun
captcha_urldari halaman tersebut (lihat di bawah), lalu kirimkan ke/in.phpdenganmethod=datadome. - Lakukan polling ke
/res.phphingga cookie siap. - Ulangi permintaan Anda dengan cookie tersebut, User-Agent yang sama, dan alamat IP yang sama.
Pemecahan biasanya memakan waktu antara 3 dan 20 detik. Pemeriksaan perangkat berada di ujung singkat rentang tersebut, sedangkan slider di ujung panjang.
Cookie Terikat pada Satu IP dan Satu Browser
DataDome mengikat cookie ke alamat IP dan User-Agent yang mendapatkannya. Cookie yang dipakai ulang dari alamat lain, atau dengan User-Agent lain, biasanya ditolak dan halaman blokir muncul kembali. Dari situ berlaku dua aturan:
- Pemecahan harus berasal dari alamat yang akan Anda gunakan untuk memakai cookie. Jika permintaan Anda keluar melalui proxy, kirim proxy tersebut bersama tugas. Jika permintaan berasal dari komputer yang menjalankan CapSkip, jangan kirim proxy.
- Kirim User-Agent yang akan Anda gunakan. User-Agent tersebut harus Chrome untuk Windows dengan versi mayor yang sama dengan browser yang digunakan CapSkip untuk memecahkan. User-Agent lain akan menghasilkan cookie yang ditolak situs, sehingga langsung ditolak sejak awal dengan
ERROR_WRONG_USERAGENT. User-Agent Firefox, Safari, Edge, dan seluler ditolak dengan alasan yang sama.
Jika halaman blokir itu sendiri menyatakan bahwa alamat tersebut dicekal, tidak ada yang dikirim dari alamat itu yang bisa lolos, sehingga tugas langsung ditolak dengan ERROR_PROXY_BANNED alih-alih dicoba. Anda dapat mengenalinya lebih awal: objek dd berisi 't':'bv' alih-alih 't':'fe'. Ganti alamat dan minta halaman itu lagi.
Menyusun captcha_url
Jika halaman blokir yang Anda terima sudah berisi iframe, ambil atribut src tersebut apa adanya. Sebagian besar halaman blokir justru membangun iframe dengan skrip, sehingga Anda menyusun alamat yang sama dari objek dd tersebut. Halaman blokir terlihat seperti ini:
<script>
var dd={'rt':'c','cid':'AHrlqAAAAAMA7KBvCr0n4cEAG330MA==','hsh':'D013AA612AB2224D03B2318D0F5B19','t':'fe','s':45225,'e':'549255a0289eaf17af60822309ab8db4','host':'geo.captcha-delivery.com','cookie':'KzE6_pZBBTHdCdvZkauT9VAshi0wS7~v5_M_MacEtdw8'}
</script>
<script src="https://ct.captcha-delivery.com/c.js"></script>
Nilai dari rt menentukan jalurnya: c berarti https://geo.captcha-delivery.com/captcha/ dan i berarti https://geo.captcha-delivery.com/interstitial/. Query string disusun dari field lainnya:
| Parameter URL | Nilai |
|---|---|
| initialCid | The cid kolom. |
| hash | The hsh kolom. |
| cid | The cookie kolom. |
| t | The t field. Hanya ada pada /captcha/ saja. |
| referer | URL halaman yang Anda minta. |
| s | The s kolom. |
| e | The e field, jika ada. |
| b | The b field. Hanya ada pada /interstitial/ saja. |
| dm | Selalu cd. |
Lakukan URL encode pada setiap nilai. Dalam JavaScript:
const dd = JSON.parse(html.match(/var dd=(\{[^}]*\})/)[1].replace(/'/g, '"'));
const path = dd.rt === 'i' ? 'interstitial' : 'captcha';
const q = new URLSearchParams({ initialCid: dd.cid, hash: dd.hsh, cid: dd.cookie });
if (dd.t) q.set('t', dd.t);
q.set('referer', pageUrl);
q.set('s', dd.s);
if (dd.e) q.set('e', dd.e);
if (dd.b) q.set('b', dd.b);
q.set('dm', 'cd');
const captchaUrl = `https://${dd.host || 'geo.captcha-delivery.com'}/${path}/?${q}`;
Setiap halaman blokir adalah tantangan baru. Kirimkan segera setelah Anda menerimanya, dan minta halaman itu lagi untuk tugas berikutnya alih-alih memakai ulang salinan lama dari captcha_url.
Daftar Parameter Permintaan POST
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| method | String | Ya | Harus datadome. Menandakan bahwa Anda mengirim tantangan DataDome. |
| captcha_url | String | Ya | Alamat iframe tantangan di geo.captcha-delivery.com. Lihat Menyusun captcha_url di atas. |
| pageurl | String | Ya | URL lengkap halaman yang mengembalikan halaman blokir. |
| userAgent | String | Tidak | User-Agent yang akan Anda kirim bersama cookie: Chrome untuk Windows, dengan versi mayor yang sama dengan browser yang digunakan CapSkip untuk memecahkan. Jika Anda tidak mengirimkannya, CapSkip menggunakan User-Agent browser tersebut, dan balasan menyebutkannya sehingga Anda dapat menyalinnya apa adanya. |
| proxy | String | Tidak | Alamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD. Kirim proxy yang akan digunakan oleh permintaan Anda berikutnya. |
| 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. Satu alamat sudah cukup untuk pengujian dan pemecahan sesekali. Lebih dari itu, DataDome menilai alamat sama ketatnya dengan browser, dan aliran halaman blokir yang terus-menerus dari satu IP berakhir dengan pencekalan IP tersebut di situs itu. Pada volume besar, kirim permintaan dan tugas Anda melalui kumpulan proxy residensial, satu proxy per tugas, dan gunakan setiap cookie melalui proxy yang mendapatkannya. Gunakan proxy sticky, yaitu proxy yang mempertahankan IP keluar yang sama setidaknya selama beberapa menit. Proxy yang mengganti IP-nya di setiap koneksi tidak dapat menghasilkan cookie yang berfungsi: challenge dimuat dari beberapa alamat, dan cookie ditolak dari alamat berikutnya.
CapSkip juga memiliki daftar proxy DataDome sendiri, di Pengaturan, Jenis captcha, DataDome, Konfigurasi Proxy. Tugas yang dikirim tanpa proxy dipecahkan melalui daftar tersebut. Biarkan kosong kecuali permintaan yang membawa cookie juga melewati proxy yang sama, karena cookie hanya akan berfungsi dari alamat yang memecahkannya. Balasan menyebutkan proxy yang digunakan setiap tugas. Proxy yang dikirim bersama tugas selalu lebih diprioritaskan daripada daftar tersebut.
Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=datadome. Field formulir, query string, dan body JSON semuanya diterima dengan nama field yang identik.
Kirim DataDome:
curl -X POST \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "method=datadome" \ --data-urlencode "captcha_url=https://geo.captcha-delivery.com/captcha/?initialCid=AHrlqAAAAAMA7KBvCr0n4cEAG330MA%3D%3D&hash=D013AA612AB2224D03B2318D0F5B19&cid=KzE6_pZBBTHdCdvZkauT9VAshi0wS7~v5_M_MacEtdw8&t=fe&referer=https%3A%2F%2Fwww.example.com%2F&s=45225&e=549255a0289eaf17af60822309ab8db4&dm=cd" \ --data-urlencode "pageurl=https://www.example.com/" \ --data-urlencode "userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36" \ --data-urlencode "proxy=login:[email protected]:8080" \ --data-urlencode "proxytype=HTTP" \ --data-urlencode "json=1" \ http://127.0.0.1:8080/in.php
Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.
{
"status": 1,
"request": "2122988149"
}
Jika tidak, CapSkip mengembalikan kode error pada permintaan pengiriman itu sendiri, sebelum pekerjaan apa pun dilakukan:
| Kesalahan | Penyebab |
|---|---|
| ERROR_BAD_PARAMETERS | captcha_url tidak ada atau bukan alamat tantangan DataDome. |
| ERROR_PAGEURL | pageurl tidak ada atau bukan alamat http atau https yang valid. |
| ERROR_WRONG_USERAGENT | User-Agent bukan Chrome untuk Windows dengan versi mayor yang digunakan CapSkip untuk memecahkan. |
| ERROR_PROXY_BANNED | Halaman blokir menyatakan bahwa alamat ini dicekal (t=bv). |
| ERROR_PROXY_FORMAT | Nilai proxy tidak dapat dibaca. |
Tunggu sekitar 5 detik, lalu kirim request HTTP GET ke endpoint hasil (/res.php) dengan CAPTCHA ID yang Anda terima.
Daftar parameter permintaan GET
| 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 tantangan berhasil dilewati, CapSkip mengembalikan cookie persis seperti yang ditetapkan DataDome, termasuk atributnya:
{
"status": 1,
"request": "datadome=FAPPpli4jkT1MZGtgF8ez7mjSz8MrJ9fGRNE51Gj79cq9fXp5xn~F1P5APWjqvJojf4U9dq0R81Xaj2hpYtjle95mkg; Max-Age=31536000; Domain=.example.com; Path=/; Secure; SameSite=Lax",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
"proxy": "203.0.113.10:8080"
}
userAgent adalah User-Agent yang digunakan saat cookie diperoleh: yang Anda kirim, atau yang digunakan CapSkip jika Anda tidak mengirimkannya. Kirimkan bersama setiap permintaan yang membawa cookie.
proxy hanya muncul jika tugas Anda tidak mengirim proxy dan CapSkip mengambil satu dari daftar proxy DataDome miliknya. Isinya adalah proxy tersebut dalam format host:port, tanpa login, dan cookie hanya berfungsi melaluinya. Jika tugas mengirim proxy sendiri, atau CapSkip memecahkan tanpa proxy, field ini tidak ada.
Tanpa json=1, cookie muncul setelah awalan OK| sebagai teks biasa, dan dua nilai yang sama dikirim dalam header X-DataDome-User-Agent dan X-DataDome-Proxy pada respons.
OK|datadome=FAPPpli4jkT1MZGtgF8ez7mjSz8MrJ9fGRNE51Gj79cq9fXp5xn~F1P5APWjqvJojf4U9dq0R81Xaj2hpYtjle95mkg; Max-Age=31536000; Domain=.example.com; Path=/; Secure; SameSite=Lax
Jika tantangan belum dilewati, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.
Setiap hasil dikirimkan satu kali. Polling pertama yang berhasil mengembalikan cookie lalu membuangnya, jadi simpan cookie dari balasan yang membawanya.
Tugas yang tidak dapat dilewati mengembalikan ERROR_CAPTCHA_UNSOLVABLE. Dua kegagalan justru menyebutkan alamatnya, karena mengirim ulang melalui alamat itu akan gagal lagi: ERROR_PROXY_BANNED saat DataDome mencekal alamat tersebut selama pemecahan, dan ERROR_PROXY_CONNECT_REFUSED saat proxy tidak dapat dijangkau.
Menggunakan Cookie
Bagian sebelum titik koma pertama adalah cookie itu sendiri. Kirimkan bersama permintaan Anda berikutnya, melalui proxy yang sama dan dengan User-Agent yang sama yang Anda kirim dalam tugas:
curl "https://www.example.com/" \ -x "http://login:[email protected]:8080" \ -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36" \ -b "datadome=FAPPpli4jkT1MZGtgF8ez7mjSz8MrJ9fGRNE51Gj79cq9fXp5xn~F1P5APWjqvJojf4U9dq0R81Xaj2hpYtjle95mkg"
Jika Anda menggunakan cookie jar, Anda dapat menyimpan seluruh string sebagai gantinya: Domain, Path dan Max-Age adalah nilai yang dipilih DataDome untuk situs tersebut.
DataDome dapat mengirim cookie datadome pengganti pada respons berikutnya. Simpan yang terbaru, seperti yang dilakukan browser. Jika halaman blokir tetap muncul kembali, situs telah memutuskan untuk menantang lagi: susun captcha_url baru dari halaman itu dan kirim tugas baru.
MTCaptcha adalah CAPTCHA teks yang dipakai pada formulir login, pendaftaran, dan kontak. Pengunjung mengetik karakter terdistorsi yang ditampilkan dalam gambar, lalu widget memasukkan token terverifikasi ke formulir. CapSkip menerima sitekey dan alamat halaman yang Anda kirim, lalu mengembalikan token MTCaptcha yang valid dan siap dikirim bersama formulir.
Cara Kerjanya
Widget MTCaptcha dikonfigurasi di halaman dengan sitekey yang diawali MTPublic-. Saat pengunjung lolos tantangan, MTCaptcha menerbitkan token yang diawali v1(, dan widget menuliskannya ke kolom formulir tersembunyi bernama mtcaptcha-verifiedtoken. Situs memeriksa token tersebut ke MTCaptcha saat formulir diterima.
CapSkip hanya membutuhkan sitekey dan alamat halaman. Anda tidak perlu memuat atau memecahkan widget sendiri: gambar yang tampil di browser Anda tidak pernah dikirim, dan token yang dikembalikan CapSkip diterima dengan sendirinya. Siklus lengkapnya terdiri dari tiga langkah:
- Kirim sitekey dan URL halaman ke
/in.phpdenganmethod=mt_captcha. - Lakukan polling ke
/res.phphingga token siap. - Kirim formulir dengan token di
mtcaptcha-verifiedtoken.
Menemukan Sitekey
Sebagian besar halaman mengonfigurasi widget dengan objek mtcaptchaConfig di sumber halaman:
<script>
var mtcaptchaConfig = {
"sitekey": "MTPublic-KzqLY1cKH",
"action": "login"
};
</script>
Salin sitekey persis seperti yang tertulis. Jika objek tersebut juga menetapkan action, kirim juga nilai itu. Jika widget sudah tampil di layar, sitekey yang sama ada di alamat iframe-nya di service.mtcaptcha.com, di query string-nya sebagai sitekey.
Daftar Parameter Permintaan POST
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| key | String | Ya* | Kunci API CapSkip Anda. Diperlukan hanya jika Validasi Kunci API diaktifkan. |
| method | String | Ya | Harus mt_captcha. Menandakan bahwa Anda mengirim tantangan MTCaptcha. mtcaptcha juga diterima. |
| sitekey | String | Ya | Sitekey MTCaptcha dari halaman, diawali dengan MTPublic-. |
| pageurl | String | Ya | URL lengkap halaman tempat widget berada. MTCaptcha hanya menerbitkan token untuk domain tempat sitekey didaftarkan, jadi kirim alamat halaman yang sebenarnya. |
| action | String | Tidak | Nama action yang ditetapkan halaman di objek mtcaptchaConfig miliknya, jika ada. |
| userAgent | String | Tidak | User-Agent yang dikirim ke MTCaptcha. Jika Anda tidak mengirimnya, CapSkip memakai User-Agent Chrome untuk Windows. |
| proxy | String | Tidak | Alamat proxy. Menerima IP:PORT, LOGIN:PASSWORD@IP:PORT atau IP:PORT:LOGIN:PASSWORD. |
| proxytype | String | Tidak | Tipe proxy: HTTP, HTTPS, SOCKS4, 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. Satu alamat cukup untuk pengujian dan pemecahan sesekali. Lebih dari itu, siapkan pool proxy: setiap pemecahan meminta tantangan baru dari layanan MTCaptcha, dan aliran permintaan terus-menerus dari satu alamat adalah hal yang memang ditangkap oleh rate limiting. Tambahkan pool di Pengaturan, Jenis captcha, MTCaptcha, Konfigurasi Proxy, dan tugas yang dikirim tanpa proxy akan dibagi ke pool tersebut. Kirim proxy bersama tugas jika pemecahan harus berasal dari jaringan tertentu. Proxy yang dikirim bersama tugas selalu lebih diutamakan daripada daftar.
Kirim permintaan HTTP GET atau POST ke endpoint CapSkip API Anda (/in.php) dengan method=mt_captcha. Field formulir, query string, dan body JSON semuanya diterima dengan nama field yang identik.
Kirim MTCaptcha:
curl -X POST \ --data-urlencode "key=YOUR_API_KEY" \ --data-urlencode "method=mt_captcha" \ --data-urlencode "sitekey=MTPublic-KzqLY1cKH" \ --data-urlencode "pageurl=https://www.example.com/login" \ --data-urlencode "action=login" \ --data-urlencode "json=1" \ http://127.0.0.1:8080/in.php
Jika semuanya benar, CapSkip mengembalikan CAPTCHA ID sebagai teks biasa: OK|2122988149. Jika parameter json=1 dikirim, responsnya berupa JSON envelope. Bagaimanapun juga, nilai yang dikembalikan adalah CAPTCHA ID yang Anda polling untuk mendapatkan hasilnya.
{
"status": 1,
"request": "2122988149"
}
Jika tidak, CapSkip mengembalikan kode error pada permintaan pengiriman itu sendiri, sebelum pekerjaan apa pun dilakukan:
| Kesalahan | Penyebab |
|---|---|
| ERROR_BAD_PARAMETERS | sitekey tidak ada atau bukan sitekey MTCaptcha (MTPublic- diikuti huruf, angka, - atau _). |
| ERROR_PAGEURL | pageurl tidak ada atau bukan alamat http atau https yang valid. |
| ERROR_PROXY_FORMAT | Nilai proxy tidak dapat dibaca. |
Tunggu sekitar 5 detik, lalu kirim request HTTP GET ke endpoint hasil (/res.php) dengan CAPTCHA ID yang Anda terima.
Daftar parameter permintaan GET
| 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 tantangan sudah lolos, CapSkip mengembalikan token MTCaptcha:
{
"status": 1,
"request": "v1(23ed91f2,61d9f4fe,MTPublic-KzqLY1cKH,079c683122559a6f**)"
}
Tanpa json=1, token mengikuti awalan OK| sebagai teks biasa:
OK|v1(23ed91f2,61d9f4fe,MTPublic-KzqLY1cKH,079c683122559a6f**)
Jika tantangan belum dilewati, CapSkip mengembalikan CAPCHA_NOT_READY, ditulis persis seperti itu sama seperti pada semua metode lain. Tunggu 5 detik lalu ulangi request tersebut.
Setiap hasil hanya dikirimkan sekali. Polling pertama yang berhasil mengembalikan token lalu membuangnya, jadi simpan token dari balasan yang membawanya.
Tugas yang tidak dapat dilewati mengembalikan ERROR_CAPTCHA_UNSOLVABLE. Dua kegagalan justru menunjuk tugasnya, karena mengirim ulang tanpa perubahan akan gagal lagi: ERROR_RECAPTCHA_INVALID_SITEKEY saat MTCaptcha tidak mengenali sitekey, dan ERROR_RECAPTCHA_INVALID_DOMAIN saat sitekey tidak diizinkan di domain pageurl. Kedua kode tetap memakai nama lamanya dan berlaku untuk semua metode.
Mengirimkan Token
Masukkan token ke kolom formulir mtcaptcha-verifiedtoken lalu kirim formulir seperti yang dilakukan halaman. Jika Anda mengirim formulir sendiri:
curl -X POST "https://www.example.com/login" \ --data-urlencode "username=alice" \ --data-urlencode "password=YOUR_PASSWORD" \ --data-urlencode "mtcaptcha-verifiedtoken=v1(23ed91f2,61d9f4fe,MTPublic-KzqLY1cKH,079c683122559a6f**)"
Di browser yang Anda kendalikan, isi kolom tersembunyi sebelum formulir dikirim:
document.querySelector('input[name="mtcaptcha-verifiedtoken"]').value = token;
Token berumur pendek dan sekali pakai: MTCaptcha hanya menerimanya satu kali, dan hanya dalam beberapa menit setelah diterbitkan. Gunakan segera setelah diterima, dan minta token baru untuk setiap pengiriman formulir. Situs memverifikasi token di servernya sendiri dengan panggilan checktoken milik MTCaptcha, yang memeriksa sitekey dan domain, sehingga token hanya berlaku di situs tempat token itu diminta.
Menggunakan Proxy
Untuk reCAPTCHA v2, v3, Invisible, Enterprise, Cloudflare, GeeTest, ALTCHA, CaptchaFox, Capy Puzzle, dan Friendly Captcha, Anda dapat mengirimkan proxy bersama setiap tugas. CapSkip akan memecahkan CAPTCHA melalui proxy tersebut alih-alih menggunakan kumpulan proxy yang dikonfigurasi di aplikasi CapSkip.
Ini berguna ketika situs web target memeriksa bahwa token CAPTCHA dihasilkan dari alamat IP yang sama dengan permintaan Anda sendiri, misalnya situs di balik Cloudflare, penilaian reCAPTCHA yang ketat, atau halaman yang dibatasi secara geografis.
Daftar Parameter Permintaan POST
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| proxy | String | Tidak | Alamat proxy. Format untuk autentikasi IP: IP:PORT (contoh: 123.123.123.123:3128). Format untuk autentikasi login/kata sandi: login:password@IP:PORT |
| proxytype | String | Tidak | Jenis proxy. Nilai yang didukung: HTTP, HTTPS, SOCKS5, SOCKS5H. Default: HTTP ketika proxy disediakan tetapi proxytype dihilangkan. |
Kode Kesalahan
| 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. |
ERROR_TASK_NOT_SUPPORTED | Jenis tugas tidak didukung, atau pengaturannya dinonaktifkan di CapSkip. |
ERROR_PROXY_MISSING | Tugas ini memerlukan proxy, dan permintaan tidak membawa proxy yang dapat digunakan. |
ERROR_WRONG_USERAGENT | User-Agent dalam permintaan tidak dapat digunakan untuk tugas ini. |
ERROR_PROXY_BANNED | Situs target memblokir alamat proxy. Gunakan proxy lain. |
ERROR_PROXY_CONNECT_REFUSED | Target tidak dapat dijangkau melalui proxy. |
ERROR_RECAPTCHA_INVALID_SITEKEY | The sitekey tidak ada, atau layanan CAPTCHA menolaknya untuk halaman ini. |
ERROR_RECAPTCHA_INVALID_SITEKEY | Penyedia CAPTCHA tidak mengenali sitekey. Periksa sitekey yang Anda kirim. |
ERROR_RECAPTCHA_INVALID_DOMAIN | Sitekey tidak diizinkan di domain pageurl. Kirim alamat halaman tempat widget sebenarnya berada. |
CAPCHA_NOT_READY | Captcha masih diproses. Lanjutkan polling. |
| (respons kosong) | Hasilnya sudah diambil, atau ID tersebut tidak ada. |
