API Dokümantasyonu

API'yi uygulamalarınıza entegre etmek için mevcut uç noktalar, istek formatları, parametreler ve örnek yanıtlar için başvuru kaynağı.

Bu dokümantasyon, CapSkip'i doğrudan kendi betiklerine, uygulamalarına veya otomasyon sistemlerine entegre etmek isteyen geliştiriciler için hazırlanmıştır. Üçüncü taraf yazılım kullanıcıları, kurulum talimatları için Öğreticiler bölümünü takip etmelidir.

CapSkip, yaygın olarak kullanılan CAPTCHA çözme servislerinin API'lerini taklit eder; bu da herhangi bir değişiklik gerektirmeden uyumlu üçüncü taraf yazılımlara bağlanmasını sağlar. Entegrasyon genellikle yalnızca CapSkip'i çalıştırmayı gerektirir.

Belgeler, isteklerin nasıl gönderileceğini ve sonuçların nasıl alınacağını açıklar. CapSkip birden fazla API ailesini destekler; bunlara 2Captcha tarzı API (in.php / res.php), AntiCaptcha, CapMonster ve CapSolver tarafından kullanılan JSON createTask / getTaskResult API'si ve DeathByCaptcha REST API'si dahildir. Aynı aile içindeki hizmetler aynı endpoint'leri, istek ve yanıt formatını paylaşır. Her hizmet için yalnızca temel URL (host ve port) farklıdır.

API ailesiHizmetler
2captcha tarzı2captcha.com, rucaptcha.com, solvecaptcha.com, captchas.io
JSON (createTask / getTaskResult)anti-captcha.com, capmonster.cloud, capsolver.com
DeathByCaptchadeathbycaptcha.com

Görüntü CAPTCHA

Normal bir CAPTCHA, bozuk ancak insan tarafından okunabilir metin içeren bir görüntüdür. Çözmek için kullanıcının görüntüde gösterilen metni yazması gerekir.

Normal bir CAPTCHA'yı çözmek için, görseli API uç noktasına bir HTTP POST isteğiyle gönderin. İsteği, yapılandırılmış yerel adres ve portu kullanarak doğrudan CapSkip örneğinize gönderin, örneğin: http://127.0.0.1:PORT/in.php

CapSkip, multipart/form-data veya Base64 ile kodlanmış formattaki görüntüleri kabul eder.

Multipart örnek form

<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 CapSkip'te API key doğrulaması etkinse API key'inizi temsil eder. API key doğrulaması devre dışıysa, herhangi bir dize değeri kabul edilir.

Base64 örnek form

<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 CapSkip'te API key doğrulaması etkinse API key'inizi temsil eder. API key doğrulaması devre dışıysa, herhangi bir dize değeri kabul edilir.

BASE64_FILE Base64 ile kodlanmış görüntü verisidir.

POST İstek Parametrelerinin Listesi
POST parametresiTürGerekliAçıklama
keyDizeEvet CapSkip API key'iniz.
methodDizeEvet post: görüntüyü multipart/form-data kullanarak gönderin
base64: görseli Base64 kodlu bir dize olarak gönderin
fileDosyaEvet* CAPTCHA görsel dosyası.
* method=post olduğunda gereklidir.
bodyDizeEvet* Base64 ile kodlanmış CAPTCHA görüntü verisi.
* method=base64 olduğunda gereklidir.
jsonTam sayı
Varsayılan: 0
Hayır 0: yanıt düz metin olarak döndürülür
1: yanıt JSON biçiminde döndürülür

CAPTCHA gönder (multipart dosya yükleme):

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

CAPTCHA gönder (base64 kodlanmış):

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

İsteği gönderdikten sonra, her şey doğruysa, CapSkip CAPTCHA ID'sini düz metin olarak döndürür: OK|12345

Eğer json=1 parametresi kullanılırsa yanıt JSON biçiminde döndürülür:

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

1 saniye bekleyin, ardından sonuç uç noktasına bir HTTP GET isteği gönderin (/res.php) döndürülen CAPTCHA kimliğiyle.

CAPTCHA çözüldüyse, CapSkip sonucu düz metin olarak döndürür: OK|TEXT

Eğer json=1 belirtilmişse, yanıt şu olur:

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

CAPTCHA henüz çözülmediyse CapSkip şunu döndürür: CAPCHA_NOT_READY

Bu durumda 1 saniye bekleyin ve nihai bir sonuç alınana kadar isteği tekrarlayın. CapSkip boş bir yanıt gövdesi döndürürse sonuç zaten alınmıştır veya ID mevcut değildir. Her sonuç yalnızca bir kez okunabilir.

GET istek parametrelerinin listesi
GET parametresiTürGerekliAçıklama
keyDizeEvet CapSkip API key'iniz.
actionDizeEvet get: gönderilen CAPTCHA için yanıtı alır.
idTam sayıEvet Şunun döndürdüğü CAPTCHA ID'si in.php.
jsonTam sayı
Varsayılan: 0
Hayır 0: yanıt düz metin olarak döndürülür
1: yanıt JSON biçiminde döndürülür
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

recaptcha v2 solver  reCAPTCHA V2

reCAPTCHA v2, “I’m not a robot” reCAPTCHA'sı olarak da bilinen, yaygın olarak kullanılan bir CAPTCHA türüdür. Ziyaretçi bir onay kutusunu işaretler ve Google ya onu hemen geçirir ya da form gönderilmeden önce eşleşen görselleri seçmesini ister.

reCAPTCHA v2'yi çözmek için şunu gönderin: googlekey ve pageurl parametreler, şununla birlikte method=userrecaptcha ve CapSkip API anahtarınız.

Şunu edinebilirsiniz: googlekey aşağıdaki yöntemlerden birini kullanarak:

reCAPTCHA widget'ına sağ tıklayın ve şunu seçin: İncele. Şununla başlayan bir URL bulun:

www.google.com/recaptcha/api2/anchor

Şunun değerini kopyalayın: k o URL'deki parametre. Alternatif olarak, şunu bulun: data-sitekey sayfa kaynağındaki özniteliği ve değerini kopyalayın.

CapSkip sitekey

Site anahtarını aldıktan sonra, şuraya bir HTTP GET veya POST isteği gönderin: http://127.0.0.1:PORT/in.php

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet CapSkip API key'iniz.
methodDizeEvet userrecaptcha: bir reCAPTCHA v2 isteği belirtir.
googlekeyDizeEvet Şunun değeri: k veya data-sitekey hedef sayfada bulunan parametre.
pageurlDizeEvet reCAPTCHA'nın bulunduğu sayfanın tam URL'si.
enterpriseTam sayı
Varsayılan: 0
Hayır 1: reCAPTCHA Enterprise v2'yi belirtir.
0: standart reCAPTCHA v2.
invisibleTam sayı
Varsayılan: 0
Hayır 1: Invisible reCAPTCHA'yı belirtir.
0: standart checkbox reCAPTCHA.
data-sDizeHayır Şunun değeri: data-s sayfada bulunan parametre. Google Search ve belirli Google servisleri için geçerlidir.
jsonTam sayı
Varsayılan: 0
Hayır 0: yanıt düz metin olarak döndürülür.
1: yanıt JSON formatında döndürülür.
proxyDizeHayırProxy adresi. IP kimlik doğrulaması için biçim: IP:PORT (örnek: 123.123.123.123:3128). Kullanıcı adı/parola kimlik doğrulaması için biçim: login:password@IP:PORT
proxytypeDizeHayırProxy türü. Desteklenen değerler: HTTP, HTTPS, SOCKS5, SOCKS5H. Varsayılan: HTTP ne zaman proxy sağlanır ancak proxytype atlanır.

