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.

Bu dokümantasyon, isteklerin nasıl gönderileceğini ve sonuçların nasıl alınacağını açıklar. CapSkip birden fazla API ailesini destekler: 2Captcha tarzı API (in.php / res.php), AntiCaptcha, CapMonster, CapSolver, NextCaptcha ve EzCaptcha tarafından kullanılan JSON createTask / getTaskResult API ve DeathByCaptcha REST API. Aynı ailedeki hizmetler aynı endpoint’leri, istek ve yanıt biçimini 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, nextcaptcha.com, ez-captcha.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 parametresi Tür Gerekli Açıklama
key Dize Evet CapSkip API key'iniz.
method Dize Evet post: görüntüyü multipart/form-data kullanarak gönderin
base64: görseli Base64 kodlu bir dize olarak gönderin
file Dosya Evet* CAPTCHA görsel dosyası.
* method=post olduğunda gereklidir.
body Dize Evet* Base64 ile kodlanmış CAPTCHA görüntü verisi.
* method=base64 olduğunda gereklidir.
json Tam 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 parametresi Tür Gerekli Açıklama
key Dize Evet CapSkip API key'iniz.
action Dize Evet get: gönderilen CAPTCHA için yanıtı alır.
id Tam sayı Evet Şunun döndürdüğü CAPTCHA ID'si in.php.
json Tam 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
Parametre Tür Gerekli Açıklama
key Dize Evet CapSkip API key'iniz.
method Dize Evet userrecaptcha: bir reCAPTCHA v2 isteği belirtir.
googlekey Dize Evet Şunun değeri: k veya data-sitekey hedef sayfada bulunan parametre.
pageurl Dize Evet reCAPTCHA'nın bulunduğu sayfanın tam URL'si.
enterprise Tam sayı
Varsayılan: 0
Hayır 1: reCAPTCHA Enterprise v2'yi belirtir.
0: standart reCAPTCHA v2.
invisible Tam sayı
Varsayılan: 0
Hayır 1: Invisible reCAPTCHA'yı belirtir.
0: standart checkbox reCAPTCHA.
data-s Dize Hayır Şunun değeri: data-s sayfada bulunan parametre. Google Search ve belirli Google servisleri için geçerlidir.
json Tam 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.
proxy Dize Hayır Proxy 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
proxytype Dize Hayır Proxy 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 parametresi Tür Gerekli Açıklama
key Dize Evet CapSkip API key'iniz.
action Dize Evet get: gönderilen CAPTCHA için yanıtı alır.
id Tam sayı Evet Şunun döndürdüğü CAPTCHA ID'si in.php.
json Tam sayı
Varsayılan: 0
Hayır 0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür; mevcut olduğunda userAgent değeri de dahildir.
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

Her token, alındığı tarayıcının User-Agent değeriyle birlikte gelir. Şununla: json=1 yanıt şunu içerir: userAgent alanı, şu alanın yanında: request. Düz metin modunda aynı değeri X-Recaptcha-User-Agent yanıt header'ından okuyun. JSON API kullanıyorsanız, getTaskResult bunu şu alan olarak döndürür: solution.userAgent. Token'ı gönderirken bu User-Agent'ı gönderin, çünkü bazı siteler ikisinin eşleşip eşleşmediğini kontrol eder. User-Agent mevcut değilse alan ve header yanıta eklenmez.

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

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
Parametre Tür Gerekli Açıklama
key Dize Evet CapSkip API key'iniz.
method Dize Evet userrecaptcha: bir reCAPTCHA isteği belirtir.
version Dize Evet v3: isteğin reCAPTCHA v3 için olduğunu belirtir.
googlekey Dize Evet Şunun değeri: data-sitekey hedef sayfada bulunan parametre.
pageurl Dize Evet reCAPTCHA'nın bulunduğu sayfanın tam URL'si.
enterprise Tam sayı
Varsayılan: 0
Hayır 1: reCAPTCHA Enterprise v3'ü belirtir.
0: standart reCAPTCHA v3.
action Dize
Varsayılan: verify
Hayır Şunun değeri: action sayfada tanımlanan parametre.
min_score Float Hayı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.
json Tam 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.
proxy Dize Hayır Proxy 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
proxytype Dize Hayır Proxy 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

Her token, alındığı tarayıcının User-Agent değeriyle birlikte gelir. Şununla: json=1 yanıt şunu içerir: userAgent alanı, şu alanın yanında: request. Düz metin modunda aynı değeri X-Recaptcha-User-Agent yanıt header'ından okuyun. JSON API kullanıyorsanız, getTaskResult bunu şu alan olarak döndürür: solution.userAgent. Token'ı gönderirken bu User-Agent'ı gönderin, çünkü bazı siteler ikisinin eşleşip eşleşmediğini kontrol eder. User-Agent mevcut değilse alan ve header yanıta eklenmez.

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

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 parametresi Tür Gerekli Açıklama
key Dize Evet CapSkip API key'iniz.
action Dize Evet get: gönderilen CAPTCHA için yanıtı alır.
id Tam sayı Evet Şunun döndürdüğü CAPTCHA ID'si in.php.
json Tam sayı
Varsayılan: 0
Hayır 0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür; mevcut olduğunda userAgent değeri de dahildir.
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
Parametre Tür Gerekli Açıklama
key Dize Evet CapSkip API key'iniz.
method Dize Evet turnstile: bir Cloudflare Turnstile isteği belirtir.
sitekey Dize Evet Şunun değeri: data-sitekey hedef sayfada bulunan parametre.
pageurl Dize Evet Turnstile doğrulamasının bulunduğu sayfanın tam URL'si.
action Dize Hayır Şurada tanımlanan isteğe bağlı action değeri: data-action öznitelik veya şuna iletilir: turnstile.render().
data Dize Hayır Şunun değeri: cData şuraya aktarılan: turnstile.render() veya şurada tanımlanmış: data-cdata öznitelik.
pagedata Dize Hayır Şunun değeri: chlPageData şuraya aktarılan: turnstile.render().
json Tam 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.
proxy Dize Hayır Proxy 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
proxytype Dize Hayır Proxy 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 sayfası, isteğe bağlı action, data, pagedata ile):

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 parametresi Tür Gerekli Açıklama
key Dize Evet CapSkip API key'iniz.
action Dize Evet get: gönderilen CAPTCHA için yanıtı alır.
id Tam sayı Evet Şunun döndürdüğü CAPTCHA ID'si in.php.
json Tam 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"

cloudflare challenge solver Cloudflare Challenge (cf_clearance)

Cloudflare arkasındaki bazı siteler, herhangi bir içerik göstermeden önce her ziyaretçiyi “Just a moment...” yazan tam sayfalık bir ekranda durdurur. Bu sayfa geçildiğinde bir cf_clearance çerezi ayarlanır ve bu çerezi taşıyan sonraki her istek doğrudan geçirilir. CapSkip, gönderdiğiniz URL için bu sayfayı geçer ve çerezi döndürür; böylece kendi tarayıcısı olmayan bir betik veya araç, siteye sıradan HTTP istekleriyle erişebilir.

Nasıl Çalışır

Bu yöntem tam sayfa doğrulama içindir. Site bunun yerine bir form içinde Turnstile bileşeni gösteriyorsa çerez değil token gerekir: yukarıdaki Cloudflare Turnstile bölümüne bakın.

