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

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

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