reCAPTCHA v2 Gönder (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

reCAPTCHA v2 Gönder (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

Enterprise reCAPTCHA v2 gönderin:

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

Enterprise reCAPTCHA v2 (Invisible) gönderin:

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

İstek başarılı olursa, CapSkip CAPTCHA kimliğini düz metin olarak döndürür: OK|12345

Eğer json=1 parametresi kullanıldıysa, yanıt JSON formatında döndürülür:

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

İstek başarısız olursa, CapSkip bir hata kodu döndürür.

15 ila 20 saniye bekleyin, ardından çözümü almak için sonuç uç noktasına bir HTTP GET isteği gönderin: http://127.0.0.1:PORT/res.php

GET istek parametrelerinin listesi
GET parametresiTürGerekliAçıklama
keyDizeEvet CapSkip API key'iniz.
actionDizeEvet get: gönderilen CAPTCHA için yanıtı alır.
idTam sayıEvet Şunun döndürdüğü CAPTCHA ID'si in.php.
jsonTam sayı
Varsayılan: 0
Hayır 0: yanıt düz metin olarak döndürülür
1: yanıt JSON biçiminde döndürülür
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

CAPTCHA çözüldüyse, CapSkip düz metin veya JSON ile yanıt verir ve yanıt token'ını döndürür. Token aşağıdakine benzer görünür:

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

CAPTCHA henüz çözülmediyse, CapSkip şunu döndürür: CAPCHA_NOT_READY. Bu durumda 5 saniye bekleyin ve isteği tekrarlayın. CapSkip boş bir yanıt gövdesi döndürürse, sonuç zaten alınmıştır veya kimlik (ID) mevcut değildir. Her sonuç yalnızca bir kez okunabilir.

Şu ID'ye sahip öğeyi bulun: g-recaptcha-response ve şunu kaldırarak onu görünür yapın: display: none stil.

g recaptcha response CapSkip

Lütfen unutmayın: Bazı durumlarda sayfa içeriği dinamik olarak oluşturulur ve g-recaptcha-response element may not appear in the static HTML source. In such situations, inspect the page structure using your browser’s developer tools to locate the dynamically generated element.


Alternatif olarak, şunun değerini ayarlamak için JavaScript kullanabilirsiniz: g-recaptcha-response alanını doğrudan:

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

Sayfada bir giriş alanı belirir. Yanıt token'ını o alana yapıştırın ve formu gönderin.

recaptcha v2 solver  reCAPTCHA V2 Callback

Bazı durumlarda gönder düğmesi yoktur ve bunun yerine bir callback fonksiyonu kullanılır. Callback fonksiyonu, reCAPTCHA çözüldüğünde otomatik olarak çalıştırılır.

POST ve GET istek parametrelerinin listesi burada mevcuttur: reCAPTCHA V2 POST ve GET istek parametreleri

Callback fonksiyonu genellikle şurada tanımlanır: data-callback reCAPTCHA widget'ının özniteliği, örneğin:

data-callback="myCallbackFunction"

Diğer durumlarda callback fonksiyonu şu şekilde tanımlanır callback şunun parametresi: grecaptcha.render() fonksiyonu, örneğin:

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

Callback fonksiyonunu bulmanın başka bir yolu, tarayıcının JavaScript konsolunu açmak ve reCAPTCHA yapılandırma nesnesini incelemektir:

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

Şuna dikkat edin: aa.l özelliği değişebilir ve sayfada birden fazla reCAPTCHA istemcisi olabilir. Bu gibi durumlarda ayrıca şunu incelemelisiniz: clients[1], clients[2], ve doğru yapılandırma nesnesini bulmak için diğer girdiler.

Alternatif olarak, reCAPTCHA parametrelerini otomatik olarak çıkarmak için aşağıdaki betiği kullanabilirsiniz:

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 [];
}

Son olarak, callback fonksiyonunu çağırın:

myCallbackFunction();

Ya da alternatif olarak:

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

Bazı durumlarda callback fonksiyonu bir argüman gerektirir. Çoğu durumda, çözülen token'ı bu argüman olarak iletmelisiniz. Örneğin:

myCallbackFunction('TOKEN');

recaptcha v2 solver  reCAPTCHA V2 Invisible

reCAPTCHA v2'nin ayrıca bir Invisible modu vardır. Buradan bir örnek görebilirsiniz:

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

Invisible reCAPTCHA, "I'm not a robot" onay kutusunu göstermez. Bunun yerine, tipik olarak bir düğmeye bağlanır ya da sayfa yüklendiğinde veya bir düğmeye tıklamak ya da bir form göndermek gibi bir kullanıcı etkileşiminde otomatik olarak tetiklenir.

Dahili olarak, Invisible reCAPTCHA widget'ı gizli bir öğenin içinde render edilir: <div> görünür görüntü alanının (viewport) dışına konumlandırılmış, onu kullanıcı için görünmez kılan öğe.

Kullanıcının çerezlerine ve risk skoruna bağlı olarak, reCAPTCHA bir challenge göstermeden otomatik olarak geçebilir. Aksi halde standart bir görsel challenge belirir.

Çoğu durumda, sorgu tamamlandığında bir callback fonksiyonu çalıştırılır. Daha fazla ayrıntı için yukarıdaki callback bölümüne bakın.

POST ve GET istek parametrelerinin listesi burada mevcuttur: reCAPTCHA V2 POST ve GET istek parametreleri

reCAPTCHA'nın Görünmez Olup Olmadığı Nasıl Belirlenir?

Invisible reCAPTCHA'yı aşağıdaki göstergelerden birini kullanarak tanımlayabilirsiniz:

  • “I’m not a robot” onay kutusu görünmez, ancak kullanıcı etkileşiminden sonra bir challenge görünür.

  • reCAPTCHA iframe URL'si şu parametreyi içerir: size=invisible.

  • reCAPTCHA yapılandırma nesnesi bir size özelliği şuna ayarlı invisible, örneğin:
    ___grecaptcha_cfg.clients[0].aa.l.size === "invisible"

Invisible reCAPTCHA'yı API aracılığıyla çözerken, parametreyi ekleyin: invisible=1

Tarayıcıda Invisible reCAPTCHA Nasıl Ele Alınır?
Yöntem 1: JavaScript Kullanma

Şunun değerini ayarlayın: g-recaptcha-response alanını CapSkip tarafından döndürülen token'a:

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

Token'ı ayarladıktan sonra, normalde başarılı doğrulamadan sonra gerçekleşen eylemi yürütün.

Çoğu durumda bu, bir form göndermek anlamına gelir. Doğru formu şuna göre belirlemeniz gerekir id, name, veya başka bir öznitelik, ardından gönderimi tetikleyin. İşte birkaç örnek:

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"

Bazı durumlarda, reCAPTCHA çözüldüğünde bir callback fonksiyonu otomatik olarak yürütülür.

Callback fonksiyonu genellikle şurada tanımlanır: data-callback reCAPTCHA widget'ının özniteliği, örneğin:

data-callback="myCallbackFunction"

Diğer durumlarda callback fonksiyonu şu şekilde tanımlanır callback şunun parametresi: grecaptcha.render() fonksiyonu, örneğin:

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

Tek yapmanız gereken o fonksiyonu çağırmaktır:

myCallbackFunction();
Yöntem 2: HTML'yi Değiştirmek

Şunu kaldırın: <div> sayfa gövdesinden reCAPTCHA widget'ını içeren öğe.

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

Tüm reCAPTCHA bloğunu sayfadan kaldırın.

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

Kaldırılan bloğun yerine aşağıdaki kodu ekleyin:

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

%g-recaptcha-response% CapSkip'ten alınan yanıt token'ını temsil eder.

Bloğu değiştirdikten sonra bir “Submit query” düğmesi belirir. Formu şununla birlikte göndermek için düğmeye tıklayın: g-recaptcha-response değerini ve gerekli diğer tüm form verilerini web sitesine.

recaptcha v2 solver  reCAPTCHA V3

reCAPTCHA v3, Google tarafından geliştirilen modern bir CAPTCHA mekanizmasıdır. Görünür bir doğrulama sunmaz ve kullanıcı etkileşimi gerektirmez. Bunun yerine, etkileşimin insan olma olasılığına göre bir puan atar.

Teknik olarak reCAPTCHA v3, reCAPTCHA v2'ye benzer. Web sitesi, reCAPTCHA API'sinden bir token alır; bu token daha sonra bir POST isteğiyle hedef sunucuya gönderilir ve reCAPTCHA API'si aracılığıyla doğrulanır.

Temel fark, reCAPTCHA v3'ün görünür bir challenge göstermemesidir. Bunun yerine, kullanıcının insan mı yoksa bot mu olduğunu tahmin eden bir derece döndürür. Bu dereceye şu ad verilir: score ve 0,0 ile 1,0 arasında değişir. Skor web sitesine gönderilir ve site daha sonra bu değere göre isteği nasıl ele alacağına karar verir.

Ayrıca şu adında ek bir parametre de vardır action, bu da web sitesinin farklı kullanıcı etkileşimlerini birbirinden ayırt etmesini sağlar. Token'ı doğruladıktan sonra reCAPTCHA API'si, istekle ilişkili action adını döndürür.

CapSkip Kullanarak reCAPTCHA v3 Nasıl Çözülür?

Öncelikle, hedef web sitesinin reCAPTCHA v3 kullandığını doğrulayın.

reCAPTCHA v3 göstergeleri şunları içerir:

  • Görünür CAPTCHA veya görsel doğrulama yok

  • The api.js betik şununla yüklenir: render=SITEKEY parametre, örneğin:
    https://www.google.com/recaptcha/api.js?render=SITEKEY

  • The ___grecaptcha_cfg.clients dizisi, yüksek sayısal indeksli bir girdi içerir, örneğin clients[100000]

reCAPTCHA v3'ü çözmek için, aşağıdaki parametreleri belirleyin:

  1. sitekey
    Bu şurada bulunabilir: render şunun parametresi: api.js script URL'si. Ayrıca bir iframe URL'sinde, şunu çağıran JavaScript kodunun içinde de görünebilir grecaptcha.execute(), ya da şunun içinde: ___grecaptcha_cfg yapılandırma nesnesi.
  2. action
    Bunu, JavaScript kodunu şuna yapılan çağrılar için inceleyerek bulun: grecaptcha.execute(), örneğin:
    grecaptcha.execute('SITEKEY', {action: 'do_something'})
    Bazı durumlarda action'ı bulmak, sayfanın yüklediği birden fazla JavaScript dosyasını incelemeyi gerektirir. action değerini belirleyemezseniz, varsayılan değeri kullanabilirsiniz "verify".
  3. pageurl
    reCAPTCHA v3'ün uygulandığı sayfanın tam URL'si.
Puanı Anlamak

Kabul edilebilir skor eşiği web sitesine göre değişir ve yalnızca test yoluyla belirlenebilir. Skorlar şu aralıktadır:

  • 0,0 → muhtemelen bot

  • 1.0 → muhtemelen insan

Çoğu web sitesi 0,3 ile 0,7 arasında eşikler kullanır, çünkü meşru kullanıcılar bile daha düşük skorlar alabilir.

İstediğiniz eşiği şunu kullanarak geçirebilirsiniz: min_score parametresi, ancak nihai puana her zaman doğrulama sırasında Google karar verir ve çözücü tarafından garanti edilemez.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet CapSkip API key'iniz.
methodDizeEvet userrecaptcha: bir reCAPTCHA isteği belirtir.
versionDizeEvet v3: isteğin reCAPTCHA v3 için olduğunu belirtir.
googlekeyDizeEvet Şunun değeri: data-sitekey hedef sayfada bulunan parametre.
pageurlDizeEvet reCAPTCHA'nın bulunduğu sayfanın tam URL'si.
enterpriseTam sayı
Varsayılan: 0
Hayır 1: reCAPTCHA Enterprise v3'ü belirtir.
0: standart reCAPTCHA v3.
actionDize
Varsayılan: verify
Hayır Şunun değeri: action sayfada tanımlanan parametre.
min_scoreFloatHayır Token için istenen minimum skor. Google, nihai skoru sunucunuz token'ı doğruladığında atar, bu nedenle bu değer bir ipucudur ve garanti edilmez. CapSkip, Google'ın daha sonra atayacağı skordan bağımsız olarak elde ettiği token'ı döndürür.
jsonTam sayı
Varsayılan: 0
Hayır 0: yanıt düz metin olarak döndürülür.
1: yanıt JSON formatında döndürülür.
proxyDizeHayırProxy adresi. IP kimlik doğrulaması için biçim: IP:PORT (örnek: 123.123.123.123:3128). Kullanıcı adı/parola kimlik doğrulaması için biçim: login:password@IP:PORT
proxytypeDizeHayırProxy türü. Desteklenen değerler: HTTP, HTTPS, SOCKS5, SOCKS5H. Varsayılan: HTTP ne zaman proxy sağlanır ancak proxytype atlanır.

reCAPTCHA v3'ü gönderin:

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

Enterprise reCAPTCHA v3'ü gönderin:

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

İstek başarılı olursa, CapSkip CAPTCHA kimliğini düz metin olarak döndürür: OK|12345

Eğer json=1 parametresi belirtilirse, yanıt JSON formatında döndürülür:

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

Bir hata oluşursa, CapSkip bir hata kodu döndürür.

10 ila 15 saniye bekleyin, ardından sonuç uç noktasına bir HTTP GET isteği gönderin: http://127.0.0.1:PORT/res.php

Döndürülen CAPTCHA ID'sini isteğinizde sağlayın. Kullanılabilir parametrelerin tam listesi aşağıdaki tabloda gösterilmiştir.

CAPTCHA başarıyla çözüldüyse, CapSkip sonucu düz metin veya JSON biçiminde döndürür. Dönen değer, aşağıdakine benzer bir doğrulama token'ıdır:

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

CAPTCHA henüz çözülmediyse, CapSkip şunu döndürür: CAPCHA_NOT_READY. 5 saniye bekleyin ve isteği tekrarlayın. CapSkip boş bir yanıt gövdesi döndürürse, sonuç zaten alınmıştır veya ID mevcut değildir. Her sonuç yalnızca bir kez okunabilir.

GET istek parametrelerinin listesi
GET parametresiTürGerekliAçıklama
keyDizeEvet CapSkip API key'iniz.
actionDizeEvet get: gönderilen CAPTCHA için yanıtı alır.
idTam sayıEvet Şunun döndürdüğü CAPTCHA ID'si in.php.
jsonTam sayı
Varsayılan: 0
Hayır 0: yanıt düz metin olarak döndürülür
1: yanıt JSON biçiminde döndürülür
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=CAPTCHA_ID"

CapSkip'ten token'ı aldıktan sonra onu hedef web sitesine doğru şekilde göndermelisiniz. Bunun nasıl çalıştığını anlamanın en iyi yolu, doğrulamayı normal bir kullanıcı olarak tamamlarken gönderilen istekleri gözlemlemektir. Çoğu tarayıcı geliştirici araçları sağlar; bu araçlarda bir Network giden istekleri incelemenizi sağlayan sekme.

Çoğu durumda token, bir POST isteğiyle gönderilir. Parametre adı şu olabilir: g-recaptcha-response, reCAPTCHA v2'ye benzer ya da şuna benzer bir şey: g-recaptcha-response-100000. Bazı uygulamalarda farklı bir parametre adı kullanılabilir.

Token'ın nasıl iletildiğini belirlemek için ağ isteklerini incelemeli ve ardından isteğinizi buna göre yapılandırmalısınız.

recaptcha v2 solver  reCAPTCHA Enterprise

reCAPTCHA Enterprise, Google'ın reCAPTCHA sisteminin gelişmiş sürümüdür. Hem v2 hem de v3 modlarında çalışabilir ve bir etkileşimin insan mı yoksa otomatik mi olduğunu değerlendirme ve raporlama yeteneği dahil olmak üzere web sitesi yöneticilerine ek kontrol sağlar.

reCAPTCHA Enterprise Nasıl Çözülür?

İlk adım, web sitesinin reCAPTCHA'nın Enterprise sürümünü kullanıp kullanmadığını belirlemektir.

reCAPTCHA Enterprise'ın temel göstergeleri şunlardır:

  • Sayfa yüklenir enterprise.js yerine api.js, örneğin:

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

  • Web sitesinin JavaScript kodu şunu çağırır: grecaptcha.enterprise.METHOD yerine grecaptcha.METHOD

Ardından, hangi uygulamanın kullanıldığını belirleyin: v2, Invisible v2 veya v3. Bu genellikle widget'ın nasıl render edildiğini ve sayfada nasıl davrandığını analiz ederek tespit edilebilir.

Doğru uygulamayı belirlemek için aşağıdaki akış şemasını izleyin. Vakaların büyük çoğunluğunda geçerlidir.

recaptcha enterprise

CAPTCHA parametrelerini reCAPTCHA v2 veya v3 için açıklanan şekilde tanımlayın.

v2 Enterprise uygulamaları için ek isteğe bağlı veri olabilir. Çoğu durumda bu, şurada tanımlanan özel bir dizedir: s veya data-s parametresi. Mevcutsa, bu değeri şunu kullanarak isteğinize dâhil edin: data-s parametre.

POST ve GET istek parametrelerinin listesi burada mevcuttur: reCAPTCHA V2 POST ve GET istek parametreleri

v3 Enterprise uygulamaları için şuna da ihtiyacınız olabilir: action değeri. Bulmak için, web sitesinin JavaScript kodunu inceleyin ve şunu bulun: grecaptcha.enterprise.execute() çağrısı. action parametresi genellikle bu fonksiyonun içinde iletilir. Şunu unutmayın action isteğe bağlıdır ve bazı durumlarda tanımsız (undefined) olabilir.

POST ve GET istek parametrelerinin listesi burada mevcuttur: reCAPTCHA V3 POST ve GET istek parametreleri

İsteğinizi şuraya gönderirken: /in.php uç noktası, ek parametreyi ekleyin: enterprise=1

Bundan sonra, reCAPTCHA v2 veya v3 çözerkenki gibi CapSkip API ile etkileşime girin. Token döndürüldükten sonra, hedef web sitesine kendi uygulamasına göre gönderin.

Cloudflare turnstile solving Cloudflare Turnstile

Cloudflare Turnstile, Cloudflare tarafından geliştirilen modern bir CAPTCHA alternatifidir. Bir ziyaretçinin insan olup olmadığını geleneksel görsel challenge'lara dayanmadan doğrular. Turnstile bağımsız bir widget olarak veya bir challenge sayfasının parçası olarak görünebilir ve minimum kullanıcı etkileşimiyle ya da hiç etkileşim olmadan çalışır.

İki yaygın Turnstile uygulaması vardır:

1. Bağımsız Turnstile Widget'ı

Bağımsız bir Turnstile widget'ı doğrudan bir web sitesi sayfasına gömülüdür ve genellikle bir formu otomatik gönderimlerden korur. Bu durumda:

  • Şunu çıkarın: sitekey from the page.

  • Onu tam şeyle birlikte CapSkip API'sine gönderin: pageurl.

  • Token'ı aldıktan sonra, onu şuraya ekleyin: cf-turnstile-response alanı.

  • Bazı uygulamalarda token'ın ayrıca şuraya yerleştirilmesi gerekebilir g-recaptcha-response alanı.

  • Şurada bir callback tanımlıysa: turnstile.render() yapılandırması, onu döndürülen token'la çalıştırın.

Ardından formu her zamanki gibi gönderin.

2. Cloudflare Challenge Sayfasında Turnstile

Bu, web sitesi Cloudflare üzerinden proxy'lendiğinde ve erişim vermeden önce bir Turnstile challenge sayfası sunduğunda meydana gelir. Bu durumda aşağıdaki parametreleri çıkarmanız gerekir:

  • cData

  • chlPageData

  • action

Bu değerler API isteğinize dâhil edilmelidir. Ayrıca şunu kullanmalısınız: User-Agent token gönderilirken CapSkip API'si tarafından döndürülen değer.

Gerekli Parametreler Nasıl Çıkarılır?

Gerekli parametreleri çıkarmak için şunu geçersiz kılabilirsiniz: turnstile.render metodunu kullanın ve çağrıldığında iletilen argümanları yakalayın. Örneğin, aşağıdaki JavaScript kodunu sayfaya enjekte edin. Parametreleri başarıyla yakalamak için scriptin, Turnstile widget'ı yüklenmeden önce çalıştırılması gerekir.

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)
POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet CapSkip API key'iniz.
methodDizeEvet turnstile: bir Cloudflare Turnstile isteği belirtir.
sitekeyDizeEvet Şunun değeri: data-sitekey hedef sayfada bulunan parametre.
pageurlDizeEvet Turnstile doğrulamasının bulunduğu sayfanın tam URL'si.
actionDizeHayır Şurada tanımlanan isteğe bağlı action değeri: data-action öznitelik veya şuna iletilir: turnstile.render().
dataDizeHayır Şunun değeri: cData şuraya aktarılan: turnstile.render() veya şurada tanımlanmış: data-cdata öznitelik.
pagedataDizeHayır Şunun değeri: chlPageData şuraya aktarılan: turnstile.render().
jsonTam sayı
Varsayılan: 0
Hayır 0: yanıt düz metin olarak döndürülür.
1: yanıt JSON formatında döndürülür.
proxyDizeHayırProxy adresi. IP kimlik doğrulaması için biçim: IP:PORT (örnek: 123.123.123.123:3128). Kullanıcı adı/parola kimlik doğrulaması için biçim: login:password@IP:PORT
proxytypeDizeHayırProxy türü. Desteklenen değerler: HTTP, HTTPS, SOCKS5, SOCKS5H. Varsayılan: HTTP ne zaman proxy sağlanır ancak proxytype atlanır.