Cloudflare, bir cf_clearance çerezini, onu elde eden IP adresine ve User-Agent’a bağlar. Farklı bir adresten veya farklı bir User-Agent ile yeniden kullanılan çerez reddedilir ve doğrulama sayfası yeniden çıkar. Bu yöntem için yapılan her isteğin proxy’nizi içermesinin ve yanıtın hangi User-Agent’ı göndermeniz gerektiğini bildirmesinin nedeni budur.

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

  1. CapSkip’te cf_clearance çerezlerini döndür seçeneğini açın (aşağıya bakın).
  2. Sayfa URL’sini ve proxy’nizi şuraya gönderin: /createTask.
  3. Token hazır olana kadar /getTaskResult çerez hazır olana kadar.
  4. Kendi isteklerinizi aynı proxy üzerinden, aynı User-Agent ve çerezle gönderin.

Bu yöntem yalnızca JSON createTask / getTaskResult API’sinde kullanılabilir. Eski in.php / res.php arayüzünde çerez modu yoktur.

Başlamadan Önce

Bu yöntem varsayılan olarak kapalıdır. CapSkip’i açın ve şuraya gidin: Ayarlar, Captcha türleri, Cloudflare, ardından şu seçeneği açın: cf_clearance çerezlerini döndür. Bu ayar kapalıyken, bu yöntem için yapılan her istek şu hatayla reddedilir: ERROR_TASK_NOT_SUPPORTED. Ayar bir sonraki istekte geçerli olur; yeniden başlatmanız gereken bir şey yoktur.

Her istekte iki şey gereklidir:

  • Bir proxy. Çerez yalnızca onu elde eden adresten geçerlidir, bu yüzden istekte daha sonra kullanacağınız proxy belirtilmelidir. Proxy içermeyen bir istek, herhangi bir işlem yapılmadan reddedilir. HTTP, HTTPS, SOCKS5 ve SOCKS5H proxy’leri kabul edilir; SOCKS4 kabul edilmez.
  • Eşleşen bir User-Agent (gönderiyorsanız). Bu, Windows için Chrome’un User-Agent’ı olmalı ve CapSkip’i çalıştıran bilgisayarda yüklü Google Chrome ile aynı ana sürüme sahip olmalıdır. Başka herhangi bir User-Agent sitenin reddedeceği bir çerez üreteceğinden, bunun yerine en baştan bir hatayla reddedilir. En basit yol hiç User-Agent göndermemek ve çerezle birlikte döndürüleni kullanmaktır.
Görev Türleri

Aynı isteğin üç farklı yazımı kabul edilir; çerez modu olan her istemci ailesi için bir tane. Hepsi aynı şekilde çözülür; yalnızca alan isimleri ve yanıtın biçimi farklıdır.

Görev türüAPI stiliDestekleniyorAçıklama
AntiCloudflareTaskCapSolverEvetProxy tek bir proxy dizesi olarak verilir. Yanıtta çerez, aynı değeri taşıyan bir token alanı ve User-Agent bulunur.
TurnstileTask ile cloudflareTaskType şuna ayarlı: cf_clearanceCapMonsterEvetProxy ayrı alanlar olarak verilir. Yanıtta çerez bulunur; istek bir User-Agent göndermediyse User-Agent da eklenir.
TurnstileTask şu alan olmadan: websiteKeyNextCaptchaEvetProxy ayrı alanlar olarak verilir. Yalnızca NextCaptcha seçili hizmet olduğunda tanınır. Yanıtta çerez ve User-Agent bulunur.
AntiCloudflareTask Parametreleri
ParametreTürGerekliAçıklama
clientKeyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
typeDizeEvetOlmalı AntiCloudflareTask.
websiteURLDizeEvetDoğrulamayı gösteren sayfanın tam http veya https URL’si.
proxyDizeEvetÇözümün yapılacağı proxy. Kabul edilen biçimler: IP:PORT:LOGIN:PASSWORD, LOGIN:PASSWORD@IP:PORT, http://LOGIN:PASSWORD@IP:PORT (ayrıca https://, socks5://, socks5h://) ve socks5:IP:PORT:LOGIN:PASSWORD. Kullanıcı adı ve parola isteğe bağlıdır.
userAgentDizeHayırÇerezle birlikte göndereceğiniz User-Agent. Neyin kabul edildiği için Başlamadan Önce bölümüne bakın.
htmlDizeHayırUyumluluk için kabul edilir ve yok sayılır.
TurnstileTask (cf_clearance) Parametreleri
ParametreTürGerekliAçıklama
clientKeyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
typeDizeEvetOlmalı TurnstileTask.
cloudflareTaskTypeDizeEvetOlmalı cf_clearance. Bu alan olmadan görev, bir Turnstile token isteği olur.
websiteURLDizeEvetDoğrulamayı gösteren sayfanın tam http veya https URL’si.
websiteKeyDizeHayırUyumluluk için kabul edilir. Sayfada verilecek bir sitekey olmadığından herhangi bir değer kullanılabilir.
proxyTypeDize
Varsayılan: http
Hayırhttp, https, socks5 veya socks5h.
proxyAddressDizeEvetProxy IP adresi veya ana bilgisayar adı.
proxyPortTam sayıEvetProxy portu.
proxyLoginDizeHayırProxy kullanıcı adı.
proxyPasswordDizeHayırProxy parolası. Gönderildiği gibi alınır, bu nedenle @ ve : gibi karakterler sorun oluşturmaz.
userAgentDizeHayırÇerezle birlikte göndereceğiniz User-Agent. Neyin kabul edildiği için Başlamadan Önce bölümüne bakın.
htmlPageBase64DizeHayırUyumluluk için kabul edilir ve yok sayılır.

NextCaptcha yazımı aynı proxyType, proxyAddress, proxyPort, proxyLogin ve proxyPassword alanlarını kullanır; burada type şuna ayarlı: TurnstileTask olur ve şu alan yer almaz: websiteKey.

Görev Gönderme

JSON gövdeli bir HTTP POST isteğini CapSkip API uç noktanıza gönderin (/createTask).

AntiCloudflareTask gönderimi:

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

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

İstek kabul edilirse CapSkip görev kimliğini döndürür. Ayar kapalıyken, proxy olmadan veya kullanılamayan bir User-Agent ile yapılan bir istek, herhangi bir işlem yapılmadan önce burada, gönderim isteğinin kendisinde reddedilir.

{
    "errorId": 0,
    "errorCode": "",
    "errorDescription": "",
    "taskId": "2122988149"
}
Sonucu Alma

Yaklaşık 5 saniye bekleyin, ardından /getTaskResult uç noktasına görev kimliğiyle bir HTTP POST isteği gönderin. Durum şu olduğu sürece bunu birkaç saniyede bir tekrarlayın: processing. Çoğu sayfa 5 ila 20 saniye içinde geçilir; yavaş bir proxy bu süreyi uzatır.

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

Şunun için hazır yanıt: AntiCloudflareTask. token çerezle aynı değeri taşır:

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

Şunun için hazır yanıt: TurnstileTask ile cloudflareTaskType. İstek kendi User-Agent değerini ( userAgent) gönderdiyse çözüm yalnızca çerezden oluşur, çünkü çerez gönderdiğiniz User-Agent’a bağlıdır. Göndermediyse, userAgent eklenir; böylece hangisini kullanacağınızı bilirsiniz:

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

NextCaptcha yazımı yanıt olarak cf_clearance ve userAgent alanlarını yan yana şu nesnede döndürür: solution.

Çerezi Kullanma

Çerezi siteye yapılan her istekle gönderin ve bunu yaparken şunları kullanın: aynı proxy ve aynı User-Agent. İkisinden birini değiştirirseniz Cloudflare doğrulama sayfasını yeniden gösterir.

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/

