mirror of
https://github.com/yeongpin/cursor-free-vip.git
synced 2025-08-02 20:47:35 +08:00
123 lines
4.0 KiB
JavaScript
123 lines
4.0 KiB
JavaScript
// Debug logging function
|
|
function log(message) {
|
|
console.log(`[reCAPTCHA Bypass] ${new Date().toISOString()}: ${message}`);
|
|
}
|
|
|
|
// Function to get element by selector
|
|
function qSelector(selector) {
|
|
return document.querySelector(selector);
|
|
}
|
|
|
|
// Constants
|
|
const MAX_ATTEMPTS = 1;
|
|
const SELECTORS = {
|
|
CHECK_BOX: ".recaptcha-checkbox-border",
|
|
AUDIO_BUTTON: "#recaptcha-audio-button",
|
|
PLAY_BUTTON: ".rc-audiochallenge-play-button .rc-button-default",
|
|
AUDIO_SOURCE: "#audio-source",
|
|
IMAGE_SELECT: "#rc-imageselect",
|
|
RESPONSE_FIELD: ".rc-audiochallenge-response-field",
|
|
AUDIO_ERROR_MESSAGE: ".rc-audiochallenge-error-message",
|
|
AUDIO_RESPONSE: "#audio-response",
|
|
RELOAD_BUTTON: "#recaptcha-reload-button",
|
|
RECAPTCHA_STATUS: "#recaptcha-accessible-status",
|
|
DOSCAPTCHA: ".rc-doscaptcha-body",
|
|
VERIFY_BUTTON: "#recaptcha-verify-button"
|
|
};
|
|
|
|
// Function to check if element is hidden
|
|
function isHidden(el) {
|
|
return (el.offsetParent === null);
|
|
}
|
|
|
|
// Function to handle the bypass process
|
|
async function bypassRecaptcha() {
|
|
try {
|
|
log('Starting bypass process...');
|
|
log('Waiting 3 seconds before starting...');
|
|
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
|
|
let solved = false;
|
|
let checkBoxClicked = false;
|
|
let requestCount = 0;
|
|
|
|
const recaptchaInitialStatus = qSelector(SELECTORS.RECAPTCHA_STATUS) ?
|
|
qSelector(SELECTORS.RECAPTCHA_STATUS).innerText : "";
|
|
|
|
log('Initial reCAPTCHA status: ' + recaptchaInitialStatus);
|
|
|
|
// Main bypass logic
|
|
try {
|
|
if (!checkBoxClicked && qSelector(SELECTORS.CHECK_BOX) &&
|
|
!isHidden(qSelector(SELECTORS.CHECK_BOX))) {
|
|
log('Clicking checkbox...');
|
|
qSelector(SELECTORS.CHECK_BOX).click();
|
|
checkBoxClicked = true;
|
|
}
|
|
|
|
// Check if the captcha is solved
|
|
if (qSelector(SELECTORS.RECAPTCHA_STATUS) &&
|
|
(qSelector(SELECTORS.RECAPTCHA_STATUS).innerText != recaptchaInitialStatus)) {
|
|
solved = true;
|
|
log('SOLVED!');
|
|
}
|
|
|
|
if (requestCount > MAX_ATTEMPTS) {
|
|
log('Attempted Max Retries. Stopping the solver');
|
|
solved = true;
|
|
}
|
|
|
|
// Stop solving when Automated queries message is shown
|
|
if (qSelector(SELECTORS.DOSCAPTCHA) &&
|
|
qSelector(SELECTORS.DOSCAPTCHA).innerText.length > 0) {
|
|
log('Automated Queries Detected');
|
|
}
|
|
|
|
} catch (err) {
|
|
log(`Error in main bypass logic: ${err.message}`);
|
|
}
|
|
|
|
log('Bypass process completed');
|
|
|
|
// If not solved, retry after delay
|
|
if (!solved && requestCount < MAX_ATTEMPTS) {
|
|
requestCount++;
|
|
log(`Retrying... Attempt ${requestCount} of ${MAX_ATTEMPTS}`);
|
|
setTimeout(bypassRecaptcha, 2000);
|
|
}
|
|
|
|
} catch (e) {
|
|
log(`Bypass failed: ${e.message}`);
|
|
}
|
|
}
|
|
|
|
// Create a MutationObserver to watch for reCAPTCHA elements
|
|
log('Setting up MutationObserver...');
|
|
const observer = new MutationObserver((mutations) => {
|
|
mutations.forEach((mutation) => {
|
|
mutation.addedNodes.forEach((node) => {
|
|
if (node.nodeType === 1 && // Element node
|
|
((node.tagName === 'SCRIPT' && node.src && node.src.includes('recaptcha')) ||
|
|
(node.tagName === 'IFRAME' && node.src && node.src.includes('recaptcha')))) {
|
|
log(`Detected new reCAPTCHA element: ${node.tagName} - ${node.src}`);
|
|
bypassRecaptcha();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
// Start observing
|
|
observer.observe(document, {
|
|
childList: true,
|
|
subtree: true
|
|
});
|
|
log('MutationObserver started');
|
|
|
|
// Run on page load
|
|
if (document.readyState === 'loading') {
|
|
log('Document still loading, waiting for DOMContentLoaded');
|
|
document.addEventListener('DOMContentLoaded', bypassRecaptcha);
|
|
} else {
|
|
log('Document already loaded, starting bypass process');
|
|
bypassRecaptcha();
|
|
} |