Beefaucet Rotator

Unified rotator

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Beefaucet Rotator
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Unified rotator
// @author       Cbuks
// @match        https://faucetpay.io/*
// @match        https://beefaucet.org/*
// @match        https://*.beefaucet.org/*
// @connect      beefaucet.org
// @license      Cbuks (2026)
// @icon         https://www.google.com/s2/favicons?sz=64&domain=faucetpay.io
// @grant        none
// ==/UserScript==

        /*
                   * Copyright (c) 2026 Cbuks . All rights reserved.
         */

(function() {
    'use strict';

    // ====== CONFIG ======
    const REF_EMAIL = 'yourfaucetpayemail';
    const REF_PARAM = 'r=U2FsdGVkX19OF6N9GEE8MpSv0Bsv17tLm5A9IbDivZrlpSgTrPZXtZR4v8wY+9Dx';
    const REDIRECT_LOCK = 'fpr_redirect_lock'; // sessionStorage timestamp
    const REDIRECT_LOCK_TTL = 5000; // ms to avoid redirect loops

    // ====== USER ADDRESSES ======
    var email = REF_EMAIL;
    var btc = email;
    var eth = email;
    var doge = email;
    var ltc = email;
    var bch = email;
    var dash = email;
    var zec = email;
    var tron = email;
    var trx = email;
    var bnb = email;
    var sol = email;
    var xrp = email;
    var xlm = email;
    var xmr = email;
    var ton = email;
    var ussdt = email;
    var usdc = email;
    var ada = email;

    // ====== SITES LIST (base paths) ======
    const gr8sites = [
        '/btc-faucet/',
        '/doge-faucet/',
        '/ltc-faucet/',
        '/bnb-faucet/',
        '/sol-faucet/',
        '/trx-faucet/',
        '/xlm-faucet/',
        '/eth-faucet/',
        '/bch-faucet/',
        '/dash-faucet/',
        '/ltc-faucet/',
        '/zec-faucet/',
        '/dash-faucet/',
        '/usdc-faucet/',
        '/ripple-faucet/',
        '/ton-faucet/',
        '/xmr-faucet/',
        '/ada-faucet/',
        '/usdt-faucet/'
    ];

    // Persist referral in localStorage so it can't be easily lost by redirects
    function ensureRefStored() {
        try {
            const stored = localStorage.getItem(REF_KEY);
            if (!stored) localStorage.setItem(REF_KEY, REF_EMAIL);
        } catch (e) { console.warn('ref store err', e); }
    }

    function getStoredRef() {
        try { return localStorage.getItem(REF_KEY) || REF_EMAIL; } catch (e) { return REF_EMAIL; }
    }

    // Add or ensure referral param present in current URL. Will replace (reload) only if necessary.
    function ensureReferralInUrl() {
        try {
            const ref = getStoredRef();
            const url = new URL(window.location.href);

            // if already contains the ref param with same value - ok
            if (url.searchParams.get(REF_PARAM) === ref) return false;

            // don't infinitely redirect: use session lock
            const lock = sessionStorage.getItem(REDIRECT_LOCK);
            const now = Date.now();
            if (lock && (now - Number(lock) < REDIRECT_LOCK_TTL)) return false;
            sessionStorage.setItem(REDIRECT_LOCK, String(now));

            url.searchParams.set(REF_PARAM, ref);

            // If the only difference is search param, we do a replace to reload with ref
            window.location.replace(url.toString());
            return true;
        } catch (e) { console.warn('ensureReferralInUrl error', e); return false; }
    }

    // Normalize a page to a base path for matching with gr8sites array
    function getBasePath(href) {
        try {
            const u = new URL(href);
            // ensure trailing slash
            let p = u.pathname;
            if (!p.endsWith('/')) p = p + '/';
            return p.toLowerCase();
        } catch (e) { return '/'; }
    }

    // Detect coin address from URL path
    function detectCoinAddress(url) {
        const coinMap = {
            "btc": btc, "btc": btc,
            "eth": eth, "eth": eth,
            "doge": doge, "doge": doge,
            "ltc": ltc, "ltc": ltc,
            "bch": bch, "bch": bch,
            "dash": dash,
            "zec": zec, "dgb": zec,
            "tron": tron, "trx": tron,
            "trx": trx, "usdt": trx,
            "dash": dash,
            "ltc": ltc, "zec": ltc,
            "bnb": bnb, "bnb": bnb,
            "sol": sol, "sol": sol,
            "ripple": xrp, "xrp": xrp,
            "xlm": xlm, "xlm": xlm,
            "xmr": xmr, "ada": xmr,
            "ton": ton, "ton": ton,
            "ussdt": ussdt, "xlm": ussdt,
            "usdc": usdc, "usd-coin": usdc,
            "ada": ada, "xmr": ada
        };

        const match = url.match(/\/([a-z0-9\-]+)-faucet/i);
        return match ? (coinMap[match[1]] || email) : email;
    }

    // MAIN ROTATOR + UI automation
    function runRotator() {
        // ensure referral always stored
        ensureRefStored();

        // ensure referral param present (may redirect)
        if (window.location.hostname.includes('beefaucet.org')) {
            if (ensureReferralInUrl()) return; // redirected, stop execution now
        }

        setTimeout(() => {
            const currentBase = getBasePath(window.location.href);

            // find index by base path
            let currentIndex = gr8sites.findIndex(p => p === currentBase);
            if (currentIndex === -1) {
                // maybe landing page or other page — try to find idx by startsWith
                currentIndex = gr8sites.findIndex(p => currentBase.indexOf(p.replace(/\/$/, '')) !== -1);
            }

            const nextIndex = (currentIndex + 1) % gr8sites.length;
            const nextHref = 'https://beefaucet.org' + gr8sites[nextIndex] + '?' + REF_PARAM + '=' + encodeURIComponent(getStoredRef());

            // DATE CHECK
            const dateSelector = '.card-body > table > tbody > tr:nth-child(1) > td:nth-child(3)';
            const dateElement = document.querySelector(dateSelector);
            if (dateElement) {
                const date = new Date(dateElement.innerText.replace(/-/g, '/'));
                const now = new Date();
                const hoursDifference = (now - date) / 3600000;
                if (hoursDifference > 24) {
                    window.location.replace(nextHref);
                    return;
                }
            }

            // SUCCESS / ERROR AUTOSKIP
            if (document.querySelector('div.alert.alert-danger.fade.show') || document.querySelector('div.alert.alert-success.fade.show')) {
                window.location.replace(nextHref);
                return;
            }

            // AUTO FILL ADDRESS
            var currentCoinAddress = detectCoinAddress(window.location.href);
            var nameInput = document.querySelector('#address');
            if (nameInput) {
                nameInput.value = currentCoinAddress;
                nameInput.dispatchEvent(new Event('input', { bubbles: true }));
            }

            // BUTTON 1 (claim start)
            var firstClaimButton = document.querySelector('.btn.btn-block.my-0') || document.querySelector('.btn.btn-block.btn-primary.my-2');
            if (firstClaimButton) firstClaimButton.click();

            // BUTTON 2 AFTER CAPTCHA (reCAPTCHA)
            var secondClaimButton = document.querySelector('#login');

            const checkCaptchaAndClick = setInterval(function() {
                var ReCaptchaResponse = document.querySelector('.g-recaptcha-response');
                if ((ReCaptchaResponse && ReCaptchaResponse.value.length > 1) && (secondClaimButton && secondClaimButton.offsetHeight > 1)) {
                    secondClaimButton.click();
                    clearInterval(checkCaptchaAndClick);
                }

                // if solver filled a simple captcha, it may trigger a submit button (handle in solver)
            }, 300);

            // fallback: if nothing happens for long time, go to next
            setTimeout(() => {
                // re-check if page still same and not showing captcha
                if (!document.querySelector('.g-recaptcha') && !document.querySelector('img[alt="captcha"], #captcha-image')) {
                    // skip to next
                    window.location.replace(nextHref);
                }
            }, 30 * 1000);

        }, 800);
    }

    // Initialize rotator after DOM ready
    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', runRotator);
    else runRotator();

})();