Auto login, auto captcha solver. / Auto shortlinks soon.
// ==UserScript==
// @name BitFaucet Auto Claim
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Auto login, auto captcha solver. / Auto shortlinks soon.
// @author Rubystance
// @license MIT
// @match https://bitfaucet.net/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
const email = "YOUR_FAUCETPAY_EMAIL_HERE"; // ← Replace with your FaucetPay email
const maxClaims = 50;
const claimInterval = 15 * 1000;
const emojiMap = {
'Angry': 'angry.gif',
'Love': 'love.gif',
'Sad': 'sad.gif',
'Flame': 'flame.gif',
'Haha': 'haha.gif',
'Like': 'like.gif',
};
function waitForElement(selector, callback, timeout = 15000) {
const interval = 200;
let elapsed = 0;
const loop = setInterval(() => {
const el = document.querySelector(selector);
if (el) {
clearInterval(loop);
callback(el);
} else if ((elapsed += interval) >= timeout) {
clearInterval(loop);
console.warn("⌛ Timeout waiting for:", selector);
}
}, interval);
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function fillEmail() {
const input = document.querySelector('#InputEmail');
if (input && input.value.trim() === "") {
input.value = email;
console.log("📩 Email filled.");
}
}
async function solveEmojiCaptchaUniversal() {
const question = document.querySelector('[data-id="question-text"]');
if (!question) return false;
const questionText = question.textContent.trim();
const match = questionText.match(/Please click on the : (\w+)/);
if (!match || !match[1]) return false;
const emojiName = match[1];
const emojiIcon = emojiMap[emojiName];
if (!emojiIcon) return false;
const emojiElement = document.querySelector(`.captcha-item[data-icon="${emojiIcon}"]`);
if (emojiElement) {
emojiElement.click();
const hiddenInput = document.querySelector('input[name="selected_icon"][data-id="selected-icon"]');
if (hiddenInput) hiddenInput.value = emojiIcon;
console.log(`✅ Clicked emoji: "${emojiName}"`);
await sleep(1500);
return true;
}
return false;
}
async function clickLoginButton() {
const button = document.querySelector('button.btn-one[type="submit"]');
if (button) {
await sleep(1000);
button.click();
console.log("🔓 Login submitted.");
}
}
function goToFaucetLTC() {
const ltcLink = document.querySelector('a[href*="/faucet/currency/ltc"]');
if (ltcLink) {
console.log("➡️ Navigating to Faucet LTC...");
window.location.href = ltcLink.href;
}
}
async function tryClickClaimButton(count = 0) {
if (count >= maxClaims) {
console.log("🚫 50 claim limit reached.");
return;
}
const captchaPresent = document.querySelector('[data-id="question-text"]');
if (captchaPresent) {
console.log("🔄 Solving emoji captcha...");
const solved = await solveEmojiCaptchaUniversal();
if (!solved) {
console.log("❌ Failed to solve captcha. Retrying in 3s...");
return setTimeout(() => tryClickClaimButton(count), 3000);
}
console.log("⏳ Waiting 3 seconds before clicking 'Get Reward'...");
await sleep(3000);
}
waitForElement('button.btn.sl_btn', async (button) => {
if (button && !button.disabled) {
console.log(`✅ Claim #${count + 1} submitted...`);
button.click();
await sleep(claimInterval);
location.reload();
setTimeout(() => tryClickClaimButton(count + 1), 10000);
} else {
console.log("⏳ Claim button not available yet. Retrying in 5s...");
setTimeout(() => tryClickClaimButton(count), 5000);
}
}, 20000);
}
async function startLogin() {
fillEmail();
await sleep(2000);
const captchaOk = await solveEmojiCaptchaUniversal();
if (captchaOk) {
await sleep(2000);
await clickLoginButton();
} else {
console.log("❌ Could not solve emoji captcha at login.");
}
}
// === Page Routing ===
if (window.location.pathname === "/" || window.location.pathname.includes("login")) {
waitForElement('#InputEmail', startLogin);
}
if (window.location.href === "https://bitfaucet.net/dashboard") {
setTimeout(goToFaucetLTC, 4000);
}
if (window.location.href.includes("/faucet/currency/ltc")) {
console.log("🚿 LTC Faucet page detected.");
waitForElement('[data-id="question-text"]', async () => {
await solveEmojiCaptchaUniversal();
await sleep(4000);
tryClickClaimButton();
}, 15000);
}
})();