您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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); }); })();