Turnstile gönder (bağımsız):

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

Turnstile Gönder (challenge; isteğe bağlı action, data, pagedata):

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

İstek başarılı olursa, CapSkip CAPTCHA kimliğini düz metin olarak döndürür: OK|12345

Eğer json=1 parametresi belirtilirse, yanıt JSON formatında döndürülür:

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

Bir hata oluşursa, CapSkip bir hata kodu döndürür.

Sonucu şuradan almak için döndürülen ID'yi kullanın: /res.php API'nin uç noktası.

GET istek parametrelerinin listesi
GET parametresiTürGerekliAçıklama
keyDizeEvet CapSkip API key'iniz.
actionDizeEvet get: gönderilen CAPTCHA için yanıtı alır.
idTam sayıEvet Şunun döndürdüğü CAPTCHA ID'si in.php.
jsonTam sayı
Varsayılan: 0
Hayır 0 - yanıt düz metin olarak döndürülür.
1 - yanıt, şunu da içerecek şekilde JSON formatında döndürülür: userAgent değer.

Cloudflare Turnstile için çözücü belirli bir tarayıcı User-Agent'ı kullanır ve token'ı gönderirken aynı User-Agent'ı göndermeniz gerekir. Şununla: json=1 yanıt şunu içerir: userAgent alan. Düz metin modunda, aynı değeri şuradan okuyun: X-Turnstile-User-Agent yanıt header'ı.

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

geetest v3 GeeTest v3

GeeTest v3 Slider, GeeTest tarafından geliştirilen etkileşimli bir CAPTCHA'dır. Hızlı ve sorunsuz bir doğrulama deneyimi sunarken, insanları botlardan ayırmak için kullanıcıları bir kaydırma (slider) doğrulaması aracılığıyla doğrular.

CapSkip ile bir GeeTest v3 CAPTCHA'sını çözmek için, önce hedef web sitesinden gerekli CAPTCHA parametrelerini almanız gerekir. Gerekli parametreler şunlardır:

  • gt: Genel web sitesi anahtarı (statik)
  • challenge: Dinamik challenge değeri
  • api_server: GeeTest API sunucu alan adı (isteğe bağlı)

Bu değerler genellikle web sitesi GeeTest'i başlattığında kullanılabilir.

Önemli: Yeni bir challenge değeri her çözme isteği için elde edilmelidir. CAPTCHA sayfaya yüklendikten sonra, önceki challenge geçersiz hale gelir. Yenisini oluşturan isteği belirlemek için web sitesinin ağ isteklerini incelemelisiniz challenge değeri ve her çözüm isteğini CapSkip'e göndermeden önce o isteği gerçekleştirin.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
methodDizeEvetOlmalı geetest. Bir GeeTest v3 CAPTCHA'sı gönderdiğinizi belirtir.
gtDizeEvetThe gt hedef web sitesinden elde edilen değer.
challengeDizeEvetThe challenge hedef web sitesinden elde edilen değer. Her çözüm isteği için yeni bir değer elde edilmelidir.
pageurlDizeEvetGeeTest CAPTCHA'sını içeren sayfanın tam URL'si.
api_serverDizeHayırHedef web sitesi tarafından kullanılan GeeTest API sunucu alan adı (örneğin api.geetest.com veya api-na.geetest.com).
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.
proxyDizeHayırProxy adresi. IP kimlik doğrulaması için biçim: IP:PORT (örnek: 123.123.123.123:3128). Kullanıcı adı/parola kimlik doğrulaması için biçim: login:password@IP:PORT.
proxytypeDizeHayırProxy türü. Desteklenen değerler: HTTP, HTTPS, SOCKS5, SOCKS5H. Varsayılan: HTTP ne zaman proxy sağlanır ancak proxytype atlanır.

