Node.js ve fetch ile DataDome CAPTCHA Nasıl Çözülür

datadome captcha in node.js - How to Pass DataDome CAPTCHA in Node.js With fetch

Node.js’te bir DataDome CAPTCHA’sını çözmek için 403 engelleme sayfasını okuyup, ondan challenge adresini oluşturup, bu adresi CapSkip DataDome çözücüsü üzerinden dataDome() ile gönderip, döndürdüğü çerezle isteğinizi yinelersiniz. Yanıt bir çerezdir, bir form için token değildir ve CapSkip belgeleri, çerezin genellikle yalnızca kazanıldığı User-Agent ve IP adresiyle çalıştığını söyler. Bu rehber, bütün döngüyü CapSkip Node.js SDK ve fetch ile yaklaşık 100 satırda çalıştırır. CapSkip, çözüm başına ücret olmadan kendi Windows bilgisayarınızda çalışır; bu yüzden bir yeniden denemenin çözüm ücreti yoktur.

Neye ihtiyacınız var

  • Bir Windows bilgisayarında çalışan CapSkip 3.2.0 veya üzeri. Bu sürüm, kaydırıcı ve cihaz kontrolü için DataDome çözme desteğini ekledi. İlk başlatmayı kurulum kılavuzu adım adım anlatır.
  • Node.js ve capskip paketinin 1.5.0 veya üzeri sürümü. Daha eski sürümlerde dataDome metodu yoktur. Paket Node.js 18 veya üzerini şart koşar. Kodu yalnızca Node.js 24.22.0 üzerinde, capskip 1.5.0 ve undici 8.12.3 ile çalıştırdım, bu yüzden Node.js 18 burada denenmedi. undici 8 paketi Node.js 22.19 veya üzerini şart koşar. Bildirdikleri engines alanlarına göre undici 7, Node.js 20.18.1 veya üzerini, undici 6 ise Node.js 18.17 veya üzerini gerektirir; yani daha eski bir Node.js için daha eski bir undici gerekir. İkisini de çalıştırmadım.
  • node ve npm komutlarının çalıştığı bir komut istemi.
  • Sahibi olduğunuz ya da otomatikleştirmenize izin verilen, DataDome arkasındaki bir sayfa.
  • Çözücü için bir adres. Local modunda CapSkip 127.0.0.1 üzerinden yalnızca o cihaza yanıt verir. Server modunda ağ adresinizi veya genel IP’nizi dinler, böylece başka bir bilgisayardaki, bir VPS’teki veya barındırılan bir platformdaki script API üzerinden ona erişebilir. İkisi de şurada ayarlanır: bağlantı ayarları.
  • Test aşamasını geçtiğinizde görev başına sabit IP’li (sticky) bir proxy. Çerez, onu kazanan IP adresine bağlıdır; bunu 3. Adım açıklar.

İki paketi npm install capskip undici ile kurun. Node.js, fetch ile birlikte gelir ama istek başına proxy seçeneği yoktur. undici paketi bunu ProxyAgent ile ekler, bu yüzden kod fetch’i de undici’den içe aktarır. undici 8.12.3 ProxyAgent’ını Node.js 24.22.0 ile gelen fetch’e vermek benim kurulumumda fetch failed hatasıyla başarısız oldu; nedeni invalid onRequestStart method idi (hata kodu UND_ERR_INVALID_ARG), çünkü o Node.js undici 7.29.1 içerir. İkisini de aynı paketten almak bu uyumsuzluğu önler.

Nasıl test edildi: kod, gerçek bir DataDome sitesine karşı değil, benim yazdığım üç sahte (mock) sunucuya karşı çalıştırıldı. Birincisi CapSkip API belgeleri içindeki DataDome bölümünde listelenen denetimleri kopyalar; ikincisi 403 engelleme sayfası veren ve yalnızca CapSkip’in verdiği bir çerezi, verildiği User-Agent ile birlikte kabul eden korumalı bir sitenin, üçüncüsü ise bir forward proxy’nin yerini tutar. SDK, gerçek capskip 1.5.0 idi. CapSkip uygulaması bilgisayarımda çalışıyordu ama her script mock’lara yöneltilmişti, bu yüzden uygulama hiçbir şey çözmedi. Buradaki hiçbir şey gerçek bir çözümün ne kadar sürdüğünü ya da canlı bir DataDome sitesinin neyi kabul ettiğini göstermez. Engelleme sayfası ayrıştırması yalnızca CapSkip belgelerindeki biçimi kopyalayan sayfalarda denendi. Proxy yolu, düz istekleri bir http sitesine ileten bir http proxy ile test edildi. Bir https sitesinin proxy üzerinden ihtiyaç duyduğu tünel test edilmedi, bir https proxy de edilmedi. Çerezle ilgili kurallar CapSkip belgelerinden gelir. DataDome’nin kendi çerez belgeleri datadome çerezinin bir yıl geçerli olduğunu söyler ve Domain ya da Path değerinin değiştirilmesine karşı uyarır. Çerezin neye bağlı olduğunu söylemez.

