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