Çerez, sitenin kendi Cloudflare ayarlarının izin verdiği süre boyunca geçerlidir; bu süre genellikle 30 dakikadır, bazen çok daha uzundur. Doğrulama sayfası geri geldiğinde yeni bir görev gönderin. Proxy rotasyonu kullanıyorsanız her proxy için bir kez çözün: bir adreste elde edilen çerez başka bir adrese taşınmaz.

Hatalar

Ret yanıtları createTask isteğinde döner. Çözüm hataları ise şurada döner: getTaskResult ile status şuna ayarlı: failed. NextCaptcha seçiliyken kodlar ve HTTP durumları bunun yerine NextCaptcha’nın kendi hata tablosunu izler.

KodAnlamı
ERROR_TASK_NOT_SUPPORTEDcf_clearance çerezlerini döndür CapSkip’te kapalı.
ERROR_PROXY_MISSINGTurnstileTask yazımı: istekte kullanılabilir bir proxy yok.
ERROR_WRONG_USERAGENTTurnstileTask yazımı: User-Agent, CapSkip bilgisayarında yüklü Google Chrome ile aynı ana sürüme sahip Windows için Chrome değil.
ERROR_BAD_PARAMETERSAntiCloudflareTask yazımı: kullanılabilir bir proxy yok veya User-Agent kullanılamıyor. Her iki yazımda da: websiteURL eksik.
ERROR_PAGEURLwebsiteURL tam bir http veya https URL’si değil.
ERROR_PROXY_BANNEDCloudflare proxy adresini doğrudan engelledi. Farklı bir proxy kullanın.
ERROR_PROXY_CONNECT_REFUSEDSayfaya proxy üzerinden ulaşılamadı. Proxy’nin çalıştığını ve giriş bilgilerinin doğru olduğunu kontrol edin.
ERROR_CAPTCHA_UNSOLVABLEZamanında çerez alınamadı veya sayfada hiç Cloudflare doğrulaması gösterilmedi (bu durumdaerrorDescription değeri şöyle olur: “No Cloudflare challenge on this page”). Yeniden denemek için yeni bir görev gönderin.

hcaptcha solver hCaptcha

hCaptcha, birçok kayıt, giriş ve ödeme formunda kullanılan bir CAPTCHA widget’ıdır. Ziyaretçi bir onay kutusunu işaretler, bazen bir resim sorusunu yanıtlar ve ardından widget forma bir token yerleştirir. Site, formu kabul etmeden önce bu token’ı hCaptcha ile doğrular. CapSkip, gönderdiğiniz sitekey ve sayfa için widget’ı geçer ve token’ı formla birlikte gönderilmeye hazır şekilde döndürür. hCaptcha Enterprise ve görünmez widget’lar da aynı yöntemi kullanır.

Nasıl Çalışır
  1. Hedef sayfadaki hCaptcha widget’ının sitekey’ini bulun (aşağıya bakın).
  2. Sitekey’i ve sayfa URL’sini şu adrese gönderin: /in.php ile method=hcaptcha.
  3. Token hazır olana kadar /res.php uç noktasını yoklayın.
  4. Token’ı forma koyun ya da sayfanın callback fonksiyonuna iletin, ardından formu gönderin.

Bir çözüm genellikle 10 ile 30 saniye arasında sürer. Her 5 saniyede bir sorgulayın.

Sitekey’i Bulma

Sitekey herkese açık bir tanımlayıcıdır ve sayfanın her ziyaretçisi için aynıdır. Çoğu sayfa bunu widget kapsayıcısında şu öznitelikte taşır data-sitekey:

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

Sayfa widget’ı bir betikle oluşturuyorsa, sitekey seçeneğini şu çağrıda arayın: hcaptcha.render(), ya da sitekey= parametresini hCaptcha iframe adresinde arayın. Widget’ta data-size="invisible" varsa widget görünmezdir; bu durumda invisible=1 gönderin.

Bazı hCaptcha Enterprise siteleri, widget çalışmadan önce ona ayrıca bir rqdata değeri de iletir. Bunu şu çağrıyla yaparlar: hcaptcha.setData(). Sayfa bunu yapıyorsa, bu değeri dataolarak gönderin. Bu değer site tarafından tek bir challenge için verilir ve hızla geçerliliğini yitirir; bu yüzden her görev için yenisini alın.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
methodDizeEvetOlmalı hcaptcha. hCaptcha gönderdiğinizi belirtir.
sitekeyDizeEvethCaptcha widget’ının sitekey’i.
pageurlDizeEvetWidget’ın bulunduğu sayfanın tam URL’si.
invisibleTam sayı
Varsayılan: 0
Hayır1 görünmez bir widget için.
dataDizeHayırThe rqdata değeri; site bir değer belirlediğinde, hCaptcha Enterprise widget’ı için.
userAgentDizeHayırFormu göndereceğiniz User-Agent. CapSkip bunu yalnızca CapSkip’in çözüm için kullandığı tarayıcıyla eşleştiğinde kullanır. Yanıt her zaman token’ın elde edildiği User-Agent’ı belirtir.
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. Test için ve ara sıra yapılan çözümler için tek bir adres yeterlidir. Bunun ötesinde hCaptcha, token’ın geldiği ağı da tarayıcı kadar puanlar ve tek bir IP’den gelen sürekli bir çözüm akışı, tam da hız sınırlarının ve itibar kontrollerinin yakalamak için tasarlandığı şeydir. Yüksek hacimde şu konumda bir proxy havuzu yapılandırın: Ayarlar, Captcha türleri, hCaptcha, Proxy'leri Yapılandır, ya da çözümün belirli bir ağdan gelmesi gerektiğinde her görevle birlikte bir proxy gönderin. Görevle birlikte gönderilen bir proxy her zaman listeye göre önceliklidir.

CapSkip API uç noktanıza bir HTTP GET veya POST isteği gönderin (/in.php) ile method=hcaptcha. Form alanları, sorgu dizesi ve JSON gövdesi aynı alan adlarıyla kabul edilir.

hCaptcha gönderin:

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

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 takdirde CapSkip, herhangi bir işlem yapılmadan önce doğrudan gönderim isteğinin kendisinde bir hata kodu döndürür:

HataNeden
ERROR_RECAPTCHA_INVALID_SITEKEYsitekey eksik veya boş.
ERROR_PAGEURLpageurl eksik veya bir http veya https adresi değil.
ERROR_PROXY_FORMATproxy değeri okunamadı.

