[Premium] Faucet Monitor with Faucetpay ReCaptcha/Antibot Rotator

Elevate your Faucet claiming experience with advanced automation, seamlessly handling form filling, button clicks, and ReCaptcha/Antibot challenges. Boost your efficiency and maximize earnings.

目前為 2024-01-27 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         [Premium] Faucet Monitor with Faucetpay ReCaptcha/Antibot Rotator
// @namespace    https://greasyfork.org/users/1162863
// @version      2.4.4
// @description  Elevate your Faucet claiming experience with advanced automation, seamlessly handling form filling, button clicks, and ReCaptcha/Antibot challenges. Boost your efficiency and maximize earnings.
// @author       Andrewblood
// @match        https://coinfinity.top/*
// @match        https://sollcrypto.com/*
// @match        https://cryptoclaps.com/*
// @match        https://baltoniearn.com/claim/tron/*
// @match        https://vptron.online/TRX/*
// @match        https://claimcoins.site/reward/*
// @match        https://bnbminers.site/earns/*
// @match        https://ltcmines.site/earns/*
// @match        https://tronxminer.com/rewards/*
// @match        https://etcoin.site/earn/*
// @match        https://autofaucet.dutchycorp.space/*
// @match        https://freebitco.in/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=faucetpay.io
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        window.close
// @antifeature  referal-link     Referal-Link is in this Script integrated and in the description. (No win decrease for you, it's a thank you to me for the share)
// @license      Copyright Andrewblood
// ==/UserScript==
/*
Experience the next level of Faucet claiming with unparalleled features:

- User Interface: Displays an overlay for managing stored URLs, clearing pages, and saving Faucetpay email.
- Requirements Integration: Provides extension and script recommendations with install buttons for enhanced functionality.
- Advanced Automation: Seamlessly fills forms and clicks buttons on Faucetpay Faucet sites, reducing manual effort.
- ReCaptcha/Antibot Handling: Intelligently tackles security challenges, ensuring a smooth claiming process.
- Efficient Navigation: Automatically moves through supported Faucet URLs, preventing revisits window for strategic claiming.
- Error Handling: Reloads pages, ensuring up-to-date claiming and avoiding downtime.

        "https://cryptoclaps.com/earn/dogecoin/",
        "https://cryptoclaps.com/earn/tron/",
        "https://cryptoclaps.com/earn/litecoin/",
        "https://cryptoclaps.com/earn/binance/",
        "https://cryptoclaps.com/earn/solana/",
        "https://cryptoclaps.com/earn/ethereum/",
        "https://cryptoclaps.com/earn/bch/",
        "https://cryptoclaps.com/earn/xrp/",
        "https://cryptoclaps.com/earn/dash/",
        "https://cryptoclaps.com/earn/polygon/",
        "https://cryptoclaps.com/earn/usdt/",
        "https://cryptoclaps.com/earn/zcash/",
        "https://etcoin.site/earn/tron/",
        "https://etcoin.site/earn/doge/",
        "https://etcoin.site/earn/litecoin/",
        "https://etcoin.site/earn/binance/",
        "https://etcoin.site/earn/ripple/",
        "https://etcoin.site/earn/ethereum/",
        "https://etcoin.site/earn/bitcoin/",

*/
(function() {
    'use strict';

    var urls = [
        "https://sollcrypto.com/home/page/bitcoin/",
        "https://sollcrypto.com/home/page/doge/",
        "https://sollcrypto.com/home/page/tron/",
        "https://sollcrypto.com/home/page/digibyte/",
        "https://sollcrypto.com/home/page/litecoin/",
        "https://sollcrypto.com/home/page/binance/",
        "https://sollcrypto.com/home/page/solana/",
        "https://sollcrypto.com/home/page/ethereum/",
        "https://sollcrypto.com/home/page/bch/",
        "https://sollcrypto.com/home/page/xrp/",
        "https://sollcrypto.com/home/page/dash/",
        "https://sollcrypto.com/home/page/zcash/",
        "https://baltoniearn.com/claim/tron/",
        "https://vptron.online/TRX/",
        "https://claimcoins.site/reward/tron/",
        "https://claimcoins.site/reward/doge/",
        "https://claimcoins.site/reward/litecoin/",
        "https://claimcoins.site/reward/binance/",
        "https://claimcoins.site/reward/ripple/",
        "https://claimcoins.site/reward/bitcoin/",
        "https://bnbminers.site/earns/tron/",
        "https://bnbminers.site/earns/litecoin/",
        "https://bnbminers.site/earns/feyorra/",
        "https://bnbminers.site/earns/binance/",
        "https://bnbminers.site/earns/ripple/",
        "https://bnbminers.site/earns/ethereum/",
        "https://bnbminers.site/earns/bitcoin/",
        "https://ltcmines.site/earns/tron/",
        "https://ltcmines.site/earns/doge/",
        "https://ltcmines.site/earns/litecoin/",
        "https://ltcmines.site/earns/binance/",
        "https://ltcmines.site/earns/ripple/",
        "https://ltcmines.site/earns/ethereum/",
        "https://ltcmines.site/earns/bitcoin/",
        "https://tronxminer.com/rewards/tron/",
        "https://tronxminer.com/rewards/doge/",
        "https://tronxminer.com/rewards/feyorra/",
        "https://tronxminer.com/rewards/binance/",
        "https://tronxminer.com/rewards/ripple/",
        "https://tronxminer.com/rewards/bitcoin/",
    ];

    // Function to click a button
    function clickButton(selector) {
        var button = document.querySelector(selector);
        if (button) {
            button.click();
        }
    }

    // Function to check if the captcha is activated
    function isCaptchaChecked() {
        return grecaptcha && grecaptcha.getResponse().length !== 0;
    }

    function visibleCheck(elm) {
        if (!elm.offsetHeight && !elm.offsetWidth) { return false; }
        if (getComputedStyle(elm).visibility === 'hidden') { return false; }
        return true;
    }

    // Function to check if an element is visible
    function isElementVisible(selector) {
        var element = document.querySelector(selector);
        return element && element.offsetWidth > 0 && element.offsetHeight > 0;
    }

    // Function to open a website
    function openWebsite(url) {
        window.open(url, '_blank');
    }

    // Email overlay creation
    var overlay = document.createElement('div');
    overlay.id = 'emailInputOverlay';
    overlay.style.position = 'fixed';
    overlay.style.bottom = '10px';
    overlay.style.right = '10px';
    overlay.style.zIndex = '10000';

    // Create a button for other requirements
    var otherRequirementsButton = document.createElement('button');
    otherRequirementsButton.id = 'otherRequirementsButton';
    otherRequirementsButton.style.padding = '5px';
    otherRequirementsButton.style.marginLeft = '5px';
    otherRequirementsButton.textContent = 'Requirements';

    var isRequirementsOverlayOpen = false;
    var isStoredUrlsOverlayOpen = false;

    // Event listener for otherRequirementsButton
    otherRequirementsButton.addEventListener('click', function() {
        // Check if requirements overlay is already open
        if (isRequirementsOverlayOpen) {
            // Close the overlay
            closeOverlay(otherRequirementsOverlay);
            isRequirementsOverlayOpen = false;
            return;
        }

        // Create an overlay for other requirements
        var otherRequirementsOverlay = document.createElement('div');
        otherRequirementsOverlay.style.position = 'fixed';
        otherRequirementsOverlay.style.top = '50%';
        otherRequirementsOverlay.style.left = '50%';
        otherRequirementsOverlay.style.transform = 'translate(-50%, -50%)';
        otherRequirementsOverlay.style.zIndex = '10001';
        otherRequirementsOverlay.style.backgroundColor = '#fff';
        otherRequirementsOverlay.style.border = '1px solid #ddd';
        otherRequirementsOverlay.style.padding = '20px';
        otherRequirementsOverlay.style.maxHeight = '80%';
        otherRequirementsOverlay.style.overflowY = 'auto';

        // Add the heading
        var heading = document.createElement('h2');
        heading.textContent = 'Requirements';
        heading.style.textAlign = 'center';
        heading.style.marginBottom = '15px';
        otherRequirementsOverlay.appendChild(heading);

        // Define the list of extensions and scripts with install buttons
        var requirementsList = [
            { name: '<b>ReCaptcha:</b> hektCaptcha: hCaptcha Solver', installUrl: 'https://github.com/Wikidepia/hektCaptcha-extension' },
            { name: '<b>Antibot Words:</b> AB Links Solver', installUrl: 'https://greasyfork.org/de/scripts/459453-ab-links-solver' }
        ];

        // Create a list element
        var list = document.createElement('ul');
        list.style.listStyleType = 'none';
        list.style.padding = '0';

        // Populate the list with requirements and install buttons
        requirementsList.forEach(function(requirement) {
            var listItem = document.createElement('li');

            var installButton = document.createElement('button');
            installButton.textContent = 'Install';
            installButton.addEventListener('click', function() {
                // Open a new tab with the install URL
                window.open(requirement.installUrl, '_blank');
            });

            // Create a span element for styling
            var styledText = document.createElement('span');
            styledText.innerHTML = requirement.name; // Use innerHTML to interpret HTML tags

            // Append the span and install button to the list item
            listItem.appendChild(styledText);
            listItem.appendChild(installButton);
            list.appendChild(listItem);
        });

        // Create a close button for the overlay
        var closeRequirementsButton = document.createElement('button');
        closeRequirementsButton.textContent = 'Close';
        closeRequirementsButton.style.padding = '8px';
        closeRequirementsButton.style.marginTop = '10px';
        closeRequirementsButton.addEventListener('click', function() {
            // Close the overlay when the close button is clicked
            document.body.removeChild(otherRequirementsOverlay);
        });



        // Function to save Faucetpay email
        function saveFaucetpayEmail() {
            // Save entered email address
            var newEmail = emailInput.value;
            GM_setValue('storedEmail', newEmail);

            // Success notification (can be customized)
            alert('Faucetpay email address saved successfully!');
        }

        // Add input field and label for Faucetpay email to the requirements overlay
        var emailInputLabel = document.createElement('label');
        emailInputLabel.textContent = 'Enter Faucetpay Email:';
        emailInputLabel.style.display = 'block';
        emailInputLabel.style.marginTop = '10px';

        var emailInput = document.createElement('input');
        emailInput.type = 'text';
        emailInput.id = 'emailInput';
        emailInput.placeholder = 'Faucetpay Email';
        emailInput.style.padding = '5px';
        emailInput.style.width = '100%';

        // Abrufen und Einsetzen des gespeicherten Werts
        var storedEmail = GM_getValue('storedEmail', '');
        emailInput.value = storedEmail;

        // Add "Save Faucetpay email" button to the requirements overlay
        var saveFaucetpayEmailButton = document.createElement('button');
        saveFaucetpayEmailButton.id = 'saveFaucetpayEmailButton';
        saveFaucetpayEmailButton.style.padding = '5px';
        saveFaucetpayEmailButton.style.marginTop = '5px';
        saveFaucetpayEmailButton.style.width = '100%';
        saveFaucetpayEmailButton.textContent = 'Save Faucetpay Email';

        // Add event listener for saveFaucetpayEmailButton
        saveFaucetpayEmailButton.addEventListener('click', saveFaucetpayEmail);


        // Append the list and close button to the overlay
        otherRequirementsOverlay.appendChild(list);
        // Append the input field, label, and "Save Faucetpay email" button to the requirements overlay
        otherRequirementsOverlay.appendChild(emailInputLabel);
        otherRequirementsOverlay.appendChild(emailInput);
        otherRequirementsOverlay.appendChild(saveFaucetpayEmailButton);
        otherRequirementsOverlay.appendChild(closeRequirementsButton);
        var closeButton = createCloseButton(otherRequirementsOverlay);
        otherRequirementsOverlay.appendChild(closeButton);

        // Set flag to indicate that requirements overlay is open
        isRequirementsOverlayOpen = true;

        // Add the overlay to the body
        document.body.appendChild(otherRequirementsOverlay);

        // Add an event listener to reset the flag when the overlay is closed
        otherRequirementsOverlay.addEventListener('click', function() {
            isRequirementsOverlayOpen = false;
        });
    });

    // Create a button to show stored URLs
    var showStoredUrlsButton = document.createElement('button');
    showStoredUrlsButton.id = 'showStoredUrlsButton';
    showStoredUrlsButton.style.padding = '5px';
    showStoredUrlsButton.style.marginLeft = '5px';
    showStoredUrlsButton.textContent = 'Faucetpay Rotator Sites';

    showStoredUrlsButton.addEventListener('click', function() {
        // Check if stored URLs overlay is already open
        if (isStoredUrlsOverlayOpen) {
            // Close the overlay
            closeOverlay(overlayTable);
            isStoredUrlsOverlayOpen = false;
            return;
        }
        // Display stored pages in an overlay
        var storedUrls = GM_getValue('storedUrls', []);

        // Combine stored URLs with the original URLs
        var allUrls = urls.map(function(url) {
            var storedUrlEntry = storedUrls.find(function(storedUrl) {
                return storedUrl.url === url;
            });

            return {
                url: url,
                timestamp: storedUrlEntry ? storedUrlEntry.timestamp : null
            };
        });

        // Create an overlay for the table
        var overlayTable = document.createElement('div');
        overlayTable.style.position = 'fixed';
        overlayTable.style.top = '50%';
        overlayTable.style.left = '50%';
        overlayTable.style.transform = 'translate(-50%, -50%)';
        overlayTable.style.zIndex = '10001';
        overlayTable.style.backgroundColor = '#fff';
        overlayTable.style.border = '1px solid #ddd';
        overlayTable.style.padding = '20px';
        overlayTable.style.maxHeight = '80%';
        overlayTable.style.overflowY = 'auto';

        // Add the heading for Faucetpay Rotator Sites
        var heading = document.createElement('h2');
        heading.textContent = 'Faucetpay Rotator Sites';
        heading.style.textAlign = 'center';
        heading.style.marginBottom = '15px';
        overlayTable.appendChild(heading);


        // Create a close button for the overlay
        var closeButton = document.createElement('button');
        closeButton.textContent = 'Close';
        closeButton.style.padding = '8px';
        closeButton.style.marginTop = '10px';
        closeButton.addEventListener('click', function() {
            // Close the overlay when the close button is clicked
            document.body.removeChild(overlayTable);
        });

        // Create a button to delete all stored URLs
        var deleteAllButton = document.createElement('button');
        deleteAllButton.id = 'deleteAllButton';
        deleteAllButton.style.padding = '5px';
        deleteAllButton.style.marginLeft = '5px';
        deleteAllButton.style.float = 'right'; // Align the button to the right
        deleteAllButton.textContent = 'Set All Active';

        // Add an event listener for the deleteAllButton
        deleteAllButton.addEventListener('click', function() {
            // Clear all stored URLs
            GM_deleteValue('storedUrls');

            // Refresh the table
            showStoredUrlsButton.click();
        });

        // Create a table element
        var table = document.createElement('table');
        table.style.borderCollapse = 'collapse';
        table.style.width = '100%';

        // Create table headers
        var headers = ['Connect', 'URL', 'Status', 'Delete'];
        var headerRow = table.insertRow();
        for (var i = 0; i < headers.length; i++) {
            var headerCell = headerRow.insertCell(i);
            headerCell.style.border = '1px solid #ddd';
            headerCell.style.padding = '8px';
            headerCell.style.textAlign = 'left';
            headerCell.textContent = headers[i];

            // Add click event for sorting
            if (i === 1 || i === 2) {
                headerCell.addEventListener('click', function() {
                    sortTable(table, this.cellIndex);
                });
            }
        }

        // Populate table with all URLs, timestamps, and delete buttons
        for (var j = 0; j < allUrls.length; j++) {
            var urlEntry = allUrls[j];
            var row = table.insertRow();

            // Add "Connect" button to each row
            var connectCell = row.insertCell(0);
            connectCell.style.border = '1px solid #ddd';
            connectCell.style.padding = '8px';

            var connectButton = document.createElement('button');
            connectButton.textContent = 'Connect';
            connectButton.addEventListener('click', createConnectHandler(urlEntry.url)); // Attach a handler with the URL
            connectCell.appendChild(connectButton);

            var urlCell = row.insertCell(1);
            urlCell.style.border = '1px solid #ddd';
            urlCell.style.padding = '8px';
            urlCell.textContent = urlEntry.url;

            var statusCell = row.insertCell(2);
            statusCell.style.border = '1px solid #ddd';
            statusCell.style.padding = '8px';
            statusCell.style.color = getStatusColor(urlEntry);
            statusCell.textContent = getStatusText(urlEntry);

            var deleteCell = row.insertCell(3);
            deleteCell.style.border = '1px solid #ddd';
            deleteCell.style.padding = '8px';

            // Create delete button for each row
            var deleteButton = document.createElement('button');
            deleteButton.textContent = 'Set Active';
            deleteButton.addEventListener('click', createDeleteHandler(urlEntry));

            deleteCell.appendChild(deleteButton);
        }

        // Append the table and close button to the overlay
        overlayTable.appendChild(table);
        overlayTable.appendChild(closeButton);
        overlayTable.appendChild(deleteAllButton);
        var closeButtontop = createCloseButton(overlayTable);
        overlayTable.appendChild(closeButtontop);

        // Set flag to indicate that stored URLs overlay is open
        isStoredUrlsOverlayOpen = true;

        // Add the overlay to the body
        document.body.appendChild(overlayTable);

        // Add an event listener to reset the flag when the overlay is closed
        overlayTable.addEventListener('click', function() {
            isStoredUrlsOverlayOpen = false;
        });
    });

    // Function to close the overlay
    function closeOverlay(overlay) {
        // Close the overlay when the close button is clicked
        document.body.removeChild(overlay);
    }

    // Funktion zum Erstellen des "X"-Buttons
    function createCloseButton(overlay) {
        var closeButton = document.createElement('button');
        closeButton.innerHTML = 'X';
        closeButton.style.position = 'absolute';
        closeButton.style.top = '5px';
        closeButton.style.right = '5px';
        closeButton.style.padding = '5px';
        closeButton.style.cursor = 'pointer';
        closeButton.addEventListener('click', function() {
            // Rufe die Funktion zum Schließen des Overlays auf
            closeOverlay(overlay);
        });
        return closeButton;
    }

    // Function to get the status text based on the urlEntry
    function getStatusText(urlEntry) {
        var currentTime = Date.now();

        if (urlEntry.timestamp) {
            var timestamp = Date.parse(urlEntry.timestamp.replace(/-/g, '/'));
            if (timestamp > currentTime) {
                // Not Active Until
                return 'Not Active Until ' + urlEntry.timestamp;
            } else {
                // Active
                return 'Active';
            }
        } else {
            return 'Active';
        }
    }

    // Function to get the status color based on the urlEntry
    function getStatusColor(urlEntry) {
        var currentTime = Date.now();

        if (urlEntry.timestamp) {
            var timestamp = Date.parse(urlEntry.timestamp.replace(/-/g, '/'));
            return (timestamp > currentTime) ? 'red' : 'green';
        } else {
            return 'green'; // Assuming 'Active' state when timestamp is not present
        }
    }

    // Function to create a delete handler with a specific urlEntry
    function createDeleteHandler(urlEntry) {
        return function() {
            // Find the corresponding URL and delete it from stored pages
            var urlToDelete = urlEntry.url;
            var storedUrls = GM_getValue('storedUrls', []);
            storedUrls = storedUrls.filter(function(storedUrl) {
                return storedUrl.url !== urlToDelete;
            });

            // Update stored pages
            GM_setValue('storedUrls', storedUrls);

            // Refresh the table
            showStoredUrlsButton.click();
        };
    }

    // Function to create a connect handler with a specific URL
    function createConnectHandler(url) {
        return function() {
            // Redirect to the selected URL
            window.open(url, '_blank');
        };
    }

    // Function to sort the table by column index
    function sortTable(table, columnIndex) {
        var rows = Array.from(table.rows).slice(1); // Exclude header row
        var sortOrder = 1;

        // Determine sorting order based on the current order of the column
        if (table.rows[0].cells[columnIndex].classList.contains('ascending')) {
            sortOrder = -1;
        }

        // Remove sorting classes from all columns
        for (var i = 0; i < table.rows[0].cells.length; i++) {
            table.rows[0].cells[i].classList.remove('ascending', 'descending');
        }

        // Sort the rows based on the content of the selected column
        rows.sort(function(a, b) {
            var textA = a.cells[columnIndex].textContent.trim().toUpperCase();
            var textB = b.cells[columnIndex].textContent.trim().toUpperCase();

            if (textA < textB) {
                return -1 * sortOrder;
            } else if (textA > textB) {
                return 1 * sortOrder;
            } else {
                return 0;
            }
        });

        // Clear and rebuild the table with the sorted rows
        while (table.rows.length > 1) {
            table.deleteRow(1);
        }

        for (var j = 0; j < rows.length; j++) {
            table.appendChild(rows[j]);
        }

        // Add sorting class to the header cell
        if (sortOrder === 1) {
            table.rows[0].cells[columnIndex].classList.add('ascending');
        } else {
            table.rows[0].cells[columnIndex].classList.add('descending');
        }
    }
    const websites = [
        { name: 'Freebitco.in', url: 'https://freebitco.in', active: GM_getValue('Freebitco.in', true) },
        { name: 'Dutchycorp', url: 'https://autofaucet.dutchycorp.space', active: GM_getValue('Dutchycorp', true) },
        // Add more websites
    ];

    // Create the menu
    const menu = document.createElement('div');
    menu.style.position = 'fixed';
    menu.style.bottom = '50px';
    menu.style.left = '50%'; // Setze den linken Rand auf 50%
    menu.style.transform = 'translateX(-50%)'; // Zentriere das Menü
    menu.style.backgroundColor = '#fff';
    menu.style.padding = '10px';
    menu.style.border = '1px solid #ccc';
    menu.style.display = 'none';
    menu.style.zIndex = '9999';

    // Create buttons for each website with activation status
    websites.forEach(website => {
        const button = document.createElement('button');
        button.textContent = website.name + (website.active ? ' (Activated)' : ' (Deactivated)');
        button.style.display = 'block';
        button.style.marginBottom = '5px';
        button.style.zIndex = '9999';

        // Click event for left-click (opens the URL)
        button.addEventListener('click', (event) => {
            if (event.button === 0) {
                openWebsite(website.url);
            }
        });

        // Context menu for right-click (activates/deactivates)
        button.addEventListener('contextmenu', (event) => {
            event.preventDefault();
            website.active = !website.active;
            GM_setValue(website.name, website.active);
            button.textContent = website.name + (website.active ? ' (Activated)' : ' (Deactivated)');
        });

        menu.appendChild(button);
    });

    // Create the main button
    const mainButton = document.createElement('button');
    mainButton.textContent = "Faucet Monitor by Andrewblood";
    mainButton.style.position = 'fixed';
    mainButton.style.bottom = '10px';
    mainButton.style.left = '50%'; // Setze den linken Rand auf 50%
    mainButton.style.transform = 'translateX(-50%)'; // Zentriere den Button
    mainButton.style.padding = '10px';
    mainButton.style.zIndex = '9999';

    // Click event for the main button
    mainButton.addEventListener('click', () => {
        // Toggle menu visibility
        menu.style.display = menu.style.display === 'none' ? 'block' : 'none';
    });



    // Add elements to the overlay
    overlay.appendChild(showStoredUrlsButton);
    overlay.appendChild(otherRequirementsButton);

    // Add overlay to the body
    document.body.appendChild(overlay);
    // Add buttons to the document
    document.body.appendChild(menu);
    document.body.appendChild(mainButton);


    var currentURL = window.location.href;
    if (currentURL.includes("https://sollcrypto.com/home/page/") || currentURL.includes("https://cryptoclaps.com/earn/") || currentURL.includes("https://baltoniearn.com/claim/tron/") || currentURL.includes("https://vptron.online/TRX/") || currentURL.includes("https://claimcoins.site/reward/") || currentURL.includes("https://bnbminers.site/earns/") || currentURL.includes("https://ltcmines.site/earns/") || currentURL.includes("https://tronxminer.com/rewards/") || currentURL.includes("https://etcoin.site/earn/")) {

        setTimeout(function () {
            location.reload();
        }, 330000);

        var currentPageUrl = window.location.href;

        var indexOfRParameter = currentPageUrl.indexOf("?r=");
        if (indexOfRParameter !== -1) {
            currentPageUrl = currentPageUrl.substring(0, indexOfRParameter);
        }

        var storedUrls = GM_getValue('storedUrls', []) || [];

        // Erster Selector: The faucet does not have sufficient funds for this transaction
        var selector1 = ".alert.alert-danger.fade.show";
        if (isElementVisible(selector1) && document.querySelector(selector1)?.innerText === ' The faucet does not have sufficient funds for this transaction.') {
            var reason1 = 'sufficient funds';
            var timestamp1 = new Date(new Date().getTime() + 24 * 60 * 60 * 1000).toISOString().slice(0, 19).replace('T', ' ');
            saveUrl(currentPageUrl, timestamp1, reason1);
        }

        // Zweiter Selector: Your daily claim limit has been reached. Please come back in tomorrow.
        var selector2 = ".alert.alert-danger.fade.show";
        if (isElementVisible(selector2) && document.querySelector(selector2)?.innerText === ' Your daily claim limit has been reached. Please come back in tomorrow.') {
            var reason2 = 'daily claim limit';
            // Berechne die Zeit für den nächsten Tag um 01:00 Uhr
            var tomorrow = new Date();
            tomorrow.setDate(tomorrow.getDate() + 1);
            tomorrow.setHours(4, 0, 0, 0);
            var timestamp2 = tomorrow.toISOString().slice(0, 19).replace('T', ' ');
            saveUrl(currentPageUrl, timestamp2, reason2);
        }

        function saveUrl(url, timestamp, reason) {
            var urlWithTimestamp = { url: url, timestamp: timestamp, reason: reason };

            var existingUrlIndex = storedUrls.findIndex(function (storedUrl) {
                return storedUrl.url === url;
            });

            if (existingUrlIndex !== -1) {
                storedUrls[existingUrlIndex].timestamp = timestamp;
                storedUrls[existingUrlIndex].reason = reason;
            } else {
                storedUrls.push(urlWithTimestamp);
            }

            GM_setValue('storedUrls', storedUrls);
        }

        // Check if the element with the text "satoshi" or specific error messages is visible
        if ((isElementVisible(".alert.alert-success.fade.show") &&
             document.querySelector(".alert.alert-success.fade.show").innerText.includes('satoshi')) ||
            (isElementVisible(".alert.alert-danger.fade.show") &&
             document.querySelector(".alert.alert-danger.fade.show").innerText === ' The faucet does not have sufficient funds for this transaction.') ||
            (isElementVisible(".alert.alert-danger.fade.show") &&
             document.querySelector(".alert.alert-danger.fade.show").innerText === ' Session invalid, try again') ||
            (isElementVisible(".alert.alert-danger.fade.show") &&
             document.querySelector(".alert.alert-danger.fade.show").innerText === ' Your daily claim limit has been reached. Please come back in tomorrow.')) {
            // Vorhandene URLs mit Timestamps
            var storedUrls = GM_getValue('storedUrls', []) || [];
            // Funktion zum Überprüfen und Verbinden mit der nächsten gültigen URL
            function checkAndConnectNextUrl() {
                // Aktuelle URL ohne den Referral-Code
                var currentUrl = window.location.href.includes('?r=') ? window.location.href.split('?r=')[0] : window.location.href;

                console.log("Current URL:", currentUrl);

                // Suche nach der Position der aktuellen URL in der Liste
                var currentIndex = urls.indexOf(currentUrl);

                console.log("Current Index:", currentIndex);

                var validUrlFound = false;

                // Überprüfe die nächste URL in der Liste
                for (var i = currentIndex + 1; i < currentIndex + urls.length; i++) {
                    var nextUrl = urls[i % urls.length]; // Modulo verwendet, um wieder von vorne zu beginnen

                    console.log("Checking next URL:", nextUrl);

                    // Überprüfe, ob die URL bereits in storedUrls vorhanden ist
                    var storedUrlInfo = storedUrls.find(function (storedUrl) {
                        return storedUrl.url === nextUrl;
                    });

                    console.log("Stored URL Info:", storedUrlInfo);

                    // Wenn die URL nicht in storedUrls vorhanden ist oder das Datum in der Zukunft liegt
                    if (!storedUrlInfo || new Date() > new Date(storedUrlInfo.timestamp)) {
                        // Verbinde mit der gültigen URL
                        console.log("Connecting to the next valid URL:", nextUrl);

                        // Führe hier deine Verbindungslogik durch
                        window.location.href = nextUrl;

                        // Markiere, dass eine gültige URL gefunden wurde
                        validUrlFound = true;

                        // Verlasse die Schleife, da eine gültige URL gefunden wurde
                        break;
                    }
                }

                // Wenn keine gültige URL gefunden wurde, zeige einen Alert
                if (!validUrlFound) {
                    alert("All sites are empty or daily limit reached. Please start the script tomorrow again.");
                    // Schließe das Fenster nach 3 Sekunden (3000 Millisekunden)
                }
            }

            // Beispielaufruf der Funktion
            checkAndConnectNextUrl();
        } else {
            // Element is not visible, so proceed with the actions
            // Check if the Referral Code is in the URL, if not, add it
            var currentURL = window.location.href;
            var referralCode = '[email protected]';

            if (!currentURL.includes(referralCode)) {
                currentURL += referralCode;
                window.location.href = currentURL; // Redirect with the updated URL
            } else {
                // Continue with actions as the Referral Code is already present
                // If the Faucetpay email field is found, fill it with the saved email address
                var faucetpayEmailInput = document.querySelector("#address");
                if (faucetpayEmailInput) {
                    // Abrufen und Einsetzen des gespeicherten Werts
                    var storedEmail = GM_getValue('storedEmail', '');
                    faucetpayEmailInput.value = storedEmail;

                    var loginbutton = document.querySelectorAll('button[data-target="#captchaModal"]');
                    loginbutton[0].click();

                    if (document.querySelector("#captchaModal").innerText.includes('AntiBot links')) {
                        // Check if the pop-up/overlay appears and click the login button if conditions are met
                        var intervalId = setInterval(function() {
                            var antibotLinksValue = document.querySelector("#antibotlinks").value.length;
                            var recaptchaResponseValue = document.querySelector("#g-recaptcha-response").value.length;

                            if (antibotLinksValue > 1 && recaptchaResponseValue > 1) {
                                clearInterval(intervalId);

                                // Click the login button
                                clickButton("#login");
                            }
                        }, 1000);
                    } else {
                        // Check if the pop-up/overlay appears and click the login button if conditions are met
                        var intervalId2 = setInterval(function() {
                            var recaptchaResponseValue = document.querySelector("#g-recaptcha-response").value.length;

                            if (recaptchaResponseValue > 1) {
                                clearInterval(intervalId2);

                                // Click the login button
                                clickButton("#login");
                            }
                        }, 1000);
                    }
                }

            }
        }
    }

    // Dutchycorp Script
    websites.forEach(website => {
        if (website.active && window.location.href.includes(website.url)) {
            setTimeout(function(){
                location.reload();
            }, 180000);

            if (window.location.href == "https://autofaucet.dutchycorp.space/signup.php") {
                if (window.location.href != "https://autofaucet.dutchycorp.space/signup.php?r=Andrewblood&s=Script") {
                    window.location.replace("https://autofaucet.dutchycorp.space/signup.php?r=Andrewblood&s=Script");
                }
            }

            if (window.location.href == "https://autofaucet.dutchycorp.space/dashboard.php") {
                window.location.replace("https://autofaucet.dutchycorp.space/roll.php");
            }

            if (window.location.href.includes("https://autofaucet.dutchycorp.space/roll.php")) {
                if (!document.querySelector("#timer")) {
                    setInterval(function() {
                        if (isCaptchaChecked()) {
                            if (document.querySelector(".boost-btn.unlockbutton")) {
                                document.querySelector(".boost-btn.unlockbutton").click();
                            }
                            if (visibleCheck(document.querySelector("#claim_boosted"))) {
                                document.querySelector("#claim_boosted").click();
                            }
                        }
                    }, 5000);
                } else {
                    setTimeout(function() {
                        window.location.replace("https://autofaucet.dutchycorp.space/coin_roll.php");
                    }, 5000);
                }
            }

            if (window.location.href.includes("https://autofaucet.dutchycorp.space/coin_roll.php")) {
                if (!document.querySelector("#timer")) {
                    setInterval(function() {
                        if (isCaptchaChecked()) {
                            if (document.querySelector(".boost-btn.unlockbutton")) {
                                document.querySelector(".boost-btn.unlockbutton").click();
                            }
                            if (visibleCheck(document.querySelector("#claim_boosted"))) {
                                document.querySelector("#claim_boosted").click();
                            }
                        }
                    }, 5000);
                } else {
                    setTimeout(function() {
                        window.location.replace("https://autofaucet.dutchycorp.space/ptc/wall.php");
                    }, 5000);
                }
            }

            if (window.location.href.includes("https://autofaucet.dutchycorp.space/ptc/wall.php")) {
                var wallLink = document.querySelectorAll(".col.s10.m6.l4 a[name='claim']");
                if (wallLink.length >= 1) {
                    wallLink[0].style.backgroundColor = "red";
                    let match = wallLink[0].onmousedown.toString().match(/'href', '(.+)'/);
                    let hrefValue = match[1];
                    setTimeout(function() {
                        window.location.replace("https://autofaucet.dutchycorp.space" + hrefValue);
                    }, 5000);
                } else {
                    setTimeout(function() {
                        window.location.replace("https://autofaucet.dutchycorp.space/ptc/");
                    }, 5000);
                }
            }

            if (window.location.href.includes("https://autofaucet.dutchycorp.space/ptc/view")) {
                setInterval(function() {
                    if (document.querySelector("#sec").innerText === 'Payout in  0 seconds') {
                        document.getElementsByClassName("g-recaptcha bordeaux-btn btn-small waves-effect waves-red")[0].click();
                        setTimeout(function() {
                            console.log("Wait for Captcha");
                        }, 30000);
                    } else {
                        console.log("Wait on timer.");
                    }
                }, 5000);
            }

            if (window.location.href === "https://autofaucet.dutchycorp.space/ptc/") {
                setInterval(function() {
                    if (document.querySelector("body > div.col.s12 > div.row > div.col.s12.m12.l10 > center:nth-child(1) > h4")) {
                        if (document.querySelector("body > div.col.s12 > div.row > div.col.s12.m12.l10 > center:nth-child(1) > h4").innerText == ' All Available Ads Watched') {
                            window.close();
                        }
                    } else if (document.querySelector("#sec").innerText == 'Payout in  0 seconds') {
                        document.getElementsByClassName("g-recaptcha gradient-btn btn-small waves-effect waves-purple")[0].click();
                        setTimeout(function() {
                            console.log("Wait for Captcha");
                        }, 30000);
                    } else {
                        console.log("Wait on timer.");
                    }
                }, 5000);
            }

        }
    });

    // Freebitco.in Script
    websites.forEach(website => {
        if (website.active && window.location.href.includes(website.url)) {
            if (window.location.href.includes("https://freebitco.in/signup/?op=s")) {
                if (window.location.href != ("https://freebitco.in/signup/?op=s&r=3595810")) {
                    window.location.replace("https://freebitco.in/signup/?op=s&r=3595810");
                }
            }

            if (window.location.href.includes("https://freebitco.in/?op=home")) {
                if (document.querySelector("#free_play_form_button").style.display == "none") {
                    console.log("Wait for next Roll.");
                    setTimeout(function() {
                        window.close();
                    }, 1000 * 30);
                } else {
                    if (document.querySelector("#free_wof_spins_msg > a:nth-child(3)")) {
                        console.log("Make the WoF Spins.");
                        window.open("https://freebitco.in/static/html/wof/wof-premium.html");
                    }
                    console.log("Let's look for Bonus");
                    document.querySelector("body > div.large-12.fixed > div > nav > section > ul > li:nth-child(8) > a").click();
                    document.querySelector("#rewards_tab > div.row.reward_category_container_main_div > div > div:nth-child(4) > div.reward_category_name").click();
                    setTimeout(function() {
                        var yourrwp = parseFloat(document.querySelector("#rewards_tab > div:nth-child(2) > div > div.reward_table_box.br_0_0_5_5.user_reward_points.font_bold").innerText.replace(/,/, ''));
                        console.log("Your current Reward Points are:");
                        console.log(yourrwp);
                        var bonuscost = parseFloat(document.querySelector("#fp_bonus_rewards > div:nth-child(2) > div:nth-child(2) > div.large-6.small-12.columns > div").innerText.replace(/,/, ''));
                        console.log("The Price for 1000% BTC-Bonus is:");
                        console.log(bonuscost);
                        if (yourrwp > bonuscost) {
                            document.querySelector("#fp_bonus_rewards > div:nth-child(2) > div:nth-child(2) > div:nth-child(3) > button").click();
                        } else {
                            console.log("Your balance is too low to buy.");
                        }
                        document.querySelector("#free_play_link_li > a").click();
                    }, 1000 * 5);

                    // Make the Roll
                    setTimeout(function() {
                        if (document.querySelector("#anchor")) {
                            console.log("Wait for Captcha and.....");

                            if (isCaptchaChecked()) {
                                document.querySelector("#free_play_form_button").click();
                                setTimeout(function() {
                                    window.close();
                                }, 1000 * 30);
                            }
                        } else {
                            document.querySelector("#free_play_form_button").click();
                            setTimeout(function() {
                                window.close();
                            }, 1000 * 10);
                        }
                    }, 1000 * 10);
                }
            }

            if (window.location.href.includes("https://freebitco.in/static/html/wof/wof-premium.html")) {
                setTimeout(function() {
                    document.querySelector("#wofc-section > div > div.wofc-spins > p > button:nth-child(2)").click();
                }, 1000 * 10);
                setTimeout(function() {
                    window.close();
                }, 1000 * 30);
            }
        }
    });

})();