Paano Lampasan ang Cloudflare
Sa artikulong ito, matututuhan mo kung paano lampasan ang pahina ng Cloudflare na "Verifying you are human" gamit ang NodeJS at awtomasyon ng browser gamit ang Playwright.

Unawain muna natin nang maikli kung paano gumagana ang Cloudflare. Kung walang Cloudflare, ang mga administrador ng website ay nagho-host ng kanilang mga pahina sa isang server na may pampublikong IP address. Ang kanilang mga domain name ay nagre-resolve sa IP na iyon at direktang kumokonekta ang iyong browser sa kanilang server.
Kapag gumagamit sila ng Cloudflare, isinusuko nila ang pamamahala ng DNS sa Cloudflare, na siyang nagsisimulang i-resolve ang mga domain name patungo sa sarili nilang mga IP address. Sa mga IP address na ito, nagpapatakbo sila ng mga espesyal na proxy server na nagsasala ng mga papasok na HTTP at HTTPS na kahilingan.
Makikita ng mga bagong bisita ang kilalang pahina na may teksto: "Verifying you are human. This may take a few seconds.". Sa panahon ng beripikasyong ito, maaaring hilingin sa iyo na lutasin ang isang captcha. Dati, gumagamit sila ng reCAPTCHA, pero ngayon ay gamit na nila ang sarili nilang Turnstile captcha.
Kapag matagumpay mong nalampasan ang captcha, makakatanggap ang browser ng natatanging token sa isang cookie na may pangalang cf_clearance. Gagamitin ng iyong browser ang token na ito upang humiling ng mga pahina ng website mula sa proxy ng Cloudflare. Kapag ang token ay nag-expire o kung sa loob ng Cloudflare ay matukoy na parang bot ang kilos ng token, ito'y maba-void at muling ipapakita sa iyo ang captcha verification.
Tutulungan ka ng aming paraan na makuha ang token gamit ang isang awtomatikong browser session. Tandaan na hindi nito isiniwalat ang tunay na IP address ng website – ang impormasyong iyon ay tanging Cloudflare at mga administrador ng website lamang ang nakakaalam. At mabuti na rin ito!
Ganito ito gawin gamit ang NodeJS at Playwright:
// Install packages
// npx install playwright @antiadmin/anticaptchaofficial
import { chromium } from "playwright";
import ac from "@antiadmin/anticaptchaofficial";
// Specify the target website address
const websiteBehindCloudFlare = 'https://yourwebsite.com';
// Set your Anti-Captcha API key here:
ac.setAPIKey('API_KEY_HERE');
ac.setSoftId(0);
let browser = null;
let page = null;
(async () => {
// Opening the browser
try {
console.log('Opening browser ..');
browser = await chromium.launch({ headless: false });
console.log('Creating new page ..');
page = await browser.newPage();
} catch (e) {
console.log("Could not open browser: "+e.toString());
return;
}
let params = null;
try {
// Doing several attempts to inject our code
while (!params) {
console.log('Navigating to the page')
await page.goto(websiteBehindCloudFlare);
console.log('Injecting our proxy code to replace window.turnstile');
await page.evaluate(() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === "render") {
return function (a, b) {
const p = {
websiteURL: window.location.href,
websiteKey: b.sitekey,
action: b.action,
cData: b.cData,
chlPageData: b.chlPageData,
userAgent: navigator.userAgent,
};
// saving params in window.params
window.params = p;
// assigning callback to a variable
window.cfCallback = b.callback
// calling original render function
return target.render.apply(this, arguments);
};
}
return target[prop];
},
});
});
console.log('Getting params');
params = await page.evaluate(() => {
return new Promise((resolve) => {
setTimeout(() => resolve(window.params || null), 5000);
});
});
if (!params) {
console.log('Retrying..');
await delay(3000);
}
}
console.log("Extracted Turnstile Params:", params);
console.log('Solving Turnstile captcha with Anti-Captcha')
const token = await ac.solveTurnstileProxyless(websiteBehindCloudFlare, params.websiteKey, params.action, params.cData, params.chlPageData);
// Running Cloudflare's callback function we previously assigned to window.cfCallback
await page.evaluate((token) => {
window.cfCallback(token)
}, token);
console.log('Waiting for redirects to finish')
await delay(5000);
// Get all cookies for current page
const cookies = await page.context().cookies();
// Find cf_clearance
const cf_clearance = cookies.filter(c => c.name === 'cf_clearance');
// Output cookies
console.log('Cookies:', cookies);
console.log('cf_clearance:', cf_clearance);
} catch (e) {
console.error('Could not inject proxy code:', e);
}
// close browser when needed
// await browser.close();
})();
function delay(time) {
return new Promise(function(resolve) {
setTimeout(resolve, time)
});
}
Ito ang ginagawa ng aming code:
1. Buksan ang window ng browser at pumunta sa pahina ng beripikasyon ng Cloudflare.
2. Palitan ang render function ng Turnstile gamit ang aming proxy function, kung saan hinuhuli namin ang mga paunang parameter at ang callback pagkatapos malutas ang captcha.
3. Ipadala ang mga parameter sa Anti-Captcha API. May mga taong gumagawa ng captcha para sa iyo at nagbibigay sa iyo ng token.
4. I-call ang na-save na callback function gamit ang token mula sa Turnstile bilang parameter.
5. Sinasagawa ng Cloudflare ang internal na beripikasyon ng token, nagse-set ng cookie sa browser at nire-reload ang pahina.
6. Sa tulong ng cf_clearance, kinukuha ng browser ang laman ng website mula sa Cloudflare proxy.