Yaklaşık 10 saniye bekleyin, ardından sonuç uç noktasına bir HTTP GET isteği gönderin (/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"

Widget geçildiyse CapSkip token’ı döndürür:

{
    "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 token'dır. respKey hCaptcha’nın token ile birlikte widget’a verdiği ikinci değerdir; çoğu site bunu hiç okumaz ve boş olabilir. useragent token’ın elde edildiği User-Agent’tır.

İstekte json=1, token düz metin olarak OK| önekinin ardından gelir ve User-Agent X-HCaptcha-User-Agent yanıt başlığında iletilir:

OK|P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.hadwYXNza2V5xQZ2...f3Kq8nV2

Widget henüz geçilmediyse 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ç bir kez teslim edilir. İlk başarılı sorgu token’ı döndürür ve ardından siler; bu yüzden token’ı onu taşıyan yanıttan saklayın.

Çözülemeyen bir görev şunu döndürür: ERROR_CAPTCHA_UNSOLVABLE. İki hata bunun yerine nedenini belirtir, çünkü aynı görevi yeniden göndermek yine başarısız olur: ERROR_RECAPTCHA_INVALID_SITEKEY hCaptcha bu sayfa için sitekey’i reddettiğinde döner; bu durumda sitekey ile birlikte şunu da kontrol edin: pageurl, ve ERROR_PROXY_CONNECT_REFUSED ise proxy’ye ulaşılamadığında döner.

JSON API (createTask)

hCaptcha ayrıca şurada da kabul edilir: /createTask, sonuç ise şuradan okunur: /getTaskResult. Dört görev türü tanınır: HCaptchaTaskProxyless ve HCaptchaEnterpriseTaskProxyless sizin bir proxy’niz olmadan çözülür, HCaptchaTask ve HCaptchaEnterpriseTask ise bir proxy kullanır. Dördü de aynı şekilde çözülür.

ParametreTürGerekliAçıklama
typeDizeEvetYukarıdaki dört görev türünden biri.
websiteURLDizeEvetWidget’ın bulunduğu sayfanın tam URL’si.
websiteKeyDizeEvethCaptcha widget’ının sitekey’i.
isInvisibleBooleanHayırtrue görünmez bir widget için.
enterprisePayloadObjectHayırŞunu taşıyan bir nesne: rqdata, hCaptcha Enterprise için. Düz bir rqdata alanı da kabul edilir.
userAgentDizeHayırŞu yöntemdeki gibi: in.php bölümüne yukarıda bakın.
proxyDizeHayırTek bir dize olarak proxy ya da proxyType, proxyAddress, proxyPort, proxyLogin ve proxyPassword alanları.
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"
    }
}'

Çözüm token’ı iki kez taşır: gRecaptchaResponse ve token, böylece bu iki addan birini bekleyen istemciler token’ı değişiklik yapmadan okur:

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

Başarısız bir görev, şuradakiyle aynı hata kodlarını taşır: res.php ve bunları şu alanda verir: errorCode.

Token'ı Gönderme

Sayfada widget, token’ını form içindeki gizli bir textarea alanına yazar. Alanın adı: h-captcha-response (ve kopyasının adı: g-recaptcha-response). Aldığınız token’ı her iki alana da koyun ve formu gönderin. Widget şu öznitelikle oluşturulduysa: data-callback, bunun yerine widget’ın yapacağı gibi o fonksiyonu token ile çağırın:

document.querySelector('[name="h-captcha-response"]').value = token;
const g = document.querySelector('[name="g-recaptcha-response"]');
if (g) g.value = token;
// ya da widget bir data-callback kullanıyorsa:
window[callbackName](token);

Formu tarayıcı olmadan gönderdiğinizde token’ı h-captcha-response alanı olarak (ve form içeriyorsa g-recaptcha-responsealanı olarak da) yanıttaki User-Agent ile gönderin.

hCaptcha token’ları tek kullanımlıktır ve verildikten yaklaşık iki dakika sonra geçerliliğini yitirir. Her token’ı aldıktan kısa süre sonra gönderin ve her form gönderimi için yeni bir token isteyin.

Katı Sitekey’ler

Bazı siteler, özellikle hCaptcha Enterprise siteleri, widget geçilmiş olsa bile hCaptcha’nın riskli olarak puanladığı token’ları reddeder. Bir site CapSkip’in döndürdüğü token’ları reddediyorsa High score mode for hCaptcha seçeneğini şu konumda açın: Ayarlar, Captcha türleri, hCaptcha. Bu, CapSkip’i çalıştıran bilgisayarda Google Chrome’un yüklü olmasını gerektirir. Ayrıca iyi bir proxy kullanın ve formu aynı adresten, yanıtın belirttiği User-Agent ile gönderin.

aws waf captcha solver AWS WAF CAPTCHA

AWS WAF CAPTCHA, bir sitenin güvenlik duvarı ziyaretçinin insan olduğuna dair kanıt istediğinde Amazon Web Services’in gösterdiği bulmacadır: genellikle “Choose all the curtains” (tüm perdeleri seçin) gibi bir talimatla birlikte dokuz resimden oluşan bir ızgara, bazen de bir yolun sonuna kadar sürülmesi gereken küçük bir oyuncak araba. Bulmacayı geçmek bir aws-waf-token çerezi kazandırır. Korunan sayfadaki değerleri CapSkip’e gönderin; CapSkip bu çereze dönüşen sonucu döndürür.

Nasıl Çalışır

Siteler AWS WAF CAPTCHA’yı iki biçimden birinde kullanır ve bu yöntem ikisini de karşılar:

  • Doğrulama sayfası. Güvenlik duvarı isteğe HTTP durum kodu 405 ve içerik yerine küçük bir sayfa ile yanıt verir. Bu sayfa bir window.gokuProps nesnesi içerir ve challenge.js ve captcha.js dosyalarını bir awswaf.com host’undan yükler.
  • JS-API widget’ı. Sıradan bir sayfa, örneğin bir iletişim ya da indirme formu, jsapi.js yükler ve bulmacayı kendisi şu çağrıyla çizer: AwsWafCaptcha.renderCaptcha.

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

  1. Aşağıda listelenen değerleri korunan sayfadan okuyun.
  2. Bunları şu adrese gönderin: /in.php ile method=amazon_waf.
  3. Token hazır olana kadar /res.php adresini yanıt hazır olana kadar sorgulayın.
  4. Yanıtı aws-waf-token ile takas edin ve siteye gönderdiğiniz isteklerde kullanın.
Doğrulama Sayfasında Değerler Nerede Bulunur

Korunan URL’yi isteyin ve 405 yanıtının gövdesini saklayın ya da sayfayı tarayıcıda açıp şunu kullanın: Sayfa Kaynağını Görüntüle. İhtiyacınız olan her şey HTML içindedir:

<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>
Sayfadaki değerGönderilecek alan
gokuProps.keysitekey. Genellikle şununla başlayan uzun anahtar: AQIDAH. Sitenin güvenlik duvarı yapılandırmasını tanımlar.
gokuProps.iviv. Her doğrulama sayfasında değişir.
gokuProps.contextcontext. Her doğrulama sayfasında şununla birlikte değişir: iv.
challenge.js URL’sichallenge_script. Betiğin tam adresi, şu özniteliğinde göründüğü haliyle: src öznitelik.
captcha.js URL’sicaptcha_script. Betiğin tam adresi, şu özniteliğinde göründüğü haliyle: src öznitelik.

Yalnızca sitekey ve pageurl zorunludur. iv ve context birlikte kullanılır: ikisini de gönderin ya da hiçbirini göndermeyin. Göndermediğiniz her değer çözüm sırasında pageurl adresinden okunur. Sayfa kopyanız birkaç dakikadan eskiyse bu daha güvenli bir seçimdir.

Widget Sayfasında Değerler Nerede Bulunur

Bulmacayı gösteren sayfayı açın ve kaynağında ya da tarayıcı geliştirici araçlarının Network sekmesinde şunları arayın: jsapi.js betiği ve renderCaptcha çağrısına eklenen iki parametre:

<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>
Sayfadaki değerGönderilecek alan
apiKeysitekey. Sonunda kısa bir ek bulunan uzun bir anahtar, örneğin _0_1. Bazı siteler onu HTML yerine ayrı bir JavaScript dosyasında tutar; bu yüzden sayfada yoksa yüklenen betiklerde şunu arayın: apiKey .
jsapi.js URL’sijsapiScript. Betiğin tam adresi, şu özniteliğinde göründüğü haliyle: src öznitelik.