CapSkip API uç noktanıza bir HTTP GET veya POST isteği gönderin (/in.php) ile method=geetest. Önceki adımda elde edilen gerekli GeeTest parametrelerini, CAPTCHA'yı içeren sayfanın tam URL'siyle birlikte ekleyin.

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

Her şey başarılı olursa, CapSkip CAPTCHA ID'sini düz metin olarak döndürür: OK|212

Eğer json=1 parametresi belirtilirse, yanıt JSON formatında döndürülür:

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

Aksi takdirde, CapSkip uygun bir hata kodu döndürür.

Yaklaşık şu kadar bekleyin: 5 saniye, ardından şuraya bir HTTP GET isteği gönderin: res.php sonucu almak için uç nokta.

GET istek parametrelerinin listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
actionDizeEvetBelirtin get CAPTCHA çözümünü almak için.
idTam sayıEvetŞunun tarafından döndürülen CAPTCHA ID'si: in.php istek.
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=212&json=1"

CAPTCHA başarıyla çözüldüyse, CapSkip çözümü JSON formatında döndürür:

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

CAPTCHA henüz çözülmediyse, CapSkip şunu döndürür: CAPCHA_NOT_READY

5 saniye bekleyin ve isteği tekrarlayın. Bir hata oluşursa, CapSkip uygun bir hata kodu döndürür. İsteğinizi hedef web sitesine gönderirken aşağıdaki alanları kullanarak CapSkip tarafından döndürülen değerleri kullanın:

  • geetest_challenge
  • geetest_validate
  • geetest_seccode

altcha solver ALTCHA

ALTCHA, bir proof of work (iş kanıtı) CAPTCHA türüdür. Okunacak bir görsel ya da dinlenecek bir ses yoktur. Hedef site bir challenge yayımlar ve istemcinin bu challenge'ı karşılayan sayıyı kaba kuvvetle bulması gerekir. CapSkip bu sayıyı hesaplar ve widget'ın üreteceği veri yükünü (payload) döndürür.

Nasıl Çalışır

Buradaki savunma tanımaya değil, CPU maliyetine dayanır. Sunucu bir hedef ve bir arama aralığı (maxnumber) belirtir; istemci de aday sayıların hash'ini, içlerinden biri eşleşene kadar hesaplar. Bundan, bir CAPTCHA türü için sıra dışı iki sonuç doğar.

Birincisi, çözüm deterministiktir. Ortada bir model ya da doğruluk oranı yoktur; çünkü ya cevap belirtilen aralığın içindedir ya da challenge hatalı biçimlendirilmiştir. Hiçbir şey yanlış okunmaz.

İkincisi, çözüm süresini CapSkip değil hedef site belirler. Referans widget varsayılan olarak 1.000.000'luk bir aralık kullanır; bu da birkaç milisaniyelik iş demektir. Siteler bu değeri istedikleri kadar yükseltebilir ve bazıları 999.999.999 ile gelir; bu da ortalama bir challenge için kabaca 500 milyon hash anlamına gelir. Bir sitede çözüm yavaşsa önce o sitenin maxnumber değerine bakın.

Döngünün tamamı dört adımdan oluşur:

  1. Challenge'ı, widget'ın okuduğu uç noktadan alın.
  2. Bunu şu şekilde gönderin: /in.php ile method=altcha.
  3. Token hazır olana kadar /res.php uç noktasını yoklayın.
  4. Token'ı, hedef formun şu alanında geri gönderin: altcha alanı.
Çözümden Önce Gerekenler

Challenge, iki biçimden biriyle. İkisi de kabul edilir; bu yüzden kazıyıcınızda hangisi zaten varsa onu gönderin.

ParametreNe zaman kullanılır
challenge_jsonChallenge belgesi zaten elinizdedir. CapSkip bunu yerel olarak çözer ve hiçbir ağ isteği yapmaz; bu da en hızlı yoldur.
challenge_urlElinizde yalnızca challenge'ı sunan uç nokta vardır. CapSkip bunu, gönderdiyseniz proxy'niz üzerinden alır ve ardından çözer.
Challenge Nerede Bulunur

Tarayıcının geliştirici araçlarını açın, hedef sayfada Network (Ağ) sekmesine geçin ve <altcha-widget> öğesinin challenge için yaptığı isteği arayın. Bu istek çoğu zaman şuna benzer bir yoldadır: /altcha/challenge. Bu istek URL'si sizin için challenge_url, yanıt olarak gelen JSON ise challenge_json.

Bu uç noktanın adını veren widget özniteliği sürümler arasında değişti; bu yüzden varsayımda bulunmak yerine sayfa kaynağını okuyun. Widget v1 ve v2 şunu kullanır: challengeurl="...", v3 ve sonrası ise hem URL hem de satır içi veri için challenge="..." özniteliğini kullanır. Bazı kurulumlar challenge'ı doğrudan sayfanın içinde üretir ve hiçbir istek göndermez.

Bir challenge belgesi şöyle görünür:

{
"algorithm": "SHA-256",
"challenge": "3dd28253be6cc0c54d95f7f98c517e68a1b2c3d4e5f60718293a4b5c6d7e8f90",
"salt": "46d5b1c8871e5152d902ee3f?expires=1893456000",
"signature": "4b1cf0e0be0f4e5247e50b0f9a4498301234567890abcdef1234567890abcdef",
"maxnumber": 1000000
}
Challenge'ların Geçerlilik Süresi Dolar ve Bu Süre Kısadır

Her challenge kendi son kullanma bilgisini taşır; bu bilgi ya salt sorgu dizesinde yer alır ya da şu alanda bulunur: parameters.expiresAt. Süre dolduğunda hedef site çözümü, tıpkı yanlış bir cevap gibi görünen sade bir doğrulama hatasıyla reddeder. İki dakika kadar kısa süreler yaygındır.

Challenge'ı görevi oluşturmadan hemen önce alın ve token'ı gecikmeden gönderin. Challenge'ları önceden toplamayın, bir kullanıcı formu doldururken token'ı elinizde bekletmeyin. Eğer challenge_url yerine challenge_json'yi gönderirseniz, bir challenge hâlâ kuyruktayken süresi dolduğunda CapSkip onu otomatik olarak yeniden alır.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
methodDizeEvetOlmalı altcha. Bir ALTCHA challenge'ı gönderdiğinizi belirtir.
pageurlDizeEvetChallenge'ın alındığı sayfanın tam URL'si.
challenge_urlDizeEvet*CapSkip'in challenge'ı alacağı uç nokta. challenge_json gönderilmediği sürece zorunludur.
challenge_jsonDizeEvet*Challenge belgesinin kendisi, JSON dizesi olarak. challenge_url gönderilmediği sürece zorunludur.
proxyDizeHayırProxy adresi. Şu biçimleri kabul eder: IP:PORT, LOGIN:PASSWORD@IP:PORT veya IP:PORT:LOGIN:PASSWORD. Yalnızca challenge_url isteği için kullanılır.
proxytypeDizeHayırProxy türü: HTTP, HTTPS, SOCKS5 veya SOCKS5H.
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.

Şunlardan birini gönderin: challenge_url veya challenge_json. İkisini birden göndermek de serbesttir; bu durumda satır içi belge kazanır, çünkü indirme yalnızca zaten elinizde olanı yeniden getirir.

CapSkip API uç noktanıza bir HTTP GET veya POST isteği gönderin (/in.php) ile method=altcha. Form alanları ve JSON gövdesi aynı alan adlarıyla kabul edilir; GET yöntemi de çalışır, çünkü ALTCHA'da yüklenecek bir görsel yoktur.

ALTCHA gönderimi (form alanları):

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

ALTCHA gönderimi (JSON gövdesi):

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 gövdesi, form kodlamasının yapamadığı üç şeye izin verir. Bayraklar gerçek boole değerleri olabilir ("json": true), challenge_json alanı, kaçış karakterli bir dize yerine iç içe belgenin kendisi olabilir ve null olarak ayarlanan bir alan gönderilmemiş sayılır.

Her şey doğruysa CapSkip, CAPTCHA ID'sini düz metin olarak döndürür: OK|2122988149. Eğer json=1 parametresi gönderildiyse yanıt bunun yerine bir JSON zarfı olur. Her iki durumda da dönen değer, sonucu sorgulayacağınız CAPTCHA ID'sidir.

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

Aksi hâlde CapSkip uygun bir hata kodu döndürür. Hatalı biçimlendirilmiş satır içi bir challenge, sorgulamadan sonra değil doğrudan gönderim isteğinde reddedilir; böylece hatayı, hatalı olan isteğin kendisinde görürsünüz.

Yaklaşık 5 saniye bekleyin, ardından sonuç uç noktasına (/res.php) aldığınız CAPTCHA ID'si ile bir HTTP GET isteği gönderin.

GET istek parametrelerinin listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
actionDizeEvetBelirtin get CAPTCHA çözümünü almak için.
idTam sayıEvetŞunun tarafından döndürülen CAPTCHA ID'si: in.php istek.
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

CAPTCHA çözülmüşse CapSkip çözümü JSON biçiminde döndürür:

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

request ve solution.token her zaman aynı dizedir; bu yüzden istemcinizin beklediği hangisiyse onu okuyun. number alanı, challenge'ı çözen sayaçtır ve bütünlük olsun diye döndürülür. json=1, yani bu parametre olmadan yanıt yalnızca şu olur: OK|<token>.

CAPTCHA henüz çözülmemişse CapSkip şunu döndürür: CAPCHA_NOT_READY, diğer tüm yöntemlerde olduğu gibi tam olarak bu yazımla. 5 saniye bekleyip isteği tekrarlayın.

Sorgulama döngünüzü errorId'ye göre kurun, şuna göre değil: status. status alanı, tam sayı olan 1 değerini taşır; bunu res.php sözleşmesinin her zaman döndürdüğü değer budur ve uyumlu her SDK’nın okuduğu da budur. İstemcinizi şunu gösteren bir dokümantasyon sayfasına göre yazdıysanız: "status": "ready", bunun yerine errorId === 0 koşulunu ya da şu alanın varlığını kontrol edin: solution.token aldığınızı anlatıyor.

Token'ı Gönderme

