Beefaucet Rotator

Unified rotator

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

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

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==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();

})();