Bir widget sayfasında gokuPropsbulunmaz, bu yüzden iv veya context. Şunu göndermek: jsapiScript bunlar olmadan göndermek, isteği bir widget çözümü olarak işaretler.

Challenge Türleri

Hangi bulmacanın gösterileceğine AWS WAF karar verir. CapSkip’e hangisini bekleyeceğini söylemeniz gerekmez.

ChallengeGörünümDestekleniyorAçıklama
Resim ızgarası3 x 3 kareEvetDokuz resim ve “Choose all the beds” (tüm yatakları seçin) gibi bir talimat; sonunda Şunun: düğmesine basılır. Olağan bulmaca.
Oyuncak arabaTek resimEvetKüçük bir yol haritası üzerindeki oyuncak araba; yolunun sonuna götürülmesi gerekir.

Ara sıra bir bulmaca yanıtlanamaz ve sonuç ERROR_CAPTCHA_UNSOLVABLEolur. Yeni bir görev gönderin: her deneme yeni bir bulmaca getirir.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
methodDizeEvetOlmalı amazon_waf. AWS WAF CAPTCHA gönderdiğinizi belirtir.
sitekeyDizeEvetThe gokuProps.key (doğrulama sayfası) ya da widget’ın apiKey.
pageurlDizeEvetDoğrulamayı gösteren sayfanın tam http veya https URL’si; AWS WAF ile korunan sayfanın adresi.
ivDizeHayırThe gokuProps.iv (doğrulama sayfası). Şununla birlikte gönderin: contextya da ikisini de göndermeyin.
contextDizeHayırThe gokuProps.context (doğrulama sayfası). Şununla birlikte gönderin: ivya da ikisini de göndermeyin.
challenge_scriptDizeHayırSayfanın betiğinin tam URL’si: challenge.js.
captcha_scriptDizeHayırSayfanın betiğinin tam URL’si: captcha.js.
jsapiScriptDizeHayırYalnızca widget sayfaları: şunun tam URL’si: jsapi.js.
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. SOCKS4 kabul edilmez.
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.

Gönderdiğiniz her betik URL’si bir awswaf.com host’unu göstermelidir. Başka bir yerden gelen betik reddedilir, çünkü bir AWS WAF entegrasyonu değildir.

Proxy'ler

CapSkip bu yöntem için proxy zorunlu kılmaz; test ve ara sıra yapılan çözümler için tek bir adres yeterlidir. Bunun ötesinde proxy gerekir. AWS WAF ile korunan siteler CAPTCHA’yı genellikle hız sınırları ve IP itibar kurallarıyla birlikte kullanır; bu yüzden tek bir adresten gelen sürekli çözüm akışı kısa sürede daha sert bir muameleyle, ardından doğrudan engellemeyle karşılaşır. CapSkip’in Ayarlar bölümünde AWS WAF için bir proxy listesi yapılandırın ve yükü dağıtmasına izin verin ya da token belirli bir ağdan gelmek zorundaysa istek başına bir proxy gönderin.

Görev Gönderme

Bir HTTP POST isteğini CapSkip API endpoint’inize gönderin (/in.php) ile method=amazon_waf. Form alanları, JSON gövdesi ve GET sorgu dizesi aynı alan adlarıyla kabul edilir. Anahtarlar +, / ve =içerdiğinden form alanı olarak gönderirken bunları URL kodlamasıyla gönderin.

Doğrulama sayfası gönderme:

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

Widget sayfası gönderme (JSON gövdesi):

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

Her şey doğruysa CapSkip, CAPTCHA ID'sini düz metin olarak döndürür: OK|2122988149. json=1gönderildiğinde yanıt bunun yerine JSON biçiminde gelir:

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

Eksik bir sitekey, kullanılamaz bir pageurl, iv şu alan olmadan: context (ya da tersi) ve hatalı biçimlendirilmiş bir proxy, daha hiçbir işlem başlamadan bu istekte reddedilir.

Sonucu Alma

Yaklaşık 5 saniye bekleyin, ardından CAPTCHA ID ile /res.php adresine bir HTTP GET isteği gönderin. Yanıt şu olduğu sürece her 5 saniyede bir tekrarlayın: CAPCHA_NOT_READY. Görevlerin çoğu 15 saniye içinde hazır olur; yavaş bir proxy bu süreyi uzatır.

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"

Yanıt iki değerden oluşur, bu yüzden request bir dize değil bir nesnedir:

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

İstekte json=1olmadan aynı nesne OK| ardından tek satırda gelir:

OK|{"captcha_voucher":"eyJ2b3VjaGVyIjoiRVhBTVBMRSJ9.9QwZcEXAMPLEvoucherJk4LmN0pQ","existing_token":"7d4c2a91-EXAMPLE-4f0b-9e6d-3a1b5c8e2f70:EQoAeXAMPLEtokenAAAA:Wm9wc2E="}
AlanAnlamı
captcha_voucherBulmacanın yanıtlandığına dair AWS WAF kanıtı.
existing_tokenVoucher’ın verildiği token. İkisi yalnızca birlikte çalışır.

Görev başarısız olursa /res.php şunu döndürür: ERROR_CAPTCHA_UNSOLVABLEya da CapSkip’te yapılandırılmış yedek hata metni. Yeniden denemek için yeni bir görev gönderin.

Voucher’ı Çereze Dönüştürme

AWS WAF bu çifti kendi token host’unda nihai aws-waf-token ile takas eder: yani challenge.js dosyasının yüklendiği host ve klasörde. Bir widget sayfasında bu challenge.js isteğini Network sekmesinde bulun; jsapi.js onu sizin için yükler. Adresteki challenge.js ile voucher olarak değiştirin ve çifti JSON olarak POST edin:

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

Yanıt bir JSON nesnesidir ve token alanı aws-waf-tokendeğerini içerir. Voucher’ı daha sonra kullanmak üzere saklamak yerine gelir gelmez değiştirin.

Token’ı Kullanma

Token’ı korunan alan adında aws-waf-token çerezi olarak gönderin ve engellenen isteği tekrarlayın. Site artık 405 sayfası yerine gerçek içeriğiyle yanıt verir:

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

Bir widget sayfasında bu, sayfanın onSuccess callback’inin aldığı token’ın aynısıdır. Bu tür sayfaların çoğu onu aws-waf-token çerezi olarak, bazıları ise x-aws-waf-token istek başlığında iletir; bu yüzden sayfanın kendi isteğinin ne gönderdiğine bakın ve aynısını yapın.

Token, sitenin immunity time (bağışıklık süresi) boyunca geçerlidir; AWS WAF bunu varsayılan olarak 5 dakikaya ayarlar ve site sahipleri uzatabilir. Doğrulama yeniden çıktığında yeni bir görev gönderin.

JSON API

