Freebitco.in Smart Auto Claim - v5.0 (Full Cloudflare + Telegram)

Fully automated Freebitco.in auto roll with Cloudflare click, wait check, and Telegram alerts

// ==UserScript==
// @name         Freebitco.in Smart Auto Claim - v5.0 (Full Cloudflare + Telegram)
// @namespace    http://tampermonkey.net/
// @version      5.0
// @description  Fully automated Freebitco.in auto roll with Cloudflare click, wait check, and Telegram alerts
// @author       Zaw
// @match        https://freebitco.in/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    // ----------- Configurations -----------
    const CLAIM_INTERVAL = 60 * 60 * 1000; // 1 hour
    const FALLBACK_RELOAD = 10 * 60 * 1000; // 10 min

    const TELEGRAM_TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN'; //Replace YOUR_TELEGRAM_BOT_TOKEN & YOUR_CHAT_ID with your actual values
    const TELEGRAM_CHAT_ID = 'YOUR_CHAT_ID'; //Replace YOUR_TELEGRAM_BOT_TOKEN & YOUR_CHAT_ID with your actual values

    const SELECTOR_CLAIM_BTN = "#free_play_form_button";
    const SELECTOR_CLOUDFLARE_CHECKBOX = "input[type='checkbox']";
    const SELECTOR_CLOUDFLARE_MARK = "span.mark";
    const SELECTOR_VERIFY_BTNS = [
        "input[value*='Verify']",
        "button#verify_play",
        "input[type='button'][value*='Verify']",
        "button"
    ];

    let claimed = false;

    // ----------- Telegram Alert -----------
    function sendTelegram(msg) {
        fetch(`https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage`, {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({
                chat_id: TELEGRAM_CHAT_ID,
                text: `[Freebitco.in Bot]\n${msg}`,
                parse_mode: "Markdown"
            })
        }).catch(console.error);
    }

    // ----------- Time Tracking -----------
    function getLastClaim() {
        return parseInt(localStorage.getItem("fbtc_last") || "0");
    }
    function setLastClaim(ts) {
        localStorage.setItem("fbtc_last", ts.toString());
    }

    // ----------- Wait for Element -----------
    function waitFor(selector, timeout = 20000) {
        return new Promise((resolve, reject) => {
            const start = Date.now();
            const interval = setInterval(() => {
                const el = document.querySelector(selector);
                if (el && el.offsetParent !== null && !el.disabled) {
                    clearInterval(interval);
                    resolve(el);
                } else if (Date.now() - start > timeout) {
                    clearInterval(interval);
                    reject(new Error("Timeout: " + selector));
                }
            }, 500);
        });
    }

    // ----------- Cloudflare CAPTCHA Click -----------
    async function clickCloudflareCaptcha() {
        try {
            const checkbox = await waitFor(SELECTOR_CLOUDFLARE_CHECKBOX, 8000);
            checkbox.click();
            console.log("[v5.0] Clicked CAPTCHA checkbox.");

            const mark = await waitFor(SELECTOR_CLOUDFLARE_MARK, 8000);
            mark.click();
            console.log("[v5.0] Clicked CAPTCHA mark.");
        } catch (e) {
            console.warn("[v5.0] Cloudflare click failed:", e.message);
        }
    }

    // ----------- Main Logic -----------
    async function claimFlow() {
        const now = Date.now();
        const last = getLastClaim();

        if (now - last < CLAIM_INTERVAL) {
            console.log(`[v5.0] Not time yet. Wait ${(CLAIM_INTERVAL - (now - last)) / 60000} mins`);
            return;
        }

        try {
            await clickCloudflareCaptcha();

            // Try verify buttons
            for (let sel of SELECTOR_VERIFY_BTNS) {
                try {
                    const btn = await waitFor(sel, 5000);
                    btn.click();
                    console.log("[v5.0] Clicked verify button.");
                    break;
                } catch (_) {}
            }

            const claimBtn = await waitFor(SELECTOR_CLAIM_BTN, 10000);
            claimBtn.click();
            setLastClaim(Date.now());
            claimed = true;
            sendTelegram("✅ Successfully claimed at " + new Date().toLocaleTimeString());
            console.log("[v5.0] Claim successful.");
        } catch (err) {
            sendTelegram("⚠️ Claim failed: " + err.message);
            console.error("[v5.0] Error:", err);
        }
    }

    // ----------- Fallback Timer -----------
    setTimeout(() => {
        if (!claimed) {
            console.log("[v5.0] Fallback: reload");
            sendTelegram("🔁 Reloading after 10 mins (no claim)");
            location.reload();
        }
    }, FALLBACK_RELOAD);

    // ----------- Auto Check Interval -----------
    setInterval(() => {
        if (!claimed && Date.now() - getLastClaim() >= CLAIM_INTERVAL) {
            location.reload();
        }
    }, 60000);

    // ----------- Initial Trigger -----------
    window.addEventListener("load", () => {
        setTimeout(claimFlow, 2500);
    });
})();
长期地址
遇到问题?请前往 GitHub 提 Issues。