Node.js ve TypeScript'te Cloudflare Turnstile Nasıl Çözülür

Cloudflare Turnstile iki biçimde ortaya çıkar ve farklı kod gerektirir. Bir form içindeki widget iki argümanlı bir çağrıdır. Tam sayfa ara challenge sayfası, sayfadan kazınacak iki ek değere ihtiyaç duyar ve token yalnızca çözücünün kullandığı user agent'ı geri gönderirseniz kabul edilir. İşte kusursuz görünüp her seferinde başarısız olan token'ları üreten şey, bu son gerekliliktir.
Onları birbirinden ayırmak
| Widget | Doğrulama sayfası | |
|---|---|---|
| Görünüm | Kullanılabilir bir formun içindeki bir onay kutusu | Tam sayfa ara sayfa, sayfa engellendi |
| cData ve chlPageData gerektirir | Hayır | Evet |
| Döndürülen user agent'ı gerektirir | Hayır | Evet |
Bizim canlı Turnstile demosu widget çeşidini çalıştırır; bu, hangisine baktığınızı çözmeye çalışırken yararlı bir referanstır.
Kurulum
npm install capskip
const { CapSkip } = require('capskip');
const solver = new CapSkip({
host: '127.0.0.1',
port: 8080,
recaptchaTimeout: 300, // seconds, also covers Turnstile
});CapSkip yerel olarak çözer; bu nedenle herhangi bir çağrı başarılı olmadan önce masaüstü uygulamasının çalışıyor olması gerekir.
Bileşen modu
const result = await solver.turnstile( '0x4AAAAAAA...', // the data-sitekey attribute 'https://example.com/login', ); console.log(result.code); // cf-turnstile-response token
Koy result.code şunun içine: cf-turnstile-response alanı ve gönderin. Başka hiçbir şeye gerek yoktur.
Doğrulama sayfaları iki değer daha gerektirir
Bir ara sayfa (interstitial), token'ın ilişkilendirildiği istek başına durum taşır. Bunun iki parçasının çözümle birlikte gitmesi gerekir:
- cData, şu olarak geçirilir:
data - chlPageData, şu olarak geçirilir:
pagedata
Her ikisi de bir form özniteliğinde değil, doğrulama sayfasının kendisinde bulunur; dolayısıyla çözülebilmesi için önce sayfanın alınması gerekir. Standart bir Cloudflare ara sayfasında, sayfanın kendi doğrulama seçenekleri nesnesinde, sitekey'in yanında yer alırlar. Tek kullanımlıktırlar ve o sayfa yüklemesine bağlıdırlar; bu yüzden önbelleğe almak yerine birlikte alıp çözün.
const result = await solver.turnstile(sitekey, pageUrl, {
data: cData, // the cData value
pagedata: chlPageData, // the chlPageData value
action: 'managed', // optional, when the page declares one
});
console.log(result.code);
console.log(result.userAgent); // required for the next stepuser agent isteğe bağlı değildir
Turnstile, token'ı onu üreten tarayıcı parmak izine bağlar ve user agent bu parmak izinin bir parçasıdır. CapSkip, şurada kullandığını döndürür: result.userAgent. Token'ı bunun yerine Node’un varsayılan fetch user agent'ıyla gönderirseniz, Cloudflare aksi halde tamamen geçerli olan bir token'ı reddeder.
userAgent yalnızca Turnstile için doldurulur. Diğer her CAPTCHA türü için tanımsızdır; bu da tam olarak çalışan bir reCAPTCHA yardımcısını yeniden kullanan kişileri neden yakaladığının sebebidir.
const response = await fetch(pageUrl, {
method: 'POST',
headers: {
// Send back the exact user agent the solve was performed with.
'User-Agent': result.userAgent,
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams({
'cf-turnstile-response': result.code,
}),
});Bir token reddediliyorsa ve cData tazeyse, neden neredeyse her zaman budur.
TypeScript
import { CapSkip, SolveResult } from 'capskip';
const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });
const result: SolveResult = await solver.turnstile(sitekey, pageUrl);
// userAgent is optional on the type, because only Turnstile populates it.
if (result.userAgent) {
// safe to forward
}Tanımlar paketle birlikte gelir, bu nedenle şey yoktur @types kurulum. Şunun üzerindeki isteğe bağlı yazım: userAgent faydalı bir uyarıdır: derleyici, diğer CAPTCHA türlerinin onu boş bıraktığını unutmanıza izin vermez.
Proxy'ler ve eşzamanlılık
// Solve through the same egress you will submit from.
await solver.turnstile(sitekey, pageUrl, {
data: cData,
pagedata: chlPageData,
proxy: { type: 'HTTPS', uri: 'user:[email protected]:3128' },
});
// Several at once.
const results = await Promise.all(targets.map((t) =>
solver.turnstile(t.sitekey, t.url)));Proxy'ler Turnstile, reCAPTCHA ve GeeTest için işe yarar, ancak asla hedef siteye dokunmayan görsel CAPTCHA'lar için işe yaramaz. Sorgu sayfaları için her çözümün kendi taze getirilmiş cData'sına ihtiyacı vardır; bu nedenle önceden toplu halde değil, eşlenen fonksiyonun içinde getirin.
Sık sorulan sorular
Widget'ların hiç cData'ya ihtiyacı olur mu?
Hayır ve boş değerler geçmek, yardımcı olmak yerine çözümün başarısız olmasına neden olur. Bunları yalnızca tam sayfa ara doğrulamaları (interstitial challenge) kullanır.
Token iyi görünüyor ama site onu reddediyor.
Neredeyse her zaman kullanıcı aracısı. Şunu kullanarak gönderin: result.userAgent HTTP istemcinizin varsayılan olarak gönderdiği herhangi bir şey yerine. İkinci en olası neden, tek bir sayfa yüklemesine bağlı olan bayat (stale) bir cData'dır.
Bunu Puppeteer ile kullanabilir miyim?
Evet, ve iyi uyum sağlar: cData'yı yüklenen sayfadan şununla okuyun: page.evaluate, bu SDK ile çözün, ardından devam etmeden önce sayfada aynı user agent'ı ayarlayın. Bizim Node.js CAPTCHA çözücü sayfası otomasyon tarafını kapsar.
Özet
Widget'lar bir sitekey ve bir URL alır. Doğrulama sayfaları şuna ihtiyaç duyar: data ve pagedata sayfadan taze okunur ve token şununla gönderilmelidir: result.userAgent. Geri kalan her şey sıradan Promise yönetimidir.
Diğer diller şuradadır: Cloudflare Turnstile çözücü sayfası, parametre ayrıntıları şuradadır: API dokümantasyonu, ve daha geniş Node yüzeyi şurada: Node.js CAPTCHA çözücü sayfası. CapSkip bir sınırsız captcha çözücü kendi donanımınızda çalışan.