JSON createTask / getTaskResult API’si de AWS WAF’ı şu türlerle kabul eder: AmazonTask / AmazonTaskProxyless ve AntiAwsWafTask / AntiAwsWafTaskProxyLess; alan adları ve sonuç biçimi, CapSkip’in taklit ettiği hizmetinkilerle aynıdır. Bu biçimlerin birkaçı nihai aws-waf-token değerini doğrudan döndürür, böylece değiştirilecek bir voucher kalmaz. NextCaptcha veya EzCaptcha seçili hizmet olduğunda kullanılamazlar.

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
Parametre Tür Gerekli Açıklama
key Dize Evet* CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
method Dize Evet Olmalı geetest. Bir GeeTest v3 CAPTCHA'sı gönderdiğinizi belirtir.
gt Dize Evet The gt hedef web sitesinden elde edilen değer.
challenge Dize Evet The challenge hedef web sitesinden elde edilen değer. Her çözüm isteği için yeni bir değer elde edilmelidir.
pageurl Dize Evet GeeTest CAPTCHA'sını içeren sayfanın tam URL'si.
api_server Dize Hayır Hedef web sitesi tarafından kullanılan GeeTest API sunucu alan adı (örneğin api.geetest.com veya api-na.geetest.com).
json Tam sayı
Varsayılan: 0
Hayır 0 yanıtı düz metin olarak döndürür. 1 yanıtı JSON olarak döndürür.
proxy Dize Hayır Proxy 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.
proxytype Dize Hayır Proxy 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
Parametre Tür Gerekli Açıklama
key Dize Evet* CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
action Dize Evet Belirtin get CAPTCHA çözümünü almak için.
id Tam sayı Evet Şunun tarafından döndürülen CAPTCHA ID'si: in.php istek.
json Tam sayı
Varsayılan: 0
Hayır 0 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.

Parametre Ne zaman kullanılır
challenge_json Challenge belgesi zaten elinizdedir. CapSkip bunu yerel olarak çözer ve hiçbir ağ isteği yapmaz; bu da en hızlı yoldur.
challenge_url Elinizde 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
Parametre Tür Gerekli Açıklama
key Dize Evet* CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
method Dize Evet Olmalı altcha. Bir ALTCHA challenge'ı gönderdiğinizi belirtir.
pageurl Dize Evet Challenge'ın alındığı sayfanın tam URL'si.
challenge_url Dize Evet* CapSkip'in challenge'ı alacağı uç nokta. challenge_json gönderilmediği sürece zorunludur.
challenge_json Dize Evet* Challenge belgesinin kendisi, JSON dizesi olarak. challenge_url gönderilmediği sürece zorunludur.
proxy Dize Hayır Proxy 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.
proxytype Dize Hayır Proxy türü: HTTP, HTTPS, SOCKS5 veya SOCKS5H.
json Tam sayı
Varsayılan: 0
Hayır 0 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
Parametre Tür Gerekli Açıklama
key Dize Evet* CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
action Dize Evet Belirtin get CAPTCHA çözümünü almak için.
id Tam sayı Evet Şunun tarafından döndürülen CAPTCHA ID'si: in.php istek.
json Tam sayı
Varsayılan: 0
Hayır 0 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-urlencoded

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

Şema Nesil Destekleniyor Açıklama
Legacy PoW v1 Evet Ş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.
PBKDF2 PoW v2 Evet Tü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.
SHA PoW v2 Evet Aynı şemanın yinelemeli hash türevi.
Argon2id PoW v2 Hayır Bellek yoğun (memory hard) bir anahtar türetme fonksiyonu. Denenmek yerine reddedilir.
scrypt PoW v2 Hayır Bellek 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. Bunun yerine sonuçla birlikte dönen userAgent değerini kullanın.
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",
        "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 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>.

Çözüm bir tarayıcı User-Agent'ı bildirdiğinde, bu değer şu adla döner: userAgent, hem en üst düzeyde hem de şunun içinde: solution. Düz metin modunda bunu X-CaptchaFox-User-Agent yanıt header'ından okuyun. Token'ı gönderirken bu User-Agent'ı gönderin.

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

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

datadome solver DataDome

DataDome, birçok büyük mağazanın, haber sitesinin ve pazar yerinin arkasındaki bot korumasıdır. Bir ziyaretçiden şüphelendiğinde site, içeriği yerine bir engelleme sayfası döndürür ve bu sayfada bir kaydırıcı ya da kısa bir cihaz kontrolü bulunur. Bu kontrol geçildiğinde bir datadome çerezi ayarlanır ve bu çerezi taşıyan isteklerin geçişine izin verilir. CapSkip gönderdiğiniz doğrulamayı geçer ve çerezi döndürür; böylece kendi tarayıcısı olmayan bir betik siteden veri çekmeye devam edebilir.

Nasıl Çalışır

Engellenen bir istek şu durum koduyla döner: 403 (bazen 401), yanında da küçük bir HTML sayfası gelir. Bu sayfa bir betik nesnesi, var dd={...}, içerir ve doğrulamayı şu adresteki bir iframe içinde yükler: geo.captcha-delivery.com. CapSkip’in ihtiyaç duyduğu şey iframe adresidir ve bu adres şöyle adlandırılır: captcha_url bölümüne bakın.

DataDome iki tür doğrulama gösterir ve CapSkip her ikisini de bu tek yöntemle işler:

  • Kaydırıcı. Burada iframe yolu /captcha/ olur ve ziyaretçi bir kaydırıcıyı sürükler, bazen de bir yapboz parçasını yerine oturtur.
  • Cihaz kontrolü. Burada iframe yolu /interstitial/ olur ve sayfada birkaç saniye boyunca “Verifying the device” yazısı görünür. Kontrol karşılanmadığında DataDome bir kaydırıcıya geçer ve CapSkip de onu izler.

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

  1. Hedef sayfayı isteyin ve DataDome engelleme sayfasını alın.
  2. O sayfadan captcha_url değerini oluşturun (aşağıya bakın) ve şuraya gönderin: /in.php ile method=datadome.
  3. Token hazır olana kadar /res.php çerez hazır olana kadar.
  4. İsteğinizi çerezle, aynı User-Agent ile ve aynı IP adresinden tekrarlayın.

Bir çözüm genellikle 3 ile 20 saniye arasında sürer. Cihaz kontrolleri bu aralığın kısa ucunda, kaydırıcılar ise uzun ucunda yer alır.

Çerez Tek Bir IP’ye ve Tek Bir Tarayıcıya Aittir

DataDome çerezi, onu kazanan IP adresine ve User-Agent’a bağlar. Farklı bir adresten veya farklı bir User-Agent ile yeniden kullanılan bir çerez genellikle reddedilir ve engelleme sayfası geri gelir. Bundan iki kural çıkar:

  • Çözüm, çerezi kullanacağınız adresten gelmelidir. İstekleriniz bir proxy üzerinden çıkıyorsa, o proxy’yi görevle birlikte gönderin. İstekleriniz CapSkip’in çalıştığı bilgisayardan çıkıyorsa proxy göndermeyin.
  • Kullanacağınız User-Agent’ı gönderin. Bu, CapSkip’in çözmek için kullandığı tarayıcı ile aynı ana sürüme sahip, Windows için Chrome olmalıdır. Başka herhangi bir User-Agent sitenin reddedeceği bir çerez üretir, bu yüzden en baştan şu hatayla reddedilir: ERROR_WRONG_USERAGENT. Firefox, Safari, Edge ve mobil User-Agent’lar da aynı nedenle reddedilir.

Engelleme sayfasının kendisi adresin yasaklandığını söylediğinde, o adresten gönderilen hiçbir şey geçemez; bu yüzden görev hemen ERROR_PROXY_BANNED hatasıyla, hiç denenmeden reddedilir. Bunu önceden fark edebilirsiniz: dd nesnesi şunu içerir: 't':'bv' yerine 't':'fe'. Adresi değiştirin ve sayfayı yeniden isteyin.

captcha_url Değerini Oluşturma

Aldığınız engelleme sayfası iframe’i zaten içeriyorsa, iframe’in src özniteliğini olduğu gibi alın. Çoğu engelleme sayfası ise iframe’i bir betikle oluşturur; bu durumda aynı adresi dd nesnesinden siz oluşturursunuz. Bir engelleme sayfası şöyle görünür:

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