1. Adım: engelleme sayfasını okuyun ve captcha_url adresini oluşturun

Bu bloğu ve sonraki üçünü, gösterilen sırayla, datadome-demo.js adlı tek bir dosyaya koyun. 4. Adım’a kadar hiçbir şey çalışmaz.

DataDome bir isteğe şüpheyle yaklaştığında site, içerik yerine 403 durumuyla (bazen 401) ve küçük bir HTML sayfasıyla yanıt verir. Bu sayfa dd adlı bir script nesnesi barındırır ve challenge’ı geo.captcha-delivery.com üzerinden bir iframe içinde yükler. CapSkip’in ihtiyaç duyduğu şey iframe adresidir ve belgeler ona captchaUrl der. Sayfada iframe zaten varsa src değerini olduğu gibi alabilirsiniz. Çoğu engelleme sayfası iframe’i bunun yerine bir script ile oluşturur; bu yüzden aşağıdaki fonksiyon aynı adresi dd nesnesinden derler.

rt değeri yolu belirler. c harfi /captcha/ altındaki kaydırıcı, i harfi ise /interstitial/ altındaki cihaz kontrolü anlamına gelir. t değeri de önemlidir: fe değeri bir challenge’ı, bv değeri ise sayfayı çeken IP adresini DataDome’nin yasakladığını gösterir. İlk istek sade bir Chrome User-Agent ile gider. Bu dize CapSkip’e hiç gönderilmez, bu yüzden Chrome sürümünün hiçbir şeyle eşleşmesi gerekmez. Canlı bir DataDome sitesinin farklı bir User-Agent’a aynı challenge’ı verip vermediğini test etmedim, bu yüzden o kısmı denenmemiş sayın.

get fonksiyonu döndürmeden önce gövdenin tamamını okur, bu yüzden hiçbir bağlantı beklemede kalmaz. Ona bir proxy adresi verirseniz isteği undici’nin ProxyAgent’ı üzerinden gönderir; ProxyAgent bir http ya da https proxy kabul eder. Bir SOCKS proxy denemedim.

// npm install capskip undici
const { fetch, ProxyAgent } = require("undici");

const PAGE_URL = "https://www.example.com/"; // a page behind DataDome
const BROWSER = { // for the first request only; the cookie comes with its own User-Agent
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
    + "(KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
};

const agents = new Map(); // one ProxyAgent per proxy, so sockets are reused

async function get(headers, proxyUrl) {
  const options = { headers };
  if (proxyUrl) {
    if (!agents.has(proxyUrl)) agents.set(proxyUrl, new ProxyAgent(proxyUrl));
    options.dispatcher = agents.get(proxyUrl);
  }
  const resp = await fetch(PAGE_URL, options);
  return { status: resp.status, text: await resp.text(), setCookies: resp.headers.getSetCookie() };
}

