Auto Click "I'm not a robot"

Automatically clicks the "I'm not a robot" checkbox on reCaptcha V2, reCaptcha V2 callback, reCaptcha V2 Enterprise, and hCaptcha captchas

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         Auto Click "I'm not a robot"
// @namespace    http://tampermonkey.net/
// @version      0.9
// @description  Automatically clicks the "I'm not a robot" checkbox on reCaptcha V2, reCaptcha V2 callback, reCaptcha V2 Enterprise, and hCaptcha captchas
// @author       JJJ
// @match        *://*/*
// @icon         https://pngimg.com/uploads/robot/robot_PNG96.png
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // Constants for selectors and attributes
    const CHECKBOX = "#checkbox";
    const ARIA_CHECKED = "aria-checked";

    // Utility function to select a single element
    function qSelector(selector) {
        return document.querySelector(selector);
    }

    // Utility function to check if an element is hidden
    function isHidden(el) {
        return (el.offsetParent === null);
    }

    // Handler for reCaptcha V2
    const reCaptchaV2Handler = {
        // Find the checkbox element for reCaptcha V2
        findCheckboxElement() {
            return document.querySelector('.recaptcha-checkbox-border') ||
                document.querySelector('[role="checkbox"][aria-labelledby="recaptcha-anchor-label"]') ||
                qSelector(CHECKBOX);
        },
        // Solve the reCaptcha V2 by clicking the checkbox
        solve() {
            const checkbox = this.findCheckboxElement();
            if (checkbox && !isHidden(checkbox) && checkbox.getAttribute(ARIA_CHECKED) !== "true") {
                checkbox.click();
            }
        }
    };

    // Handler for reCaptcha V2 callback
    const reCaptchaV2CallbackHandler = {
        // Find the callback function for reCaptcha V2
        findCallbackFunction() {
            if (typeof ___grecaptcha_cfg !== 'undefined') {
                const keys = Object.keys(___grecaptcha_cfg.clients).filter(key => key !== 'load');
                for (const key of keys) {
                    const client = ___grecaptcha_cfg.clients[key];
                    if (client && typeof client.hl?.l?.callback === 'function') {
                        return client.hl.l.callback;
                    }
                }
            }
            return null;
        },
        // Solve the reCaptcha V2 by invoking the callback function
        solve() {
            const callbackFn = this.findCallbackFunction();
            if (typeof callbackFn === 'function') {
                callbackFn();
            }
        }
    };

    // Handler for reCaptcha V2 Enterprise
    const reCaptchaV2EnterpriseHandler = {
        // Find the checkbox element for reCaptcha V2 Enterprise
        findEnterpriseCheckboxElement() {
            return document.querySelector('.enterprise-checkbox') ||
                document.querySelector('[aria-labelledby="recaptcha-accessible-status"]');
        },
        // Solve the reCaptcha V2 Enterprise by clicking the checkbox
        solve() {
            const checkbox = this.findEnterpriseCheckboxElement();
            if (checkbox && !isHidden(checkbox) && checkbox.getAttribute(ARIA_CHECKED) !== "true") {
                checkbox.click();
            }
        }
    };

    // Handler for hCaptcha
    const hCaptchaHandler = {
        // Find the checkbox element for hCaptcha
        findCheckboxElement() {
            return document.querySelector('.hcaptcha-checkbox') ||
                document.querySelector('[aria-labelledby="hcaptcha-anchor-label"]');
        },
        // Solve the hCaptcha by clicking the checkbox
        solve() {
            const checkbox = this.findCheckboxElement();
            if (checkbox && !isHidden(checkbox) && checkbox.getAttribute(ARIA_CHECKED) !== "true") {
                checkbox.click();
            }
        }
    };

    // Main captcha solver that tries to solve all types of captchas
    const captchaSolver = {
        solve() {
            reCaptchaV2Handler.solve();
            reCaptchaV2CallbackHandler.solve();
            reCaptchaV2EnterpriseHandler.solve();
            hCaptchaHandler.solve();
        }
    };

    // Initialize a MutationObserver to detect changes in the DOM
    function initializeObserver() {
        const observer = new MutationObserver((mutations) => {
            for (const mutation of mutations) {
                if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                    captchaSolver.solve();
                }
            }
        });

        observer.observe(document.body, { childList: true, subtree: true });
    }

    // Initialize the script
    function init() {
        captchaSolver.solve();

        // Periodically try to solve captchas
        setInterval(() => {
            captchaSolver.solve();
        }, 1000);
    }

    // Check if the document is still loading
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => {
            initializeObserver();
            init();
        });
    } else {
        initializeObserver();
        init();
    }

    // Compatibility check for supported browsers
    const userAgent = navigator.userAgent.toLowerCase();
    const isCompatibleBrowser = ['chrome', 'edg', 'brave', 'firefox'].some(browser => userAgent.includes(browser));

    console.log(isCompatibleBrowser ? 'Running on a compatible browser' : 'Running on an unsupported browser');
})();