ALTCHA widget'ı, veri yükünü şu adı taşıyan bir form alanına koyar: altcha. Token'ı, tıpkı widget'ın yapacağı gibi, birebir bu alanda gönderin:

POST https://www.example.com/signup
Content-Type: application/x-www-form-urlencodedemail=someone%40example.com&altcha=eyJhbGdvcml0aG0iOiJTSEEtMjU2Iiwi...

Yükün iç yapısı, onu üreten challenge'a göre belirlenir. Eski (legacy) bir challenge, şunu içeren düz bir belge üretir: number, PoW v2 challenge'ı ise özgün challenge'ı challenge alanının, cevabı da solution'ın altına yerleştiren bir belge üretir. Token'ı opak kabul edin ve hiçbir değişiklik yapmadan olduğu gibi iletin, çünkü hedef site hangi yapıyı bekleyeceğini zaten bilir.

Bazı entegrasyonlar yükü bunun yerine bir JSON gövde alanından okur; bu yüzden sayfanın kendi gönderiminin ne yolladığını kontrol edip aynısını yapın. Token'ı yeniden kodlamayın, kırpmayın, alanlarının sırasını değiştirmeyin. Token, alanları sunucunun HMAC imzasıyla korunan bir JSON belgesinin base64 karşılığıdır; bu yüzden yapılacak her değişiklik onu geçersiz kılar.

Desteklenen Algoritmalar

Bir sitenin hangi şemayı kullandığını sizin çözmeniz gerekmez. CapSkip challenge'ı okur ve algoritmayı kendisi seçer.

ŞemaNesilDestekleniyorAçıklama
Legacy PoWv1EvetŞu koşulu sağlayan n sayısını bulun: SHA(salt + n) değeri challenge ile eşleşmelidir. SHA-1, SHA-256, SHA-384 ve SHA-512'nin tamamı desteklenir. Çoğu kurulumun hâlâ kullandığı biçim budur.
PBKDF2PoW v2EvetTüretilen anahtarı hedef ön ekle başlayan bir sayaç bulun. SHA-256, SHA-384 ve SHA-512 desteklenir. ALTCHA'nın kendi önerdiği varsayılan yöntem budur.
SHAPoW v2EvetAynı şemanın yinelemeli hash türevi.
Argon2idPoW v2HayırBellek yoğun (memory hard) bir anahtar türetme fonksiyonu. Denenmek yerine reddedilir.
scryptPoW v2HayırBellek yoğun (memory hard) bir anahtar türetme fonksiyonu. Denenmek yerine reddedilir.

Her iki hesaplama modu da çalışır ve sizden hiçbir şey gerektirmez. Sunucu, deterministik modda hedefi önceden hesaplar, böylece çözüm süresi öngörülebilir olur; olasılıksal modda ise çözüm süresi bir challenge'dan diğerine değişir. Üç widget türünün tamamı (native, checkbox ve switch) desteklenir, çünkü tür yalnızca kontrolün görsel stilidir ve hiçbir zaman API'ye ulaşmaz.

Argon2id ve scrypt denenmek yerine reddedilir. Bunlardan birini kullanan bir görev, saniyenin yaklaşık üçte biri içinde ERROR_CAPTCHA_UNSOLVABLE hatasını döndürür ve asla yeniden denenmez; böylece hiçbir zaman sessizce yanlış çözülmez. ALTCHA varsayılan olarak PBKDF2'yi önerdiği için bu durum sitelerin yalnızca küçük bir azınlığını etkiler.

captchafox solver CaptchaFox

CaptchaFox, ziyaretçiden herhangi bir şey okumasını istemek yerine doğrudan tarayıcının kendisini puanlayan, gizlilik odaklı bir CAPTCHA'dır. Ziyaretçilerin çoğu hiçbir zaman bir bulmaca görmez. CapSkip, gerçek widget'ı gerçek bir tarayıcıda çalıştırarak bunu çözer ve widget'ın üreteceği doğrulama token'ını döndürür.

Nasıl Çalışır

CaptchaFox kararını üç katmanda verir ve bunlardan yalnızca sonuncusu görünürdür. Widget kısa bir proof of work çalıştırır, geniş bir tarayıcı sinyali kümesi toplar ve ikisini birden kendi API'sine gönderir. Bu kanıt servisi tatmin ederse token anında verilir ve ekrana hiçbir bulmaca çizilmez. Etkileşimli bir challenge yalnızca kanıt yeterli gelmediğinde ortaya çıkar.

Bu yapının, entegrasyona geçmeden önce bilmeye değer pratik bir sonucu vardır. Token, sizin verdiğiniz parametreler üzerinde yapılan bir hesaplamayla değil, gerçek bir tarayıcı oturumu tarafından üretilir; bu yüzden CapSkip widget'ı sizin sayfa URL'nize karşı yükler ve çalışmasına izin verir. CapSkip’e site anahtarını ve sayfayı verirsiniz, CapSkip de token'ı döndürür.

Döngünün tamamı dört adımdan oluşur:

  1. Site anahtarını hedef sayfadan okuyun.
  2. Bunu şu şekilde gönderin: /in.php ile method=captchafox.
  3. Token hazır olana kadar /res.php uç noktasını yoklayın.
  4. Token'ı, hedef formun şu alanında geri gönderin: cf-captcha-response alanı.
Çözümden Önce Gerekenler

İki değer ve ikisi de doğrudan hedef sayfadan okunur. Yakalanması gereken bir challenge belgesi yoktur ve görevi kuyruğa alırken süresi dolacak hiçbir şey bulunmaz.

ParametreNereden geldiği
sitekeyWidget'ın oluşturulduğu açık anahtar. Gizli değildir, her ziyaretçi için aynıdır ve alışılmış olarak şununla başlar: sk_.
pageurlWidget'ın göründüğü sayfanın tam URL'si. CaptchaFox bunu, anahtarın kayıtlı olduğu alan adlarıyla karşılaştırır; bu yüzden gerçek sayfa olmak zorundadır.
Site Anahtarı Nerede Bulunur

Hedef sayfada tarayıcının geliştirici araçlarını açın ve CaptchaFox kapsayıcısını arayın. Siteler widget'ı iki yoldan biriyle oluşturur ve anahtar her ikisinde de görünür.

<!-- 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>

Sayfa widget'ı çalışma zamanında oluşturduğu için ikisi de sunulan HTML'de yoksa Network sekmesini açın ve şuraya giden isteği bulun: api.captchafox.com. Anahtar, şunun ardından gelen yol segmentidir: /captcha/.

Sayfa URL'si Anahtarla Eşleşmelidir

CaptchaFox anahtarları, izin verilen alan adlarından oluşan bir listeye kaydedilir ve servis, herhangi bir şey vermeden önce isteğin geldiği alan adını denetler. Doğru olan ama bu listenin dışındaki bir sayfada kullanılan bir anahtar, ara sıra değil, kalıcı olarak reddedilir.

CapSkip bu durumu yeniden denemek yerine raporlar, çünkü yeniden denemenin faydası olmaz. Bir site anahtarı hemen ve sürekli olarak başarısız oluyorsa şunu kontrol edin: pageurl gerçekten widget'ın çalıştığı sayfa mı, yoksa bir arama sayfası, bir yönlendirme ya da başka bir yere çözümlenen kısaltılmış bir bağlantı mı.

Challenge Türleri

Hangi challenge'ın görüneceğini siz seçmezsiniz. Kararı CaptchaFox verir, CapSkip de kendisine ne verilirse onu işler.

ChallengeNe zaman görünürDestekleniyorAçıklama
InvisibleGenellikleEvetTarayıcı kanıtı servisi tatmin eder ve ekrana hiçbir şey çizilmeden bir token verilir. Bu, en yaygın ve en hızlı yoldur.
KaydırmaBazenEvetBir parçanın boşluğa sürüklenmesi gereken kaydırmalı bulmaca. CapSkip hedefi bulur ve sürüklemeyi tamamlar.
Görsel seçmeNadirenHayırİçinden seçim yapılacak bir görsel ızgarası. Çözülemez olarak raporlanır; böylece istemciniz zaman aşımını beklemek yerine yeniden deneyip taze bir challenge alabilir.
SesNadirenHayırErişilebilirlik için sunulan yedek seçenek. Aynı nedenle çözülemez olarak raporlanır.

Desteklenmeyen bu iki challenge yaygın değildir ve yeniden deneme genellikle farklı bir challenge getirir. Çözülemez sonucunu, anahtarın kalıcı olarak başarısız olduğunun değil, görevi yeniden göndermeniz gerektiğinin işareti olarak görün.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
methodDizeEvetOlmalı captchafox. Bir CaptchaFox CAPTCHA'sı gönderdiğinizi belirtir.
sitekeyDizeEvetHedef sayfadan okunan site anahtarı; alışılmış olarak şu ön eki taşır: sk_.
pageurlDizeEvetWidget'ın göründüğü sayfanın tam URL'si.
api_serverDizeHayırYüklenecek widget giriş noktası. Varsayılan değer: https://cdn.captchafox.com/. Aşağıdaki Widget Kaynağını Seçme bölümüne bakın.
useragentDizeHayırDiğer servislerle uyumluluk için kabul edilir ancak uygulanmaz. CapSkip çözümü gerçek bir tarayıcıda yapar ve o tarayıcının kendi tutarlı kimliğini kullanır.
proxyDizeHayırProxy adresi. Şu biçimleri kabul eder: IP:PORT, LOGIN:PASSWORD@IP:PORT veya IP:PORT:LOGIN:PASSWORD.
proxytypeDizeHayırProxy türü: HTTP, HTTPS, SOCKS5 veya SOCKS5H.
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.

Çoğu servisin aksine CapSkip bu yöntem için proxy zorunlu tutmaz. Yine de herhangi bir hacimde çözüm yapmaya başladığınız anda proxy isteyeceksiniz: CaptchaFox yalnızca tarayıcıyı değil, widget’ın çalıştığı ağı da puanlar; bu yüzden tek bir adresten yapılan tekrarlı çözümler o adresi önce etkileşimli challenge’lara, sonra da retlere doğru iter. Testler ve ara sıra yapılan çözümler için tek adres yeterlidir. Bunun ötesinde CapSkip’te bir proxy havuzu yapılandırın ve yükü ona dağıttırın veya token belirli bir ağdan gelmek zorundaysa istek başına proxy gönderin.

CapSkip API uç noktanıza bir HTTP GET veya POST isteği gönderin (/in.php) ile method=captchafox. Form alanları ve JSON gövdesi aynı alan adlarıyla kabul edilir; GET yöntemi de çalışır, çünkü CaptchaFox’ta yüklenecek bir görsel yoktur.

CaptchaFox gönderimi (form alanları):

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

CaptchaFox gönderimi (JSON gövdesi):

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

Her şey doğruysa CapSkip, CAPTCHA ID'sini düz metin olarak döndürür: OK|2122988149. Eğer json=1 parametresi gönderildiyse yanıt bunun yerine bir JSON zarfı olur. Her iki durumda da dönen değer, sonucu sorgulayacağınız CAPTCHA ID'sidir.

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