// Build the challenge address from a DataDome block page, or null.
function captchaUrlFrom(page) {
  if (![401, 403].includes(page.status)) return null;
  const found = page.text.match(/var\s+dd\s*=\s*(\{[^}]*\})/);
  if (!found) return null;
  const dd = JSON.parse(found[1].replace(/'/g, "\""));
  const path = dd.rt === "i" ? "interstitial" : "captcha";
  const query = new URLSearchParams({ initialCid: dd.cid, hash: dd.hsh, cid: dd.cookie });
  if (dd.t) query.set("t", dd.t); // fe is a challenge, bv means the address is banned
  query.set("referer", PAGE_URL);
  query.set("s", String(dd.s));
  for (const key of ["e", "b"]) {
    if (dd[key]) query.set(key, String(dd[key]));
  }
  query.set("dm", "cd");
  return `https://${dd.host || "geo.captcha-delivery.com"}/${path}/?${query}`;
}

Fonksiyon, engelleme sayfası olmayan her yanıt için null döndürür; böylece bir script “çözülecek bir şey yok” ile “çözüldü” durumunu ayırt edebilir. Koddaki yer tutucu adres gibi DataDome arkasında olmayan bir sayfa yalnızca 200 yazdırır. Her engelleme sayfası yeni bir challenge getirir. captchaUrl değerini hemen kullanın ve sonraki görev için eski bir adresi yeniden kullanmak yerine sayfayı yeniden isteyin.

2. Adım: dataDome() ile çözün

SDK metodu dataDome(captchaUrl, url, options) biçimindedir ve 2Captcha argüman sırasını izler. İlk ikisi zorunludur. CapSkip’te userAgent ve proxy isteğe bağlıdır ve options nesnesine girer. Bir User-Agent göndermezseniz CapSkip kendi tarayıcısınınkini kullanır ve sonuçta userAgent olarak döndürür. Gönderirseniz Windows için Chrome olmalı ve CapSkip’in tarayıcısıyla aynı ana sürüme sahip olmalıdır; bu yüzden onu hiç vermemek kolay seçimdir. CapSkip challenge’ı kendi çalıştırdığı gerçek bir tarayıcıda geçtiği için metot, reCAPTCHA’nın kullandığı daha uzun 300 saniyelik zaman aşımıyla bekler. API belgeleri bir çözümün genellikle 3 ila 20 saniye sürdüğünü söyler; ben bir tane ölçmedim.

Proxy, sonraki isteklerinizin kullanacağı proxy’dir. Script’iniz bir proxy üzerinden çıkıyorsa onu verin; istekler CapSkip’i çalıştıran makineden çıkıyorsa hiçbir şey vermeyin. CapSkip bir sunucuda çalışıyorsa o makine sunucudur. undefined bırakılan bir seçenek gönderilmez, bu yüzden proxy kullanılmayan durumda proxyOption undefined döndürebilir.

const { CapSkip } = require("capskip");

// Local mode. In Server mode, use your server's address instead.
const solver = new CapSkip({ host: "127.0.0.1", port: 8080 });

function proxyOption(proxyUrl) {
  if (!proxyUrl) return undefined; // your requests leave from the PC that runs CapSkip
  const [scheme, rest] = proxyUrl.split("://");
  return { type: scheme.toUpperCase(), uri: rest }; // e.g. HTTP, user:pass@ip:port
}

function solve(captchaUrl, proxyUrl) {
  // No userAgent option: CapSkip uses its own browser's and reports it.
  return solver.dataDome(captchaUrl, PAGE_URL, { proxy: proxyOption(proxyUrl) });
}

Cihaz kontrolü geçilemezse DataDome kaydırıcıya geçer. CapSkip belgelerine göre tek çağrı onu oraya kadar izler, bu yüzden iki challenge için ayrı kod yazmanız gerekmez.

3. Adım: çerezi User-Agent ve IP adresiyle birlikte gönderin

Sonuç, önemli olan dört alanı bulunan bir nesnedir. code alanı, çerezin DataDome tarafından ayarlandığı hâliyle Max-Age, Domain ve diğer özniteliklerle birlikte tamamıdır; bir çerez deposunun istediği budur. cookie alanı yalnızca datadome ad ve değer çiftidir; bir Cookie başlığının istediği budur. userAgent alanı, onu kazanan User-Agent’tır. proxy alanı yalnızca siz proxy göndermediyseniz ve CapSkip kendi DataDome proxy listesi üzerinden çözdüyse görünür. CapSkip belgeleri, DataDome’nin çerezi genellikle başka bir IP adresinden ya da başka bir User-Agent ile reddettiğini söyler; bu yüzden her seferinde aynı User-Agent’ı gönderin ve sonuç bir proxy adlandırıyorsa isteği onun üzerinden gönderin. Bu proxy alanı yalnızca host ve porttur; şema ve giriş bilgisi yoktur. Fonksiyon http:// ekler ve bu yüzden girişi gerekmeyen bir liste proxy’si varsayar. Liste proxy’niz giriş gerektiriyorsa onu adrese kendiniz yazın, örneğin http://user:pass@ ve ardından host ile port.

DataDome sonraki bir yanıtta yerine geçen bir çerez de gönderebilir. Fonksiyon Set-Cookie satırlarını okur ve bir tarayıcının yapacağı gibi en yenisini tutar.

async function sendWithCookie(result, proxyUrl) {
  // The cookie works only from the address and User-Agent that earned it.
  let via = proxyUrl;
  if (!via && result.proxy) {
    via = `http://${result.proxy}`; // CapSkip solved through its own list
  }
  const headers = { "User-Agent": result.userAgent, Cookie: result.cookie };
  const page = await get(headers, via);
  for (const line of page.setCookies) { // DataDome may rotate the cookie
    const fresh = line.match(/^datadome=([^;]+)/);
    if (fresh) headers.Cookie = `datadome=${fresh[1]}`;
  }
  return { page, headers, via };
}

Çerez başlıkta elle ayarlanır, bu yüzden hiçbir şey onu sizin için yönetmez. Bu bilinçlidir: çerezi, User-Agent’ı ve proxy’yi tek bir yerde bir arada tutar. Şemadan sonraki metin CapSkip’e yazdığınız gibi gider, bu yüzden proxy giriş bilgisini yüzde kodlaması gerektiren karakterlerden uzak tutun.

4. Adım: tam çalışan örnek

Son blok adımları tek bir akışta birleştirir ve yeniden denemeyi ekler. Aynı datadome-demo.js dosyasının sonuna kaydedin ve node datadome-demo.js ile çalıştırın. Her deneme sayfayı yeniden ister, bu yüzden her seferinde yeni bir challenge gelir. Başarısız bir çözüm ApiException fırlatır ve döngü yeniden dener. Buna rağmen 403 alan bir çerez de döngüyü yeni engelleme sayfasıyla başa döndürür. DataDome engelleme sayfası olmadan 403 yanıtı veren bir sayfa, çözülecek bir şey olmadığı için döngüyü bir hatayla durdurur. Her yeniden deneme siteden başka bir engelleme sayfası çeker, bu yüzden deneme sayısını düşük tutun.

const { ApiException } = require("capskip");

const PROXY_URL = null; // e.g. "http://user:[email protected]:8080"; null means no proxy

async function fetchProtected(proxyUrl) {
  for (let attempt = 1; attempt <= 3; attempt += 1) {
    const block = await get(BROWSER, proxyUrl); // a fresh block page, a fresh challenge
    const captchaUrl = captchaUrlFrom(block);
    if (captchaUrl === null) {
      if (block.status >= 400) {
        throw new Error(`HTTP ${block.status} without a DataDome block page`);
      }
      return { page: block, headers: BROWSER, via: proxyUrl }; // no block page here
    }
    let result;
    try {
      result = await solve(captchaUrl, proxyUrl);
    } catch (err) {
      if (!(err instanceof ApiException)) throw err;
      if (err.message.includes("ERROR_PROXY_")) throw err; // the address is the problem
      console.log(`attempt ${attempt}: ${err.message}`); // the next attempt gets a new page
      continue;
    }
    const sent = await sendWithCookie(result, proxyUrl);
    if (sent.page.status !== 200) {
      console.log(`attempt ${attempt}: HTTP ${sent.page.status} with the cookie`);
      continue;
    }
    return sent;
  }
  throw new Error("DataDome not passed in 3 attempts");
}

async function main() {
  const { page, headers, via } = await fetchProtected(PROXY_URL);
  console.log(page.status, page.text.slice(0, 40));
  const again = await get(headers, via); // reuse the cookie while it lasts
  console.log(again.status);
}

main().catch((err) => {
  console.error(`${err.name}: ${err.message}`);
  process.exitCode = 1;
});

SDK, t=bv içeren bir captchaUrl adresini hiçbir şey göndermeden önce reddeder, çünkü o adresten yapılan hiçbir çözüm geçemez. Bu ValidationException bir ApiException değildir, bu yüzden döngü onu yeniden denemek yerine yeniden fırlatır. Görünür kalmasına izin verin: adresi değiştirip baştan başlamanın işaretidir. Döngü, adresi işaret eden iki hatayı da yeniden fırlatır, ERROR_PROXY_BANNED ve ERROR_PROXY_CONNECT_REFUSED, çünkü CapSkip belgeleri aynı adresten yeniden göndermenin yine başarısız olacağını söyler. ApiException iletisi uygulamanın yanıtının metnidir, bu yüzden döngü onu tam karşılaştırmayla değil includes() ile eşleştirir. Bu hatalardan birini görürseniz yeniden çalıştırmadan önce proxy’yi değiştirin. Dönen proxy’ler şurada ele alınır: Proxy döndürme kılavuzu.

Mock çalıştırmasında script, Node.js 24.22.0 üzerinde şöyle davrandı:

Mock ayarıScript ne yaptı
Kaydırıcı engelleme sayfası, her çözüm yanıtlandıBir görev, ardından çerezle 200 durumu ve yeniden kullanımda yine 200
Cihaz kontrolü engelleme sayfasıAynı kod çalıştı: captchaUrl /interstitial/ adresini gösterdi ve sonuç aynıydı
İlk iki çözüm reddedildiİki deneme satırı, ardından üçüncü görevde 200 durumu
İlk üç çözüm reddedildiÜç deneme satırı, ardından “DataDome not passed in 3 attempts” hatası ve çıkış kodu 1
Sonuç, CapSkip’in kendi listesinin yaptığı gibi bir proxy adlandırıyorÇerez istekleri o proxy üzerinden gitti ve 200 aldı
Çözüme kendi proxy’niz verildiin.php proxy adresini ve HTTP türünü aldı, her istek proxy üzerinden gitti
t=bv içeren engelleme sayfasıValidationException, mock CapSkip hiç istek görmedi
Çözüm, script içinde ERROR_PROXY_BANNED ile başarısız olmaya zorlandıDöngü onu bir görevden sonra yeniden fırlattı, ikinci deneme olmadı
DataDome engelleme sayfası olmayan bir 403 sayfası“HTTP 403 without a DataDome block page” hatası ve çıkış kodu 1, CapSkip’e hiçbir istek gitmeden
Farklı bir User-Agent ile gönderilen çerezMock site 403 yanıtı verdi
Proxy üzerinden verilen, proxy olmadan gönderilen çerezMock site 403 yanıtı verdi, aynı çerez proxy üzerinden gidince 200 verdi

Son iki satır, CapSkip belgelerini izleyen mock’umun kurallarını sınar. Gerçek hizmet hakkında kanıt değildir.

Yaygın hatalar

HataNedenDüzeltme
ValidationExceptionDataDome challenge adresi olmayan bir captchaUrl, t=bv içeren bir engelleme sayfası, http ya da https olmayan bir pageurl veya Windows için standart Chrome olmayan bir userAgent. İleti bunlardan hangisi olduğunu söylerAdresi yeni bir engelleme sayfasından yeniden oluşturun, yasaklıysa adresi değiştirin ve userAgent seçeneğini kaldırın
ApiException ile ERROR_WRONG_USERAGENTUser-Agent Windows için Chrome ama ana sürümü CapSkip’in tarayıcısından farklı. Mock, Chrome 120 için bunu verdiuserAgent göndermeyin ve sonucun bildirdiğini kullanın
ApiException ile ERROR_BAD_PARAMETERSÇalışan CapSkip uygulaması, challenge adresi olmayan bir adresi elle gönderdiğimde bunu verdi. SDK böyle bir adresi hiçbir şey göndermeden önce reddederAdresi yeni bir engelleme sayfasından yeniden oluşturun
ERROR_CAPTCHA_UNSOLVABLE içeren ApiExceptionChallenge geçilemediSayfayı yeniden isteyin ve yeni captchaUrl değerini gönderin
ApiException ile ERROR_PROXY_BANNEDDataDome çözüm sırasında adresi yasakladı. t=bv diyen bir engelleme sayfası daha önce ValidationException olarak yakalanırProxy’yi değiştirin ve sayfayı yeniden isteyin
ApiException ile ERROR_PROXY_CONNECT_REFUSEDCapSkip, proxy üzerinden bağlanamadığında bunu bildirir. Yeniden üretmedimProxy adresini, giriş bilgisini ve türünü kontrol edin, sonra script’i yeniden çalıştırın
TimeoutExceptionCapSkip 300 saniyelik bekleme içinde yanıt vermedi. Bu bir ApiException değildir, bu yüzden döngü onu yeniden fırlatırCapSkip’in çalıştığını ve çözdüğünü kontrol edin, sonra script’i yeniden çalıştırın
NetworkExceptionCapSkip çalışmıyor ya da host veya port yanlış. Dinleyen hiçbir şeyin olmadığı bir port, bir NetworkException içinde ECONNREFUSED verdi; bu bir ApiException değildirCapSkip’i başlatın ve bağlantı ayarlarını kontrol edin
Çerezle birlikte hâlâ 403İstek başka bir IP adresinden çıktı, başka bir User-Agent kullandı ya da çerezin süresi dolduSonucun userAgent ve proxy değerlerini her seferinde gönderin ya da döngüyü yeni engelleme sayfasıyla yeniden çalıştırın

Çözücüyü bir sunucuda çalıştırmak

DataDome CAPTCHA’sı için yazılan Node.js script’inin CapSkip’ten iki şeye ihtiyacı var: bir host ve bir port. Local modunda bunlar 127.0.0.1 ve kendi bilgisayarınızdır. Server modunda CapSkip ağ adresinizi veya genel bir IP’yi dinler, böylece başka bir bilgisayardaki, bir VPS’teki veya barındırılan bir platformdaki script aynı API üzerinden ona erişebilir. Host ve port değerlerini CapSkip constructor’ında değiştirin. Kararlı uzaktan erişim için statik bir genel IP önerilir. Server modu da kendi donanımınızda çalışır ve çözüm başına ücretlendirme yoktur. Yine de portu her adrese açar, bu yüzden ulaşmaması gereken adresler için bir Windows Firewall engelleme kuralı ekleyin. Tek bir şey değişir: çözüm o makinede çalışır, bu yüzden çerez sunucunun IP adresinden kazanılır. Bir proxy vermezseniz çerezi taşıyan istek de o sunucudan çıkmak zorundadır. Bir proxy kullanıyorsanız aynısını hem çözüme hem isteklerinize verin. Modlar arasında nasıl geçileceğini bağlantı ayarları bölümünde bulabilirsiniz.

FAQ

DataDome çözücü bir token döndürür mü?

Hayır. datadome çerezini döndürür. Bu çerezi, engellenen isteğin Cookie başlığında, aynı User-Agent ile birlikte gönderirsiniz. Doldurulacak bir form alanı yoktur.

DataDome için proxy gerekir mi?

Test için gerekmez. İlk çalıştırma için tek bir IP adresi yeterlidir. CapSkip belgelerine göre çerez yalnızca onu kazanan IP adresinden çalışır; bu yüzden çok sayıda istek göndermeye başladığınızda görev başına bir sticky proxy planlayın ve aynı proxy’yi hem çözüme hem isteklerinize verin. Proxy’ler, bu rehberin SDK dışında bir kütüphaneye ihtiyaç duyduğu tek yerdir, çünkü fetch’in istek başına proxy seçeneği yoktur.

Bu hem kaydırıcı hem cihaz kontrolü için çalışır mı?

Evet, aynı çağrıyla. Kaydırıcının captchaUrl değeri /captcha/ altında, cihaz kontrolününki /interstitial/ altındadır. CapSkip belgeleri, kaydırıcıya yükselen bir cihaz kontrolünün oraya kadar izlendiğini söyler.

Node.js’te tarayıcı olmadan bir DataDome CAPTCHA’sı çözebilir miyim?

Script’inizin tarayıcıya ihtiyacı yok. CapSkip’e ve siteye düz HTTP istekleri gönderir; CapSkip ise challenge’ı, SDK belgelerinin anlattığı gibi, çalıştığı makinede gerçek bir tarayıcıda geçer.

Barındırılan bir platform bunu benim CapSkip’ime karşı çalıştırabilir mi?

Evet, Server modu ile. CapSkip’i ağınızı veya genel IP’nizi dinleyecek şekilde ayarlayın, CapSkip constructor’ını o host ve port bilgisine yöneltin; döngü aynı çalışır, tek bir farkla: çözüm artık sunucuda çalışır, bu yüzden çözüme ve isteklerinize aynı proxy’yi verin. Çözücü sizin donanımınızda kalır.

Kısa özet

Node.js’te bir DataDome CAPTCHA’sını çözmek dört hamle sürer: engelleme sayfasını okuyun, captchaUrl adresini oluşturun, dataDome() metodunu çağırın ve isteği çerezle, User-Agent ile ve ait olduğu IP adresiyle yineleyin. Çözümler kendi makinenizde hiçbir şeye mal olmaz; bir sınırsız captcha çözücü kullanırken istediğiniz de budur, korumalı bir site size sürekli yeni challenge verse bile. Yine de her yeniden deneme siteden başka bir engelleme sayfası çeker, bu yüzden deneme sayısını düşük tutun. SDK’nın geri kalanı için Node.js CAPTCHA çözücü sayfasına bakın. Aynı akışın Python sürümü şurada: Python DataDome kılavuzu.