Beefaucet Rotator

Unified rotator

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==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();

})();