Şunun değeri: rt yolu belirler: c göndermezseniz https://geo.captcha-delivery.com/captcha/ ve i göndermezseniz https://geo.captcha-delivery.com/interstitial/. Sorgu dizesi diğer alanlardan oluşturulur:

URL parametresiDeğer
initialCidThe cid alanı.
hashThe hsh alanı.
cidThe cookie alanı.
tThe t alanı. Yalnızca /captcha/ yolunda bulunur.
refererİstediğiniz sayfanın URL’si.
sThe s alanı.
eThe e alanı, varsa.
bThe b alanı. Yalnızca /interstitial/ yolunda bulunur.
dmHer zaman cd.

Her değere URL kodlaması uygulayın. JavaScript’te:

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}`;

Her engelleme sayfası yeni bir doğrulamadır. Aldıktan kısa süre sonra gönderin ve bir sonraki görev için sayfayı yeniden isteyin; eski bir değeri yeniden kullanmayın: captcha_url.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
methodDizeEvetOlmalı datadome. Bir DataDome doğrulaması gönderdiğinizi belirtir.
captcha_urlDizeEvetDoğrulama iframe’inin şu alan adındaki adresi: geo.captcha-delivery.com. Aşağıdaki captcha_url Değerini Oluşturma bölümüne yukarıda bakın.
pageurlDizeEvetEngelleme sayfasını döndüren sayfanın tam URL’si.
userAgentDizeHayırÇerezle birlikte göndereceğiniz User-Agent: Windows için Chrome, CapSkip’in çözmek için kullandığı tarayıcı ile aynı ana sürüm. Göndermezseniz CapSkip o tarayıcının User-Agent’ını kullanır ve yanıt bunu belirtir, böylece olduğu gibi kopyalayabilirsiniz.
proxyDizeHayırProxy adresi. Şu biçimleri kabul eder: IP:PORT, LOGIN:PASSWORD@IP:PORT veya IP:PORT:LOGIN:PASSWORD. Sonraki isteklerinizin kullanacağı proxy’yi gönderin.
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. Test için ve ara sıra yapılan çözümler için tek bir adres yeterlidir. Bunun ötesinde DataDome adresi en az tarayıcı kadar puanlar ve tek bir IP’den gelen sürekli bir engelleme sayfası akışı, o IP’nin sitede yasaklanmasıyla sonuçlanır. Yüksek hacimde isteklerinizi ve görevlerinizi, görev başına bir proxy olacak şekilde bir residential proxy havuzu üzerinden gönderin ve her çerezi onu kazanan proxy üzerinden kullanın. Aynı çıkış IP’sini en az birkaç dakika koruyan sticky proxy’ler kullanın. Her bağlantıda IP’sini değiştiren bir proxy çalışan bir çerez üretemez: challenge birkaç farklı adresten yüklenir ve çerez bir sonraki adreste reddedilir.

CapSkip’in ayrıca kendine ait bir DataDome proxy listesi de vardır; şu konumda bulunur: Ayarlar, Captcha türleri, DataDome, Proxy'leri Yapılandır. Proxy olmadan gönderilen görevler bu liste üzerinden çözülür. Çerezi taşıyan istekler de aynı proxy’ler üzerinden gitmiyorsa listeyi boş bırakın, çünkü çerez yalnızca onu çözen adresten çalışır. Yanıt, her görevin kullandığı proxy’yi belirtir. Görevle birlikte gönderilen bir proxy her zaman listeye göre önceliklidir.

CapSkip API uç noktanıza bir HTTP GET veya POST isteği gönderin (/in.php) ile method=datadome. Form alanları, sorgu dizesi ve JSON gövdesi aynı alan adlarıyla kabul edilir.

DataDome gönderimi:

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

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 takdirde CapSkip, herhangi bir işlem yapılmadan önce doğrudan gönderim isteğinin kendisinde bir hata kodu döndürür:

HataNeden
ERROR_BAD_PARAMETERScaptcha_url eksik veya bir DataDome doğrulama adresi değil.
ERROR_PAGEURLpageurl eksik veya bir http veya https adresi değil.
ERROR_WRONG_USERAGENTUser-Agent, CapSkip’in çözümde kullandığı ana sürüme sahip Windows için Chrome değil.
ERROR_PROXY_BANNEDEngelleme sayfası bu adresin yasaklandığını söylüyor (t=bv).
ERROR_PROXY_FORMATproxy değeri okunamadı.

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"

Doğrulama geçildiyse CapSkip, çerezi öznitelikleri dahil tam olarak DataDome’un ayarladığı şekilde döndürür:

{
    "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 , çerezin kazanıldığı User-Agent’tır: gönderdiğiniz ya da göndermediğinizde CapSkip’in kullandığı. Çerezi taşıyan her istekle birlikte gönderin.

proxy yalnızca göreviniz proxy göndermediğinde ve CapSkip DataDome proxy listesinden bir proxy aldığında görünür. Bu, o proxy’nin host:portbiçimidir, giriş bilgileri olmadan, ve çerez yalnızca onun üzerinden çalışır. Görev kendi proxy’sini gönderdiyse ya da CapSkip proxy olmadan çözdüyse alan yer almaz.

İstekte json=1, çerez düz metin olarak OK| önekinden sonra gelir ve aynı iki değer X-DataDome-User-Agent ve X-DataDome-Proxy yanıt başlıklarında gelir:

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

Doğrulama henüz geçilmediyse 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ç bir kez teslim edilir. İlk başarılı sorgu çerezi döndürür ve ardından siler; bu yüzden çerezi, onu taşıyan yanıttan alıp saklayın.

Geçilemeyen bir görev şunu döndürür: ERROR_CAPTCHA_UNSOLVABLE. İki hata ise bunun yerine adresi işaret eder, çünkü aynı adres üzerinden yeniden göndermek yine başarısız olur: ERROR_PROXY_BANNED DataDome çözüm sırasında adresi yasakladığında döner, ERROR_PROXY_CONNECT_REFUSED ise proxy’ye ulaşılamadığında döner.

Çerezi Kullanma

İlk noktalı virgülden önceki kısım çerezin kendisidir. Bunu bir sonraki isteğinizle, aynı proxy üzerinden ve görevde gönderdiğiniz aynı User-Agent ile gönderin:

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"

Bir çerez deposu (cookie jar) kullanıyorsanız, bunun yerine dizenin tamamını saklayabilirsiniz: Domain, Path ve Max-Age DataDome’un site için seçtiği değerlerdir.

DataDome sonraki yanıtlarda yerine geçecek yeni bir datadome çerezi gönderebilir. Tıpkı bir tarayıcının yapacağı gibi en yenisini saklayın. Engelleme sayfası yine de geri gelirse site yeniden doğrulama istemeye karar vermiştir: bu sayfadan yeni bir captcha_url değeri oluşturun ve yeni bir görev gönderin.

mtcaptcha solver MTCaptcha

MTCaptcha, giriş, kayıt ve iletişim formlarında kullanılan metin tabanlı bir CAPTCHA’dır. Ziyaretçi bir resimde gösterilen bozuk karakterleri yazar ve widget forma doğrulanmış bir token ekler. CapSkip, gönderdiğiniz sitekey ve sayfa adresini alır ve formla birlikte gönderilmeye hazır, geçerli bir MTCaptcha token’ı döndürür.

Nasıl Çalışır

MTCaptcha widget’ı sayfada şu önekle başlayan bir sitekey ile yapılandırılır: MTPublic-. Ziyaretçi doğrulamayı geçtiğinde MTCaptcha şununla başlayan bir token verir: v1( ve widget bunu şu adlı gizli bir form alanına yazar: mtcaptcha-verifiedtoken. Form geldiğinde site bu token’ı MTCaptcha ile doğrular.

CapSkip’in yalnızca sitekey ve sayfa adresine ihtiyacı vardır. Widget’ı kendiniz yüklemeniz veya çözmeniz gerekmez: tarayıcınızda görünen resim hiçbir zaman gönderilmez ve CapSkip’in döndürdüğü token tek başına kabul edilir. Tüm döngü üç adımdan oluşur:

  1. Sitekey ve sayfa URL’sini şu adrese gönderin: /in.php ile method=mt_captcha.
  2. Token hazır olana kadar /res.php uç noktasını yoklayın.
  3. Formu, token şu alanda olacak şekilde gönderin: mtcaptcha-verifiedtoken.
Sitekey’i Bulma

Çoğu sayfa widget’ı sayfa kaynağındaki bir mtcaptchaConfig nesnesiyle yapılandırır:

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

Sitekey’i göründüğü gibi kopyalayın. Nesne ayrıca action değerini de ayarlıyorsa onu da gönderin. Widget zaten ekrandaysa aynı sitekey, iframe’inin şu alan adındaki adresinde de bulunur: service.mtcaptcha.com, sorgu dizesinde şu adla: sitekey.

POST İstek Parametrelerinin Listesi
ParametreTürGerekliAçıklama
keyDizeEvet*CapSkip API key'iniz. Yalnızca şu durumda gereklidir: API Anahtarı Doğrulama etkindir.
methodDizeEvetOlmalı mt_captcha. Bir MTCaptcha doğrulaması gönderdiğinizi belirtir. mtcaptcha de kabul edilir.
sitekeyDizeEvetSayfadaki MTCaptcha sitekey’i, şununla başlar: MTPublic-.
pageurlDizeEvetWidget’ın bulunduğu sayfanın tam URL’si. MTCaptcha yalnızca sitekey’in kayıtlı olduğu alan adları için token verir, bu yüzden gerçek sayfa adresini gönderin.
actionDizeHayırSayfanın kendi mtcaptchaConfig nesnesinde ayarladığı action adı (ayarlanmışsa).
userAgentDizeHayırMTCaptcha’ya gönderilecek User-Agent. Göndermezseniz CapSkip, Windows için Chrome User-Agent’ı 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, SOCKS4, 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. Test ve ara sıra yapılan çözümler için tek bir adres yeterlidir. Bunun ötesinde bir proxy havuzu yapılandırın: her çözüm MTCaptcha hizmetinden yeni doğrulamalar ister ve tek bir adresten gelen sürekli istek akışı, hız sınırlamanın yakalamak için tasarlandığı şeydir. Havuzu şuraya ekleyin: Ayarlar, Captcha türleri, MTCaptcha, Proxy'leri Yapılandır; proxy olmadan gönderilen görevler bu havuza dağıtılır. Çözümün belirli bir ağdan gelmesi gerektiğinde görevle birlikte proxy gönderin. Görevle gönderilen proxy her zaman listeye göre önceliklidir.

CapSkip API uç noktanıza bir HTTP GET veya POST isteği gönderin (/in.php) ile method=mt_captcha. Form alanları, sorgu dizesi ve JSON gövdesi aynı alan adlarıyla kabul edilir.

MTCaptcha gönderin:

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

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 takdirde CapSkip, herhangi bir işlem yapılmadan önce doğrudan gönderim isteğinin kendisinde bir hata kodu döndürür:

HataNeden
ERROR_BAD_PARAMETERSsitekey eksik veya bir MTCaptcha sitekey’i değil (MTPublic- ardından harfler, rakamlar, - veya _).
ERROR_PAGEURLpageurl eksik veya bir http veya https adresi değil.
ERROR_PROXY_FORMATproxy değeri okunamadı.

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"

Doğrulama geçildiyse CapSkip MTCaptcha token’ını döndürür:

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

İstekte json=1, token düz metin olarak OK| önekinden sonra gelir:

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

Doğrulama henüz geçilmediyse 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ç bir kez teslim edilir. İlk başarılı sorgu token’ı döndürür ve ardından siler; bu yüzden token’ı onu taşıyan yanıttan saklayın.

Geçilemeyen bir görev şunu döndürür: ERROR_CAPTCHA_UNSOLVABLE. İki hata ise görevin kendisini belirtir, çünkü görevi değiştirmeden yeniden göndermek yine başarısız olur: ERROR_RECAPTCHA_INVALID_SITEKEY , MTCaptcha sitekey’i tanımadığında ve ERROR_RECAPTCHA_INVALID_DOMAIN , sitekey’e şu alan adında izin verilmediğinde: pageurl. Her iki kod da tarihsel adlarını korur ve tüm yöntemler için geçerlidir.

Token'ı Gönderme

Token’ı şu form alanına koyun: mtcaptcha-verifiedtoken ve formu sayfanın yapacağı gibi gönderin. Formu kendiniz gönderiyorsanız:

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

Kontrol ettiğiniz bir tarayıcıda, form gönderilmeden önce gizli alanı ayarlayın:

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

Token kısa ömürlü ve tek kullanımlıktır: MTCaptcha onu yalnızca bir kez ve verildikten sonraki birkaç dakika içinde kabul eder. Geldiği anda kullanın ve her form gönderimi için yenisini isteyin. Site, token’ı kendi sunucusunda MTCaptcha’nın checktoken çağrısıyla doğrular; bu çağrı sitekey’i ve alan adını kontrol eder, bu yüzden bir token yalnızca istendiği sitede geçerlidir.

Proxy Kullanımı

reCAPTCHA v2, v3, Invisible, Enterprise, Cloudflare, GeeTest, ALTCHA, CaptchaFox, Capy Puzzle ve Friendly Captcha 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
Parametre Tür Gerekli Açıklama
proxy Dize Hayır Proxy 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
proxytype Dize Hayır Proxy 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ı.
ERROR_TASK_NOT_SUPPORTEDGörev türü desteklenmiyor veya ilgili ayar CapSkip’te kapalı.
ERROR_PROXY_MISSINGGörev bir proxy gerektiriyor ve istekte kullanılabilir bir proxy yok.
ERROR_WRONG_USERAGENTİstekteki User-Agent bu görev için kullanılamaz.
ERROR_PROXY_BANNEDHedef site proxy adresini engelledi. Farklı bir proxy kullanın.
ERROR_PROXY_CONNECT_REFUSEDHedefe proxy üzerinden ulaşılamadı.
ERROR_RECAPTCHA_INVALID_SITEKEYThe sitekey eksik veya CAPTCHA hizmeti bunu bu sayfa için reddetti.
ERROR_RECAPTCHA_INVALID_SITEKEYCAPTCHA sağlayıcısı sitekey’i tanımıyor. Gönderdiğiniz sitekey değerini kontrol edin.
ERROR_RECAPTCHA_INVALID_DOMAINSitekey’e şu alan adında izin verilmiyor: pageurl. Widget’ın gerçekten bulunduğu sayfanın adresini gönderin.
CAPCHA_NOT_READYcaptcha hâlâ işleniyor. Sorgulamaya devam edin.
(boş yanıt)Sonuç zaten alınmış veya ID mevcut değil.