Aksi hâlde CapSkip uygun bir hata kodu döndürür. Eksik bir site anahtarı ya da kullanılamaz bir sayfa URL'si, sorgulamadan sonra değil doğrudan gönderim isteğinde reddedilir; böylece hatayı, hatalı olan isteğin kendisinde görürsünüz.

Yaklaşık 5 saniye bekleyin, ardından sonuç uç noktasına (/res.php) aldığınız CAPTCHA ID'si ile bir HTTP GET isteği gönderin. Bir CaptchaFox çözümü gerçek bir tarayıcı oturumu çalıştırır; bu yüzden ALTCHA gibi hesaplamaya dayalı bir yöntemden daha uzun sürmesini bekleyin, etkileşimli bir challenge çizildiğinde ise daha da uzun sürer.

GET istek parametrelerinin listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
actionDizeEvetBelirtin get CAPTCHA çözümünü almak için.
idTam sayıEvetŞunun tarafından döndürülen CAPTCHA ID'si: in.php istek.
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

CAPTCHA çözülmüşse CapSkip çözümü JSON biçiminde döndürür:

{
"status": 1,
"request": "177f50c25b845601e5c779cdb51b040d523e8ab69efb4d5b343e28df07d05076",
"solution": {
"token": "177f50c25b845601e5c779cdb51b040d523e8ab69efb4d5b343e28df07d05076"
},
"cost": "0.00145",
"createTime": 1788863246,
"endTime": 1788863262,
"errorId": 0,
"solveCount": 1
}

request ve solution.token her zaman aynı dizedir; bu yüzden istemcinizin beklediği hangisiyse onu okuyun. json=1, yani bu parametre olmadan yanıt yalnızca şu olur: OK|<token>.

CAPTCHA henüz çözülmemişse CapSkip şunu döndürür: CAPCHA_NOT_READY, diğer tüm yöntemlerde olduğu gibi tam olarak bu yazımla. 5 saniye bekleyip isteği tekrarlayın.

Sorgulama döngünüzü errorId'ye göre kurun, şuna göre değil: status. status alanı, tam sayı olan 1 değerini taşır; bunu res.php sözleşmesinin her zaman döndürdüğü değer budur ve uyumlu her SDK’nın okuduğu da budur. İstemcinizi şunu gösteren bir dokümantasyon sayfasına göre yazdıysanız: "status": "ready", bunun yerine errorId === 0 koşulunu ya da şu alanın varlığını kontrol edin: solution.token aldığınızı anlatıyor.

Token'ı Gönderme

CaptchaFox widget'ı token'ını şu adı taşıyan bir form alanına koyar: cf-captcha-response. Token'ı, tıpkı widget'ın yapacağı gibi, birebir bu alanda gönderin:

POST https://www.example.com/signup
Content-Type: application/x-www-form-urlencodedemail=someone%40example.com&cf-captcha-response=177f50c25b845601e5c779cdb51b040d...

Bazı entegrasyonlar token'ı bunun yerine bir JSON gövde alanından okur; bu yüzden sayfanın kendi gönderiminin ne yolladığını kontrol edin ve aynısını yapın. Token'ı opak kabul edin ve olduğu gibi aktarın. Token, kendisini üreten oturuma karşı sunucu tarafında doğrulanır; dolayısıyla üzerinde yapılan her değişiklik onu geçersiz kılar.

Token'ların ömrü kısadır. Bir kullanıcı formu doldururken token'ı elde tutmak yerine vakit kaybetmeden gönderin ve form yarıda bırakılıp sonra devam ettirilirse yeniden çözdürün.

Widget Kaynağını Seçme

CaptchaFox widget'ını iki farklı yerden yayımlar ve bir sitenin hangisini yüklediği, geri beklenen token'ın biçimini belirler. api_server parametresini yalnızca hedef sayfa varsayılanı kullanmadığında gönderin.

api_serverTokenVarsayılanAçıklama
https://cdn.captchafox.com/SadeEvetSitelerin büyük çoğunluğunun kullandığı standart widget. Hiçbir şey göndermediğinizde CapSkip bunu yükler.
https://s.uicdn.com/mampkg/MAM_ ön ekliHayırBazı platformların gömdüğü paketlenmiş sürüm. Döndürdüğü token şu ön eki taşır: MAM_. Tam paket yolunu, sayfanın script etiketinde göründüğü şekliyle birebir aktarın.

Değeri, hedef sayfada widget'ı yükleyen <script> etiketinden okuyun. Yanlış olanı gönderirseniz çözüm yine başarılı olur, ancak token hedef sitenin kabul etmeyeceği bir biçimde döner; bu da bir hatadan çok sessiz bir doğrulama başarısızlığı gibi görünür.

capy puzzle solver Capy Puzzle

Capy Puzzle bir sürükle bırak CAPTCHA'sıdır: bir fotoğraftan bir parça kesilir ve ziyaretçi bu parçayı geldiği boşluğa geri kaydırır. CapSkip, widget'ın sayfaya yazacağı üç değeri döndürür; bu değerler formunuzla birlikte gönderilmeye hazırdır.

Nasıl Çalışır

Capy, bu sayfadaki CAPTCHA'lar arasında sıra dışıdır: bir challenge'a ait hiçbir şey sunucu tarafından verilmez. Widget kendi challenge anahtarını üretir, o anahtara ait puzzle'ı Capy API'sinden ister ve ziyaretçi parçayı yerine sürükler. Önceden alınacak bir token ya da yeniden oynatılacak bir el sıkışma yoktur.

Yanıt bir koordinat değildir. Widget, parçanın sürüklendiği yolu kaydeder ve bunu bir dize olarak kodlar; dolayısıyla hedef siteye geri gönderdiğiniz şey bir varış noktası değil, inandırıcı bir sürükleme hareketidir. CapSkip bu yolu sizin için oluşturur.

Döngünün tamamı dört adımdan oluşur:

  1. CAPTCHA anahtarını hedef sayfadan okuyun.
  2. Bunu şu şekilde gönderin: /in.php ile method=capy.
  3. Token hazır olana kadar /res.php çözüm hazır olana kadar.
  4. Dönen üç değeri hedef formda geri gönderin.
Çözümden Önce Gerekenler

İki değer ve ikisi de doğrudan hedef sayfadan okunur.

ParametreNereden geldiği
captchakeySitenin herkese açık Capy anahtarı; alışılmış olarak şu ön eki taşır: PUZZLE_. Sayfa kaynağında capy_captchakey, widget betiğinin URL adresinde ise k sorgu parametresi olarak görünür.
pageurlWidget'ın göründüğü sayfanın tam URL'si. Capy bu değeri hiçbir zaman görmez, ancak anahtarlar sitelere kayıtlıdır; bu yüzden gerçek sayfayı gönderin.

Kontrol etmeye değer üçüncü bir değer daha vardır: api_server, anahtarın bağlı olduğu Capy API'sinin kök adresi. Bunu aynı script etiketinden okuyun. CapSkip varsayılan olarak şunu kullanır: https://jp.api.capy.me, canlı servis burada çalışır ve yalnızca hedef sayfa başka bir adresi gösteriyorsa bunu belirtmeniz gerekir.

Bazı çözüm servisleri, bölge öneki olmayan api.capy.me adresini hâlâ belgelerinde gösteriyor. O host artık çözümlenmiyor. Bu adresi başka bir yerden kopyaladıysanız kullanmayın ve CapSkip kendi varsayılanını kullansın.

CAPTCHA Anahtarı Nerede Bulunur

Hedef sayfada tarayıcının geliştirici araçlarını açın ve Capy widget'ını arayın. Siteler widget'ı iki yoldan yükler ve anahtar her ikisinde de görünür.

<!-- 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>

Yukarıdaki örnekte o script URL'sinin kökü olan https://jp.api.capy.me/ adresi, göndermeniz gerekirse kullanacağınız api_server değeridir.

Yanıt Bir Token Değil, Üç Değerdir

Bu, sayfadaki diğer tüm yöntemlerden ayrılan tek yapısal farktır ve istemcinizi yazmadan önce okumaya değer. reCAPTCHA, Turnstile ve CaptchaFox tek bir opak dize olarak döner. Capy çözümü ise yalnızca birlikte işe yarayan üç ayrı değerden oluşur.

Dönen değerHedef formda girdiği alan
captchakeycapy_captchakey
challengekeycapy_challengekey
answercapy_answer

Yalın bir OK|<token> içinde üç değil tek bir değere yer olduğundan, bu yöntemde /res.php çözüm nesnesinin tamamını döndürür. Düz metin yanıtı bunu içerir; bir JSON yanıtının request alanı da aynısını içerir. Dördüncü bir alan olan respKey, diğer servislere göre yazılmış istemcilerle uyumluluk için boş bir dize olarak döner. Bir puzzle çözümü için hiçbir şey taşımaz ve göz ardı edilebilir.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
methodDizeEvetOlmalı capy. Bir Capy Puzzle CAPTCHA'sı gönderdiğinizi belirtir.
captchakeyDizeEvetHedef sayfadan okunan CAPTCHA anahtarı; alışılmış olarak şu ön eki taşır: PUZZLE_. sitekey ve websiteKey takma ad olarak kabul edilir.
pageurlDizeEvetWidget'ın göründüğü sayfanın tam URL'si.
api_serverDizeHayırAnahtarın bağlı olduğu Capy API'sinin kök adresi. Varsayılan değer: https://jp.api.capy.me.
versionDize
Varsayılan: puzzle
HayırChallenge ailesi. Yalnızca puzzle çözülür. Aşağıdaki Puzzle ve Avatar bölümüne bakın.
userAgentDizeHayırPuzzle isteğiyle birlikte gönderilecek User-Agent. İsteğe bağlıdır ve nadiren gerekir.
proxyDizeHayırProxy adresi. Şu biçimleri kabul eder: IP:PORT, LOGIN:PASSWORD@IP:PORT veya IP:PORT:LOGIN:PASSWORD.
proxytypeDizeHayırProxy türü: HTTP, HTTPS, SOCKS5 veya SOCKS5H.
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.

CapSkip bu yöntem için proxy zorunlu tutmaz, ancak herhangi bir hacimde çözüm yapmaya başladığınız anda proxy isteyeceksiniz. Her çözüm, canlı bir istekle Capy API’sinden yeni bir puzzle çeker ve tek bir adresten gelen bu düzenli akış, hız sınırlamanın yakalamak için var olduğu kalıbın ta kendisidir. Testler ve ara sıra yapılan çözümler için tek adres yeterlidir. Bunun ötesinde CapSkip’te bir proxy havuzu yapılandırın ve yükü ona dağıttırın veya bir çözümün belirli bir ağdan gelmesi gerekiyorsa istek başına proxy gönderin.

