T3MP3K3 / endpoints /recaptchav3.js
XORE21's picture
Update endpoints/recaptchav3.js
d7a2854 verified
// Helper delay
const delay = ms => new Promise(res => setTimeout(res, ms));
module.exports = async function(page, url, siteKey, action = 'submit') {
return new Promise(async (resolve, reject) => {
// Global Timeout 60 Detik (Server Side)
const timeoutTimer = setTimeout(() => reject(new Error("Timeout Global (60s)")), 60000);
try {
console.log(`[RV3] Processing: ${url} | Action: ${action}`);
// 1. Matikan Intercept (Biarkan loading 100% natural)
await page.setRequestInterception(false);
// 2. Navigasi & Tunggu Network Tenang
// Kita pakai 'networkidle2' agar script Google pasti termuat
try {
await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
} catch (e) {
console.log("[RV3] Navigation timeout, but proceeding...");
}
// 3. Simulasi Manusia (Pancingan Mouse)
try {
await page.mouse.move(100, 100);
await page.mouse.move(200, 200, { steps: 5 });
} catch (e) {}
// 4. Eksekusi Token (Logic di dalam Browser)
const token = await page.evaluate(async (key, act) => {
return new Promise(async (res, rej) => {
// Timeout Internal Browser 30 Detik (Diperpanjang)
const t = setTimeout(() => rej("Google Execute Timeout (30s)"), 30000);
// Fungsi Tunggu Library Google
const waitForGrecaptcha = () => {
return new Promise(resolve => {
let attempts = 0;
const check = setInterval(() => {
attempts++;
if (typeof window.grecaptcha !== 'undefined' && window.grecaptcha.execute) {
clearInterval(check);
resolve(true);
}
if (attempts > 20) { // 10 detik nunggu
clearInterval(check);
resolve(false);
}
}, 500);
});
};
// Cek & Inject
let ready = await waitForGrecaptcha();
if (!ready) {
console.log("Injecting script manually...");
const script = document.createElement('script');
script.src = `https://www.google.com/recaptcha/api.js?render=${key}`;
script.async = true;
script.defer = true;
document.head.appendChild(script);
// Tunggu lagi setelah inject
ready = await waitForGrecaptcha();
}
if (!ready) {
clearTimeout(t);
rej("Failed to load grecaptcha library");
return;
}
// Eksekusi Final
try {
window.grecaptcha.ready(() => {
window.grecaptcha.execute(key, { action: act })
.then(token => {
clearTimeout(t);
res(token);
})
.catch(err => {
clearTimeout(t);
rej("Execution Error: " + (err.message || err));
});
});
} catch (e) {
clearTimeout(t);
rej("Critical Error: " + e.message);
}
});
}, siteKey, action);
clearTimeout(timeoutTimer);
if (token) {
console.log(`[RV3] SUCCESS! Token length: ${token.length}`);
resolve(token);
} else {
reject(new Error("Token returned empty"));
}
} catch (e) {
clearTimeout(timeoutTimer);
// Bersihkan pesan error agar enak dibaca
const msg = e.message.replace("Evaluation failed: ", "");
reject(new Error(msg));
}
});
};