// ==UserScript== // @name [Premium] Faucet Monitor with Faucetpay ReCaptcha/Antibot Rotator // @namespace https://greasyfork.org/users/1162863 // @version 1.8.2 // @description Automates form filling and button clicking on Faucetpay Faucet websites, with ReCaptcha/Antibot handling. // @author Andrewblood // @match https://www.coinfinity.top/downloads.php // @match https://sollcrypto.com/home/page/* // @match https://cryptoclaps.com/earn/* // @icon https://www.google.com/s2/favicons?sz=64&domain=faucetpay.io // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @antifeature referral-code // @license Andrewblood // @downloadURL none // ==/UserScript== /* Automates form filling and button clicking on Faucetpay Faucet websites, with ReCaptcha/Antibot handling. Features: - Automatically fills and clicks buttons on supported Faucetpay Faucet websites. - If the claim is done, it redirects to the next supported Faucet URL. - Saves empty pages with timestamps to prevent revisiting within 6 hours. - Provides an overlay for managing saved pages, clearing stored pages, displaying them, and saving Faucetpay email. */ (function() { 'use strict'; // Function to click a button function clickButton(selector) { var button = document.querySelector(selector); if (button) { button.click(); } } // Function to check if an element is visible function isElementVisible(selector) { var element = document.querySelector(selector); return element && element.offsetWidth > 0 && element.offsetHeight > 0; } 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://cryptoclaps.com/earn/dogecoin/", "https://cryptoclaps.com/earn/tron/", "https://cryptoclaps.com/earn/digibyte/", "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/feyorra/", "https://cryptoclaps.com/earn/zcash/", ]; // 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 = 'Other Requirements'; // Add event listener for otherRequirementsButton otherRequirementsButton.addEventListener('click', function() { // 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'; // Define the list of extensions and scripts with install buttons var requirementsList = [ { name: 'ReCaptcha: hektCaptcha: hCaptcha Solver', installUrl: 'https://github.com/Wikidepia/hektCaptcha-extension' }, { name: 'Antibot Words: 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); }); // Append the list and close button to the overlay otherRequirementsOverlay.appendChild(list); otherRequirementsOverlay.appendChild(closeRequirementsButton); // Add the overlay to the body document.body.appendChild(otherRequirementsOverlay); }); // 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 = 'Show Sites'; // Add an event listener for the showStoredUrlsButton showStoredUrlsButton.addEventListener('click', function() { // 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 = 'Delete All Times'; // 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 = ['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(); var urlCell = row.insertCell(0); urlCell.style.border = '1px solid #ddd'; urlCell.style.padding = '8px'; urlCell.textContent = urlEntry.url; var statusCell = row.insertCell(1); statusCell.style.border = '1px solid #ddd'; statusCell.style.padding = '8px'; statusCell.style.color = getStatusColor(urlEntry); statusCell.textContent = getStatusText(urlEntry); var deleteCell = row.insertCell(2); deleteCell.style.border = '1px solid #ddd'; deleteCell.style.padding = '8px'; // Create delete button for each row var deleteButton = document.createElement('button'); deleteButton.textContent = 'Delete Time'; 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); // Add the overlay to the body document.body.appendChild(overlayTable); }); // 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 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'); } } // Create an email input field var emailInput = document.createElement('input'); emailInput.type = 'text'; emailInput.id = 'emailInput'; emailInput.placeholder = 'Faucetpay Email'; emailInput.style.padding = '5px'; // Create a save email button var saveEmailButton = document.createElement('button'); saveEmailButton.id = 'saveEmailButton'; saveEmailButton.style.padding = '5px'; saveEmailButton.style.marginLeft = '5px'; saveEmailButton.textContent = 'Save'; // Add elements to the overlay overlay.appendChild(otherRequirementsButton); overlay.appendChild(showStoredUrlsButton); overlay.appendChild(emailInput); overlay.appendChild(saveEmailButton); // Add overlay to the body document.body.appendChild(overlay); // Get email value from Tampermonkey storage var storedEmail = GM_getValue('storedEmail', ''); // Populate saved email address into the input field emailInput.value = storedEmail; // Add event listener for save email button saveEmailButton.addEventListener('click', function() { // Save entered email address var newEmail = emailInput.value; GM_setValue('storedEmail', newEmail); // Success notification (can be customized) alert('Email address saved successfully!'); }); var currentURL = window.location.href; if (currentURL.includes("https://sollcrypto.com/home/page/") || currentURL.includes("https://cryptoclaps.com/earn/")) { 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 = "body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > center > div.form > div.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() + 4 * 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 = "body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > center > div.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'; var timestamp2 = new Date(new Date().getTime() + 8 * 60 * 60 * 1000).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("body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > center > div.form > div.alert.alert-success.fade.show") && document.querySelector("body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > center > div.form > div.alert.alert-success.fade.show").innerText.includes('satoshi')) || (isElementVisible("body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > center > div.form > div.alert.alert-danger.fade.show") && document.querySelector("body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > center > div.form > div.alert.alert-danger.fade.show").innerText === ' The faucet does not have sufficient funds for this transaction.') || (isElementVisible("body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > center > div.alert.alert-danger.fade.show") && document.querySelector("body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > center > div.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 Prüfen und Verbinden mit einer gültigen URL function checkAndConnectNextUrl() { // Index der aktuellen URL in der Liste finden var currentUrlIndex = urls.indexOf(window.location.href); // Wenn die aktuelle URL gefunden wurde, starte die Überprüfung ab der nächsten URL if (currentUrlIndex !== -1) { currentUrlIndex++; } var urlsChecked = 0; // Überprüfen, ob es noch weitere URLs in der Liste gibt und nicht mehr URLs überprüft wurden als insgesamt vorhanden sind while (urlsChecked < urls.length) { // Wenn alle URLs überprüft wurden, die Schleife beenden if (urlsChecked === urls.length) { break; } // Wenn der Index das Ende der Liste erreicht hat, setze ihn auf 0, um von vorne zu beginnen if (currentUrlIndex === urls.length) { currentUrlIndex = 0; } var nextUrl = urls[currentUrlIndex]; // Überprüfen, ob die URL bereits in storedUrls ist und der Timestamp in der Zukunft liegt var storedUrlIndex = storedUrls.findIndex(function (storedUrl) { return storedUrl.url === nextUrl && new Date(storedUrl.timestamp) > new Date(); }); // Wenn die URL nicht in storedUrls vorhanden ist oder der Timestamp in der Vergangenheit liegt if (storedUrlIndex === -1 || new Date(storedUrls[storedUrlIndex].timestamp) <= new Date()) { // Verbinden mit der gefundenen URL und die Funktion beenden window.location.href = nextUrl; return; } // Wenn die URL bereits in storedUrls vorhanden ist und der Timestamp in der Zukunft liegt, die nächste URL überprüfen currentUrlIndex++; urlsChecked++; } // Wenn keine gültige URL gefunden wurde, hier entsprechende Aktionen durchführen console.log("Keine gültige URL gefunden."); } // 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 = '?r=m.warchol@gmx.at'; 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) { faucetpayEmailInput.value = storedEmail; // Click the button after inserting the email address clickButton("body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > center > form > div:nth-child(4) > button"); // 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); } } } } })();