An alternative script for solving the Cloudflare Challenge
Sometimes capturing the parameters for some reasons cannot be done immediately, in that case you can try to add reloading the captcha page until the parameters are retrieved:
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
(async function example() {
const options = new chrome.Options();
options.addArguments('--auto-open-devtools-for-tabs');
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
let params = null;
try {
while (!params) {
await driver.get('https://your_site_with_captcha.com/');
await driver.executeScript(`
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
return function(a, b) {
let p = {
type: "TurnstileTaskProxyless",
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
};
console.log(JSON.stringify(p));
window.params = p;
window.turnstileCallback = b.callback;
return target.render.apply(this, arguments);
}
}
return target[prop];
}
});
`);
params = await driver.executeAsyncScript(`
const callback = arguments[arguments.length - 1];
setTimeout(() => {
callback(window.params);
}, 5000);
`);
if (!params) {
console.log('Params not obtained, reloading page...');
await driver.sleep(3000);
}
}
console.log('Params:', params);
const data = {
clientKey: 'your_API_key',
task: {
type: 'TurnstileTaskProxyless',
websiteURL: params.websiteURL,
websiteKey: params.websiteKey,
data: params.data,
action: params.action,
cloudflareTaskType: "token",
pageAction: "managed",
pageData: params.pagedata
}
};
console.log('Data:', data);
const createResult = await fetch('https://api.capmonster.cloud/createTask', {
method: 'post',
body: JSON.stringify(data)
});
const createTaskResult = await createResult.json();
console.log('Create Task Result:', createTaskResult);
if (createTaskResult.taskId) {
const asyncDelay = (timeout) =>
new Promise(resolve => {
setTimeout(() => {
resolve();
}, timeout);
});
const getTaskResult = async (taskId) => {
const taskResult = await fetch('https://api.capmonster.cloud/getTaskResult', {
method: 'post',
body: JSON.stringify({
"clientKey":"your_API_key",
"taskId": taskId
})
});
const taskResponse = await taskResult.json();
console.log('Task Response:', taskResponse);
if (taskResponse.status === 'processing') {
await asyncDelay(5000);
return await getTaskResult(taskId);
}
return taskResponse;
};
const taskRes = await getTaskResult(createTaskResult.taskId);
console.log('Task Result:', taskRes);
if (taskRes.solution) {
console.log('Solution Token:', taskRes.solution.token);
await driver.executeScript(`
window.turnstileCallback('${taskRes.solution.token}');
`);
}
}
} finally {
await driver.quit();
}
})();