CapSkip API uç noktanıza bir HTTP GET veya POST isteği gönderin (/in.php) ile method=capy. Form alanları, sorgu dizesi ve JSON gövdesi aynı alan adlarıyla kabul edilir, çünkü Capy’de yüklenecek bir görsel yoktur.

Capy Puzzle gönderimi (form alanları):

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

Capy Puzzle gönderimi (JSON gövdesi):

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

Her şey doğruysa CapSkip, CAPTCHA ID'sini düz metin olarak döndürür: OK|2122988149. Eğer json=1 parametresi gönderildiyse yanıt bunun yerine bir JSON zarfı olur. Her iki durumda da dönen değer, sonucu sorgulayacağınız CAPTCHA ID'sidir.

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

Aksi hâlde CapSkip uygun bir hata kodu döndürür. Eksik bir CAPTCHA anahtarı, kullanılamaz bir sayfa URL'si ya da URL olmayan bir api_server değeri, sorgulamadan sonra değil doğrudan gönderim isteğinde reddedilir; böylece hatayı, hatalı olan isteğin kendisinde görürsünüz.

Yaklaşık 3 saniye bekleyin, ardından sonuç uç noktasına (/res.php) aldığınız CAPTCHA ID'si ile bir HTTP GET isteği gönderin. Bir çözüm, döndürülmeden önce insan için makul bir süreye ulaşana kadar kasıtlı olarak bekletilir; nedeni için aşağıdaki Zamanlama bölümüne bakın.

GET istek parametrelerinin listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
actionDizeEvetBelirtin get CAPTCHA çözümünü almak için.
idTam sayıEvetŞunun tarafından döndürülen CAPTCHA ID'si: in.php istek.
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

CAPTCHA çözülmüşse CapSkip çözümü JSON biçiminde döndürür:

{
"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 ve solution aynı nesneyi taşır; bu yüzden istemcinizin beklediği hangisiyse onu okuyun. Şu parametre olmadan: json=1, aynı nesne OK| ön ekinden sonra tek satırlık JSON olarak gelir ve bir istemci res.php yanıtını düz metin olarak okuduğunda da elinize bu geçer:

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

CAPTCHA henüz çözülmemişse CapSkip şunu döndürür: CAPCHA_NOT_READY, diğer tüm yöntemlerde olduğu gibi tam olarak bu şekilde yazılır. 3 saniye bekleyin ve isteği yineleyin.

Her sonuç yalnızca bir kez teslim edilir. İlk başarılı sorgulama çözümü döndürür ve onu siler; aynı ID için yapılan sonraki her sorgulama boş bir gövde döndürür. Bu yüzden değerleri, onları taşıyan yanıttan alıp saklayın.

Çözümü Gönderme

Üç değer, Capy widget'ının kendi dolduracağı form alanlarına girer. Bunları birebir gönderin:

<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">

Şunu kırpmayın, yeniden kodlamayın ya da başka bir biçimde temizlemeyin: answer dizesi, widget'ın kaydedeceği sürükleme yoludur ve hedef sitenin arka ucu bunu, verdiği challenge ile karşılaştırarak doğrular; dolayısıyla üzerinde yapılan her değişiklik onu geçersiz kılar.

Challenge anahtarı tek kullanımlıktır ve kısa ömürlüdür. CapSkip her çözüm için yenisini üretir ve puzzle ona bağlıdır; bu yüzden üç değeri önbelleğe almak yerine vakit kaybetmeden gönderin ve ikinci bir gönderimde asla aynı challengekey değerini yeniden kullanmayın.

Zamanlama: Capy Çok Hızlı Gelen Yanıtları Reddeder

Capy’yi kendiniz entegre edecekseniz bir gününüzü alacak kısım burasıdır. Capy, puzzle'ın verilmesi ile yanıtın alınması arasındaki gerçek zaman farkını ölçer ve insanüstü görünen her şeyi reddeder. Üstelik bunu, yanlış bir yanıtın aldığı mesajın aynısıyla reddeder; dolayısıyla 200 milisaniyede döndürülen kusursuz doğru bir çözüm, bozuk bir çözücüden ayırt edilemez.

Capy’nin kendi oturum açma sayfasında, doğru bir yanıt sabit tutularak ölçüldü:

Puzzle ile doğrulama arasındaki süreSonuç
0.48 secondsRefused
1.03 saniye ve üzeri, 4 saniyeye kadar test edildiAccepted

Bu yüzden CapSkip, puzzle çizildikten sonra yeterli süre geçene kadar her sonucu bekletir; bu süre gözlemlenen alt sınırın yaklaşık iki katıdır, çünkü bu alt sınır Capy’ye aittir ve değişebilir. Bekletme her çözüme otomatik olarak uygulanır ve yapılandırılacak bir şey yoktur. Bekletme, iş hacmine değil gecikmeye mal olur ve sonucu sorgulayarak beklerseniz görünmez bile, çünkü görev yalnızca yaklaşık iki saniye sürer.

Puzzle ve Avatar

Capy iki challenge ailesi yayımlar. Bunlar farklı uç noktaların arkasındaki farklı challenge'lardır ve CapSkip bunlardan birini çözer.

versionChallengeDestekleniyorAçıklama
puzzleAssemble a puzzleEvetVarsayılan olan ve neredeyse her kurulumun kullandığı tür. Bir parça, kesildiği boşluğa geri sürüklenir.
avatarDrag an objectHayırAyrı bir challenge türü. Gönderim anında ERROR_BAD_PARAMETERS hatasıyla reddedilir, yanıtlanmaz.

Hiç version göndermezseniz puzzle, yani varsayılan aile kullanılır; bu yüzden çoğu entegrasyon bunu hiç ayarlamaz. Bir avatar isteği, bilinçli olarak denenmek yerine reddedilir: bunu bir puzzle gibi yanıtlamak, hedef sitenin reddedeceği bir çözüm döndürürdü. Bu da açık bir hatadan daha kötüdür, çünkü desteklenmeyen bir challenge yerine başarısız bir çözücü varmış gibi görünür.

friendly captcha solver Friendly Captcha

Friendly Captcha, ziyaretçiden bir şey yapmasını istemek yerine ziyaretçinin tarayıcısından bir miktar aritmetik işlem yapmasını ister. Tıklanacak bir görsel, kaydırıcı ya da sesli alternatif yoktur; dolayısıyla ekranda yanlış yapılabilecek hiçbir şey bulunmaz. CapSkip, widget’ın üreteceği token’ı döndürür; bu token formunuzla birlikte gönderilmeye hazırdır.

Nasıl Çalışır

Friendly Captcha bir proof of work CAPTCHA’sıdır. Widget’a bir zorluk ayarı verilir, widget bu ayarın altında hash üreten değerleri arar ve sonucu formunuzdaki gizli bir alana yazar. Ziyaretçiye hiçbir zaman hiçbir şey gösterilmez; ürünün amacı da budur: bunu kullanan bir sayfa, üzerinde hiç CAPTCHA olmayan bir sayfa gibi görünür.

Bu tek isim altında birbirinden tamamen farklı iki protokol dağıtılır ve sitekey, bir sitenin hangisini kullandığını size söylemez. Ortak yanları yalnızca marka ve sitekey ad alanıdır, başka hiçbir şey değil. İkisi arasında doğru seçimi yapmak, bir entegrasyonun ilk olarak doğru yapması gereken şeydir; bu yüzden aşağıda kendine ait bir bölümü vardır.

Döngünün tamamı dört adımdan oluşur:

  1. Hedef sayfadan sitekey değerini ve onunla birlikte widget script URL’sini okuyun.
  2. İkisini de şu yöntemle gönderin: /in.php ile method=friendly_captcha.
  3. Token hazır olana kadar /res.php uç noktasını yoklayın.
  4. Token’ı widget’ın dolduracağı form alanına koyun ve gönderin.

Çözüm süresi bu yöntem için sabit değildir. Servis, bir isteğin ne kadar iş değerinde olduğuna istek yapıldığı anda karar verir; bu nedenle aynı sitekey bir seferinde diğerine göre gözle görülür biçimde daha pahalıya gelebilir. Sabit bir süre varsaymak yerine sorgulamanızda buna göre pay bırakın.

Çözümden Önce Gerekenler

İki değer zorunludur, üçüncü bir değeri de elde edebildiğiniz her durumda göndermeniz yararlı olur.

ParametreNereden geldiği
sitekeyThe data-sitekey özniteliği; widget öğesi, şu sınıfı taşıyan öğedir: class="frc-captcha".
pageurlWidget'ın göründüğü sayfanın tam URL'si.
module_scriptThe src değeri; söz konusu widget script etiketi şunu taşır: type="module". Zorunlu değildir, ancak sitenin hangi protokol sürümünü kullandığını CapSkip’e bildiren şey budur; bu yüzden sayfada varsa gönderin.
Sürüm 1 ve Sürüm 2

Atlarsanız size bir öğleden sonranıza mal olacak bölüm burasıdır. Her iki sürüm de yayındadır, her ikisi de kullanımdadır ve birine kayıtlı bir sitekey diğerinin uç noktasında da yanıt verir. Yanlış olanı çözerseniz, hedef sitenin reddettiği, biçimi düzgün bir token elde edersiniz ve sorunun sürüm olduğuna dair hiçbir yerde bir işaret bulunmaz.

versionWidget paketiDestekleniyorAçıklama
v1friendly-challengeEvetÖzgün, açık kaynaklı widget. Script’i şudur: widget.module.min.js veya widget.min.js. Aksini belirten bir şey yoksa varsayılan budur.
v2@friendlycaptcha/sdkEvetGüncel SDK. Script’i şudur: site.min.js. Bunu yükleyen bir sayfa, başka neye benzerse benzesin v2’dir.

CapSkip sürümü şu sırayla belirler ve ilk yanıtta durur:

  1. The version parametresi, eğer gönderdiyseniz. v1 ve v2 kabul edilen yazımlardır; ayrıca yalın bir 1 veya 2 değeri de kabul edilir.
  2. Widget script URL’si, şu parametrelerden alınır: module_script veya nomodule_script. Bu, mevcut en güvenilir sinyaldir, çünkü sitenin gerçekten yüklediği yapı budur.
  3. İkisi de yoksa, v1.

CapSkip, bir sitekey’in hangi sürüme ait olduğunu servise sormaz, çünkü servis her iki sürüm için de yanıt verir. Ya versionparametresini gönderin ya da script URL’sini gönderin; böylece bu soru hiç ortaya çıkmaz.

Sitekey Nerede Bulunur?

Hedef sayfada tarayıcı geliştirici araçlarını açın ve widget öğesini arayın. Sitekey ile script, sayfa kaynağında yan yanadır ve ikisi birlikte bu yöntemin ihtiyaç duyduğu her şeyi verir.

<!-- 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>

Bazı kurulumlar script’i bir CDN yerine kendi alan adlarından sunar. Önemli olan dosya adıdır, geldiği sunucu değil.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
methodDizeEvetOlmalı friendly_captcha. Bir Friendly Captcha gönderdiğinizi belirtir.
sitekeyDizeEvetThe data-sitekey değeri; hedef sayfadaki widget öğesinden okunur.
pageurlDizeEvetWidget'ın göründüğü sayfanın tam URL'si.
versionDize
Varsayılan: v1
HayırProtokol sürümü: v1 veya v2. Aşağıdaki Sürüm 1 ve Sürüm 2 bölümüne yukarıda bakın.
module_scriptDizeHayırThe src değeri; söz konusu widget script etiketi şunu taşır: type="module". Sürümü belirlemek için kullanılır; ancak yalnızca version gönderilmediğinde.
nomodule_scriptDizeHayırThe src değeri; söz konusu widget script etiketi şunu taşır: nomodule. Aynı nedenle okunur.
api_serverDizeHayırCapSkip’e özgü. Sitekey’in ait olduğu veri yerleşim uç noktası. Kabul edilen değerler: global (varsayılan), eu, ya da tam bir URL. Bakınız: Veri Yerleşimi bölümüne bakın.
useragentDizeHayırİstekle birlikte gönderilecek User-Agent. İsteğe bağlıdır ve nadiren gerekir.
proxyDizeHayırProxy adresi. Şu biçimleri kabul eder: IP:PORT, LOGIN:PASSWORD@IP:PORT veya IP:PORT:LOGIN:PASSWORD.
proxytypeDizeHayırProxy türü: HTTP, HTTPS, SOCKS5 veya SOCKS5H.
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.

CapSkip bu yöntem için proxy kullanımını zorunlu tutmaz, ancak burada bir proxy’ye bu sayfadaki neredeyse her yerden daha erken ihtiyaç duyacaksınız. Servis her isteğin ne kadar iş değerinde olduğuna karar verir ve çok sık gördüğü adresler için bu değeri yükseltir: tek bir adresten tek bir sitekey üzerinde ölçüldüğünde, zorluk ayarı bir test oturumu boyunca istikrarlı biçimde yükseldi ve yeni bir adres ile yoğun kullanılan bir adres arasında yayımlanan aralık, aynı token için yaklaşık otuz kat işe karşılık geliyor. Test için ve ara sıra yapılan çözümler için tek bir adres yeterlidir. Bunun ötesinde, CapSkip’te bir proxy havuzu yapılandırıp yükü dağıtmasına izin verin ya da bir çözümün belirli bir ağdan gelmesi gerektiğinde istek başına proxy gönderin.

CapSkip API uç noktanıza bir HTTP GET veya POST isteği gönderin (/in.php) ile method=friendly_captcha. Bu yöntemde yüklenecek bir görsel olmadığı için form alanları, sorgu dizesi ve JSON gövdesinin tamamı aynı alan adlarıyla kabul edilir.

Friendly Captcha gönderme (form alanları):

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

Friendly Captcha gönderme (açık bir version yerine script URL’leriyle JSON gövdesi):

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

Her şey doğruysa CapSkip, CAPTCHA ID'sini düz metin olarak döndürür: OK|2122988149. Eğer json=1 parametresi gönderildiyse yanıt bunun yerine bir JSON zarfı olur. Her iki durumda da dönen değer, sonucu sorgulayacağınız CAPTCHA ID'sidir.

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

Aksi hâlde CapSkip uygun bir hata kodu döndürür. Eksik bir sitekey ya da kullanılamaz bir sayfa URL’si, sorgulamadan sonra değil doğrudan gönderim isteğinin kendisinde reddedilir; böylece hatayı, yanlış olan isteğin üzerinde öğrenirsiniz.

Yaklaşık 5 saniye bekleyin, ardından sonuç uç noktasına (/res.php) aldığınız CAPTCHA ID'si ile bir HTTP GET isteği gönderin.

GET istek parametrelerinin listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
actionDizeEvetBelirtin get CAPTCHA çözümünü almak için.
idTam sayıEvetŞunun tarafından döndürülen CAPTCHA ID'si: in.php istek.
jsonTam sayı
Varsayılan: 0
Hayır0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.
curl "http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1"

CAPTCHA çözülmüşse CapSkip token’ı JSON biçiminde döndürür. Token şu alandadır: request, ve solution.token alanı ise, token’ı orada bekleyen istemciler için aynı dizeyi taşır:

{
"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
}

İstekte json=1yoksa aynı token, düz metin olarak OK| önekinin ardından gelir; bu da res.php yanıtını metin olarak okuyan bir istemcinin geri vereceği şeydir:

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

CAPTCHA henüz çözülmemişse CapSkip şunu döndürür: CAPCHA_NOT_READY, diğer tüm yöntemlerde olduğu gibi tam olarak bu yazımla. 5 saniye bekleyip isteği tekrarlayın.

Her sonuç yalnızca bir kez teslim edilir. İlk başarılı sorgulama token’ı döndürür ve onu siler; aynı ID için yapılan sonraki her sorgulama boş bir gövde döndürür. Bu nedenle token’ı, onu taşıyan yanıttan alıp saklayın.

İki sürüm birbirinden çok farklı biçim ve boyutta token üretir. Bir v1 token’ı, noktayla ayrılmış dört bölümden oluşur ve yukarıdaki gibi birkaç yüz karaktere ulaşır. Bir v2 token’ı ise şununla başlayan tek parça, anlamsız bir dizedir: AQQA. ve yaklaşık altı kilobayt uzunluğundadır; bu yüzden onu taşıyan her şeyin, yani gizli bir alanın, bir veritabanı sütununun ya da proxy üzerinden geçen bir isteğin buna göre boyutlandırıldığından emin olun.

Token'ı Gönderme

Token, widget’ın kendisinin dolduracağı gizli alana girer ve iki sürüm aynı alan adını kullanmaz. Çalışan bir v1 entegrasyonunu bir v2 sitesine taşıyanlar genellikle buna takılır.

versionToken’ın gireceği form alanı
v1frc-captcha-solution
v2frc-captcha-response
<!-- Sürüm 1 -->
<input type="hidden" name="frc-captcha-solution" value="c62c4da3...AgAB"><!-- Sürüm 2 -->
<input type="hidden" name="frc-captcha-response" value="AQQA.vW7kd3CujKT8PaQgEcW18QaH...">

Token’ı olduğu gibi gönderin. Kırpmayın, yeniden kodlamayın ve dolgu karakteri gibi görünenleri silmeyin: token’ın her parçası, verildiği doğrulamaya karşı denetlenir, dolayısıyla herhangi bir düzenleme onu geçersiz kılar.

Bir site bu alanı yeniden adlandırmakta serbesttir ve bazıları bunu yapar. Entegre olduğunuz sayfa farklı bir ad kullanıyorsa, adı widget öğesinden okuyup onu kullanın. Sayfa widget için bir geri çağırma tanımlıyorsa, bunu tek argümanı token olacak şekilde çağırmak da aynı işi görür.

Veri Yerleşimi

Friendly Captcha, farklı veri yerleşim bölgeleri için ayrı uç noktalar çalıştırır ve her sitekey bunlardan birine aittir. İkisi de aynı sitekey için token verir; bu yüzden isteği yanlış olana göndermek, burada kusursuz geçerli görünen ama hedef sitenin başarısız bir doğrulamadan daha açıklayıcı hiçbir şey vermeden reddettiği bir token üretir.

Widget kendi bölgesini şurada belirtir: data-api-endpoint özniteliği. Hedef sayfada bu öznitelik varsa, aynı değeri şu parametre olarak gönderin: api_server. Bu parametre CapSkip’e özgüdür ve başka hiçbir yerde karşılığı yoktur; bu nedenle başka bir servis için yazılmış bir istemci onu göndermez: hedef sayfa bölgesel bir uç noktadaysa parametreyi kendiniz ekleyin.

api_serverNeyi seçer
globalVarsayılan. Öznitelik yoksa kullanılır; yaygın durum budur.
euAvrupa uç noktası; şununla seçilir: data-api-endpoint="eu".
A full URLKendi barındırdığınız ya da başka şekilde özelleştirilmiş bir kurulum. Uç noktayı, sayfanın verdiği şekliyle aynen gönderin.

Proxy Kullanımı

reCAPTCHA v2, v3, Invisible, Enterprise ve Cloudflare için her görevle birlikte bir proxy gönderebilirsiniz. CapSkip, CapSkip uygulamasında yapılandırılan proxy havuzunu kullanmak yerine CAPTCHA'yı o proxy üzerinden çözer.

Bu, hedef web sitesi CAPTCHA token'ının kendi isteklerinizle aynı IP adresinden oluşturulduğunu kontrol ettiğinde faydalıdır; örneğin Cloudflare arkasındaki siteler, katı reCAPTCHA skorlaması veya coğrafi kısıtlamalı sayfalar.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
proxyDizeHayırProxy adresi. IP kimlik doğrulaması için biçim: IP:PORT (örnek: 123.123.123.123:3128). Kullanıcı adı/parola kimlik doğrulaması için biçim: login:password@IP:PORT
proxytypeDizeHayırProxy türü. Desteklenen değerler: HTTP, HTTPS, SOCKS5, SOCKS5H. Varsayılan: HTTP ne zaman proxy sağlanır ancak proxytype atlanır.

Hata Kodları

KodAnlamı
ERROR_KEY_DOES_NOT_EXISTGeçersiz API anahtarı.
ERROR_WRONG_USER_KEYAPI anahtarı eksik veya boş.
ERROR_WRONG_METHODGeçersiz HTTP yöntemi veya action parametre.
ERROR_WRONG_ID_FORMATGeçersiz captcha ID formatı.
ERROR_BAD_PARAMETERSGerekli parametreler eksik veya geçersiz.
ERROR_UPLOADGörüntü verisi sağlanmadı veya yükleme başarısız oldu.
ERROR_INVALID_IMAGEGeçersiz görsel formatı veya bozuk görsel verisi.
ERROR_INVALID_BASE64Geçersiz base64 kodlaması.
ERROR_TOO_BIG_CAPTCHA_FILESIZEGörsel boyutu 600 kB'yi aşıyor veya boyutlar 1000px'i aşıyor.
ERROR_CAPTCHA_UNSOLVABLECaptcha çözülemedi. Yeni bir görev gönderin ve yeniden deneyin.
ERROR_GOOGLEKEYGeçersiz googlekey parametre.
ERROR_PAGEURLGeçersiz pageurl parametre.
ERROR_ZERO_BALANCEAPI anahtarının bu yöntem için kalan kredisi yok.
ERROR_PROXY_FORMATThe proxy değeri ayrıştırılamadı.
CAPCHA_NOT_READYcaptcha hâlâ işleniyor. Sorgulamaya devam edin.
(boş yanıt)Sonuç zaten alınmış veya ID mevcut değil.