FULL-EDGE FreeBTC

https://freebitco.in/?r=1393623

// ==UserScript==
// @name         FULL-EDGE FreeBTC 
// @namespace    https://github.com/DevZurvan
// @namespace    https://gf.qytechs.cn/en/users/1295753-hyago-nunes
// @version      10.1
// @description  https://freebitco.in/?r=1393623
// @author       Zurvan
// @icon         https://raw.githubusercontent.com/DevZurvan/Full-Edge/main/assets/icon.png
// @match        https://freebitco.in/*
// @match        https://*/recaptcha/*
// @match        https://*.hcaptcha.com/*hcaptcha-challenge*
// @match        https://*.hcaptcha.com/*checkbox*
// @match        https://*.hcaptcha.com/*captcha*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // UTILITÁRIOS BÁSICOS
    function qSelector(selector) { return document.querySelector(selector); }
    function isHidden(el) { return (el.offsetParent === null); }
    function random(min, max) { return min + (max - min) * Math.random(); }

    // CONFIGURAÇÃO
    const CONFIG = {
        tentativasMaximas: 7,
        intervaloCaptcha: 3000,
        rollDelay: 7000,
        playWithoutCaptchaDelay: 12000,
        secondRollDelay: 14000,
        intervaloVerificacao: 1000,
        intervaloBackground: 30000,
        hcCheckBox: "#checkbox",
        hcAriaChecked: "aria-checked",
        rcCheckBox: ".recaptcha-checkbox-border",
        rcStatus: "#recaptcha-accessible-status",
        rcDosCaptcha: ".rc-doscaptcha-body",
        rollButton: "#free_play_form_button",
        playWithoutCaptchaButton: "#play_without_captchas_button",
        timerElement: "#time_remaining",
        cfIframeSelector: 'iframe[src*="challenges.cloudflare.com"]',
        cfResponseInput: "#cf-chl-widget-a1bva_response",
        cfSuccessSelector: "#success-i > circle",
        use2Captcha: true,
        turnstileSitekey: "a1bva",
        apiKey2Captcha: "e6e564ccebe70607715fa0e7a2188482",
        btcBalanceSelector: '#balance',
        btcStorageKeys: {
            initial: 'Full-Edge_initial_btc',
            gained: 'Full-Edge_gained_btc',
            lastRoll: 'Full-Edge_last_roll'
        }
    };

    // ESTADO
    let state = {
        modoOperacao: 0,
        tentativas: 0,
        ultimaExecucao: 0
    };

    // GERENCIAMENTO DE ESTADO
    function carregarEstado() {
        try {
            chrome.storage.local.get('stateFreeBTC', function(result) {
                if (result.stateFreeBTC) {
                    state = Object.assign(state, JSON.parse(result.stateFreeBTC));
                }
            });
        } catch (e) { console.error(e); }
    }

    function salvarEstado() {
        try {
            chrome.storage.local.set({
                'stateFreeBTC': JSON.stringify(state)
            });
        } catch (e) { console.error(e); }
    }

    // POPUP MANAGER
    const PopupManager = {
        fecharPopups() {
            ['.pushly_popover-container', '#onesignal-slidedown-container', '#notification_permission']
                .forEach(sel => { const el = qSelector(sel); if (el) el.style.display = 'none'; });
        }
    };

    // CAPTCHA HANDLERS
    function resolverHcaptcha() {
        if (window.location.href.includes("hcaptcha")) {
            const interval = setInterval(() => {
                const checkbox = qSelector(CONFIG.hcCheckBox);
                if (!checkbox) return;
                if (checkbox.getAttribute(CONFIG.hcAriaChecked) === "true") {
                    clearInterval(interval);
                    console.log("Hcaptcha resolvido");
                } else if (!isHidden(checkbox) && checkbox.getAttribute(CONFIG.hcAriaChecked) === "false") {
                    checkbox.click();
                    clearInterval(interval);
                    console.log("Hcaptcha: abrindo checkbox");
                }
            }, Number(CONFIG.intervaloCaptcha));
        }
    }

    function resolverRecaptcha() {
        if (window.location.href.includes("recaptcha")) {
            setTimeout(() => {
                let initialStatus = qSelector(CONFIG.rcStatus) ? qSelector(CONFIG.rcStatus).innerText : "";
                try {
                    if (qSelector(CONFIG.rcCheckBox) && !isHidden(qSelector(CONFIG.rcCheckBox))) {
                        qSelector(CONFIG.rcCheckBox).click();
                        console.log("Recaptcha: abrindo checkbox");
                    }
                    if (qSelector(CONFIG.rcStatus) && qSelector(CONFIG.rcStatus).innerText !== initialStatus) {
                        console.log("Recaptcha resolvido");
                    }
                    if (qSelector(CONFIG.rcDosCaptcha) && qSelector(CONFIG.rcDosCaptcha).innerText.length > 0) {
                        console.log("Recaptcha: consulta automatizada detectada");
                    }
                } catch (err) { console.error(err.message); }
            }, Number(CONFIG.intervaloCaptcha));
        }
    }

    // TURNSTILE HANDLERS
    function resolverTurnstileClique() {
        const cfIframe = qSelector(CONFIG.cfIframeSelector);
        if (cfIframe && cfIframe.contentDocument) {
            const checkbox = cfIframe.contentDocument.querySelector('.mark');
            if (checkbox && !isHidden(checkbox)) {
                if (simularCliqueHumano(checkbox)) {
                    console.log("Turnstile resolvido via clique");
                    return true;
                }
            }
        }
        return false;
    }

    function resolverTurnstile2Captcha(callback) {
        const reqUrl = `http://2captcha.com/in.php?key=${CONFIG.apiKey2Captcha}&method=turnstile&sitekey=${CONFIG.turnstileSitekey}&pageurl=${encodeURIComponent(window.location.href)}&json=1`;
        fetch(reqUrl)
            .then(response => response.json())
            .then(data => {
                if (data.status === 1) {
                    pollToken(data.request, callback);
                } else {
                    console.error("2Captcha Error: " + data.request);
                    callback(false);
                }
            })
            .catch(err => {
                console.error(err);
                callback(false);
            });
    }

    function pollToken(captchaId, callback) {
        const pollUrl = `http://2captcha.com/res.php?key=${CONFIG.apiKey2Captcha}&action=get&id=${captchaId}&json=1`;
        let attempts = 0;
        const pollInterval = setInterval(() => {
            attempts++;
            fetch(pollUrl)
                .then(response => response.json())
                .then(data => {
                    if (data.status === 1) {
                        clearInterval(pollInterval);
                        const token = data.request;
                        const input = qSelector(CONFIG.cfResponseInput);
                        if (input) {
                            input.value = token;
                            console.log("Turnstile resolvido via 2Captcha");
                            callback(true);
                        } else {
                            console.error("Input para Turnstile não encontrado");
                            callback(false);
                        }
                    } else if (data.request !== "CAPCHA_NOT_READY") {
                        clearInterval(pollInterval);
                        console.error("Erro polling: " + data.request);
                        callback(false);
                    }
                })
                .catch(err => {
                    console.error(err);
                    callback(false);
                });
            if (attempts >= 24) {
                clearInterval(pollInterval);
                console.error("Timeout 2Captcha polling");
                callback(false);
            }
        }, 5000);
    }

    
    function garantirReferenciador() {
        const referUrl = "https://freebitco.in/?r=1393623";
        if (!window.location.href.includes("?r=1393623")) {
            window.location.href = referUrl;
        }
    }

    // Inicialização
    function init() {
        garantirReferenciador(); 
        createUI();
        carregarEstado();
        PopupManager.fecharPopups();
        gerenciarCaptcha();
        iniciarAcoesTemporizadas();
        monitorarTimer();
        configurarVisibilidade();
        ajustarPreloadCloudflare();

        console.log("Full-Edge FreeBTC iniciado com sucesso!");
    }

    // Função para gerenciar captcha
    function gerenciarCaptcha() {
        if (window.location.href.includes("hcaptcha")) resolverHcaptcha();
        if (window.location.href.includes("recaptcha")) resolverRecaptcha();
        if (qSelector(CONFIG.cfIframeSelector)) {
            if (!resolverTurnstileClique() && CONFIG.use2Captcha) {
                resolverTurnstile2Captcha(function(success) {
                    if (!success) console.error("Falha ao resolver Turnstile via 2Captcha");
                });
            }
        }
    }

    // ACIONAMENTO DOS BOTÕES PLAY/ROLL
    function acionarRoll() {
        const btn = qSelector(CONFIG.rollButton);
        if (btn && !isHidden(btn)) {
            btn.click();
            console.log("ROLL acionado");
        }
        else console.warn("Botão ROLL não encontrado");
    }

    function acionarPlayWithoutCaptcha() {
        const btn = qSelector(CONFIG.playWithoutCaptchaButton);
        if (btn && !isHidden(btn)) {
            btn.click();
            console.log("PLAY WITHOUT CAPTCHA acionado");
        }
        else console.warn("Botão PLAY WITHOUT CAPTCHA não encontrado");
    }

    // AÇÕES TEMPORIZADAS
    function iniciarAcoesTemporizadas() {
        setTimeout(acionarRoll, CONFIG.rollDelay);
        setTimeout(acionarPlayWithoutCaptcha, CONFIG.playWithoutCaptchaDelay);
        setTimeout(acionarRoll, CONFIG.secondRollDelay);
    }

    // MONITORAMENTO DO TIMER
    function monitorarTimer() {
        setInterval(() => {
            const timer = qSelector(CONFIG.timerElement);
            if (timer) {
                const tempoFormatado = formatarTempoSimples(timer);
                const uiTimer = document.getElementById('uiTimer');
                if (uiTimer) {
                    uiTimer.textContent = tempoFormatado;
                }

                if (timer.textContent.trim().includes("00:00:00")) {
                    gerenciarCaptcha();
                    iniciarAcoesTemporizadas();
                }
            }
            monitorarBTC();
        }, 1000);
    }

    function formatarTempoSimples(elemento) {
        const secoes = elemento.querySelectorAll('.countdown_section');
        if (secoes.length < 2) return "00:00";
        const minutos = secoes[0].querySelector('.countdown_amount').textContent.padStart(2, '0');
        const segundos = secoes[1].querySelector('.countdown_amount').textContent.padStart(2, '0');
        return `${minutos}:${segundos}`;
    }

    // CONTROLE DE VISIBILIDADE
    function configurarVisibilidade() {
        document.addEventListener('visibilitychange', () => {
            if (!document.hidden) {
                console.log("Retomando operação em primeiro plano");
            } else {
                console.log("Modo segundo plano ativado");
            }
        });
    }

    // AJUSTE DO PRELOAD DO CLOUDFLARE
    function ajustarPreloadCloudflare() {
        try {
            const link = document.querySelector('link[rel="preload"][href*="challenges.cloudflare.com/cdn-cgi/challenge-platform/h/g/cmg/1"]');
            if (link) {
                link.setAttribute('as', 'script');
                console.log("Atributo 'as' ajustado para 'script' no link de preload");
            }
        } catch (e) { console.error(e); }
    }

    // Função para monitorar BTC
    function monitorarBTC() {
        const balanceEl = qSelector(CONFIG.btcBalanceSelector);
        if (!balanceEl) return;

        const currentBalance = parseFloat(balanceEl.textContent);

        // Inicializar valores do storage
        if (!localStorage.getItem(CONFIG.btcStorageKeys.initial)) {
            localStorage.setItem(CONFIG.btcStorageKeys.initial, currentBalance.toString());
            localStorage.setItem(CONFIG.btcStorageKeys.gained, '0');
            localStorage.setItem(CONFIG.btcStorageKeys.lastRoll, currentBalance.toString());
        }

        const lastRoll = parseFloat(localStorage.getItem(CONFIG.btcStorageKeys.lastRoll));
        let totalGained = parseFloat(localStorage.getItem(CONFIG.btcStorageKeys.gained));

        // Se houve mudança no saldo, atualizar ganhos
        if (currentBalance > lastRoll) {
            const rollGain = currentBalance - lastRoll;
            totalGained += rollGain;
            localStorage.setItem(CONFIG.btcStorageKeys.gained, totalGained.toString());
            localStorage.setItem(CONFIG.btcStorageKeys.lastRoll, currentBalance.toString());
        }

        // Atualizar UI com o ícone de reset "↻"
        const btcGanhoEl = document.getElementById('btcGanho');
        if (btcGanhoEl) {
            btcGanhoEl.innerHTML = totalGained.toFixed(8) + ' <span id="resetCounter" style="cursor:pointer; color: white;">↻</span> ';
            btcGanhoEl.style.color = totalGained >= 0 ? '#4CAF50' : '#f44336';
            // Atribuir função de reset ao ícone ↻
            const resetCounter = btcGanhoEl.querySelector('#resetCounter');
            if (resetCounter) {
                resetCounter.addEventListener('click', () => {
                    localStorage.setItem(CONFIG.btcStorageKeys.gained, '0');
                    localStorage.setItem(CONFIG.btcStorageKeys.lastRoll, currentBalance.toString());
                    btcGanhoEl.innerHTML = '0.00000000 <span id="resetCounter" style="cursor:pointer; color: white;">↻</span> ';
                    console.log("Contador zerado");
                });
            }
        }
    }

    // Inicialização
    if (document.readyState === 'loading') {
        window.addEventListener('load', init);
    } else {
        init();
    }

})();



function createUI() {
    const uiContainer = document.createElement('div');
    uiContainer.id = 'full-edge-ui';
    Object.assign(uiContainer.style, {
        background: 'rgba(5, 5, 5, 0.23)',          
        backdropFilter: 'blur(20px)',                      
        border: '1px solid rgba(3, 3, 3, 0.5)',        
        boxShadow: '0 10px 30px rgba(0,0,0,0.5)',       
        padding: '25px',                               
        transition: 'all 0.3s ease',
        color: '#ffffff',
        position: 'fixed',
        top: '20px',
        right: '20px',
        width: '360px', 
        borderRadius: '15px',
        fontFamily: '"Segoe UI", Tahoma, Geneva, Verdana, sans-serif',
        zIndex: '9999',
        cursor: 'move',
        boxSizing: 'border-box' 
    });

    const fontStyle = document.createElement('link');
    fontStyle.href = 'https://fonts.googleapis.com/css2?family=Cinzel:wght@700&display=swap';
    fontStyle.rel = 'stylesheet';
    document.head.appendChild(fontStyle);

    const iconAnimation = document.createElement('style');
    iconAnimation.textContent = `
        @keyframes pulseIcon {
            0% { transform: scale(1); filter: drop-shadow(0 0 10px #001f3f); }
            50% { transform: scale(1.1); filter: drop-shadow(0 0 15pxrgb(0, 19, 37)); }
            100% { transform: scale(1); filter: drop-shadow(0 0 10pxrgb(0, 15, 29)); }
        }
        @keyframes neonPulse {
            0% { box-shadow: 0 0 5pxrgba(250, 148, 59, 0.75), 0 0 10pxrgba(0, 0, 0, 0.62), 0 0 15pxrgba(0, 0, 0, 0.62) }
            50% { box-shadow: 0 0 10pxrgba(0, 0, 0, 0.62), 0 0 20pxrgba(247, 170, 102, 0.75), 0 0 30pxrgba(252, 163, 85, 0.79); }
            100% { box-shadow: 0 0 5px rgba(0, 0, 0, 0.62), 0 0 10px rgba(0, 0, 0, 0.62) rgba(0, 0, 0, 0.62) }
        }
    `;
    document.head.appendChild(iconAnimation);

    const rgbAnimation = document.createElement('style');
    rgbAnimation.textContent = `
        @keyframes rgbText {
            0% { filter: hue-rotate(0deg) brightness(1.2); }
            50% { filter: hue-rotate(180deg) brightness(1.5); }
            100% { filter: hue-rotate(360deg) brightness(1.2); }
        }
        @keyframes shine {
            0% { transform: translateX(-100%) rotate(35deg); }
            100% { transform: translateX(200%) rotate(35deg); }
        }
    `;
    document.head.appendChild(rgbAnimation);

    // === NOVA ESTRUTURA DO HEADER ===
    const header = document.createElement('div');
    Object.assign(header.style, {
        padding: '15px 0',
        borderBottom: '2px solid rgba(255,255,255,0.7)',    
        marginBottom: '15px'
    });

    // Linha superior: ícone e título na mesma linha
    const headerTop = document.createElement('div');
    Object.assign(headerTop.style, {
        display: 'flex',
        alignItems: 'center',
        justifyContent: 'flex-start',
        flexWrap: 'nowrap' 
    });
    const iconContainer = document.createElement('div');
    Object.assign(iconContainer.style, {
        width: '60px',
        height: '60px',
        flexShrink: '0'
    });
    const icon = document.createElement('img');
    icon.src = 'https://raw.githubusercontent.com/DevZurvan/Full-Edge/main/assets/icon.png';
    icon.alt = 'Full-Edge Icon';
    Object.assign(icon.style, {
        width: '100%',
        height: '100%',
        objectFit: 'contain',
        filter: 'drop-shadow(0 0 10px #001f3f)',
        animation: 'pulseIcon 2s infinite ease-in-out'
    });
    iconContainer.appendChild(icon);
    const titleContainer = document.createElement('div');
    Object.assign(titleContainer.style, {
        marginLeft: '15px',
        flexGrow: '1',
        minWidth: '0'
    });
    const title = document.createElement('h1');
    title.textContent = 'FULL-EDGE';
    Object.assign(title.style, {
        margin: '0',
        fontSize: '28px',
        color: '#ffffff',
        textShadow: '0 0 10pxrgb(10, 1, 0)',
        letterSpacing: '2px'
    });
    titleContainer.appendChild(title);
    headerTop.appendChild(iconContainer);
    headerTop.appendChild(titleContainer);

    // Linha inferior: tagline (subTitle) centralizada
    const headerBottom = document.createElement('div');
    Object.assign(headerBottom.style, {
        textAlign: 'center',
        marginTop: '8px'
    });
    const subTitle = document.createElement('div');
    subTitle.textContent = 'Espaço intocado, ações ilimitadas.';
    Object.assign(subTitle.style, {
        fontSize: '16px',
        color: 'rgb(0, 0, 0)',
        textShadow: '0 0 5pxrgba(3, 0, 0, 0.5)'
    });
    headerBottom.appendChild(subTitle);

    header.appendChild(headerTop);
    header.appendChild(headerBottom);
    uiContainer.appendChild(header);

    const infoSection = document.createElement('div');
    Object.assign(infoSection.style, {
        display: 'flex',
        justifyContent: 'space-between',
        gap: '10px',
        marginBottom: '15px',
        flexWrap: 'nowrap',
        boxShadow: '0 2px 8px rgba(0,0,0,0.3)',              
        borderRadius: '8px',
        padding: '12px'
    });
    const btcCard = document.createElement('div');
    Object.assign(btcCard.style, {
        flex: '1',
        background: '#222',
        padding: '10px',
        borderRadius: '8px',
        textAlign: 'center'
    });
    btcCard.innerHTML = `<div style="font-size: 14px; margin-bottom: 5px;"><strong>BTC Ganho</strong></div>
                         <div id="btcGanho" style="font-size: 16px;">0.00000000</div>`;
    const rollCard = document.createElement('div');
    Object.assign(rollCard.style, {
        flex: '1',
        background: '#222',
        padding: '10px',
        borderRadius: '8px',
        textAlign: 'center'
    });
    rollCard.innerHTML = `<div style="font-size: 14px; margin-bottom: 5px;"><strong>Próximo Roll</strong></div>
                          <div id="uiTimer" style="font-size: 16px;">00:00</div>`;
    infoSection.appendChild(btcCard);
    infoSection.appendChild(rollCard);
    uiContainer.appendChild(infoSection);

    // === NOVA ESTRUTURA DO RODAPÉ ===
    const footerContainer = document.createElement('div');
    Object.assign(footerContainer.style, {
        display: 'flex',
        flexDirection: 'column',
        alignItems: 'center',
        paddingTop: '15px',
        borderTop: '2px solid rgba(255,255,255,0.7)',
        gap: '10px'
    });
    const footerTop = document.createElement('div');
    Object.assign(footerTop.style, {
        display: 'flex',
        justifyContent: 'center',
        alignItems: 'center',
        gap: '20px',
        flexWrap: 'nowrap'
    });
    const githubLink = document.createElement('a');
    githubLink.href = 'https://github.com/DevZurvan';
    githubLink.target = '_blank';
    githubLink.title = 'GitHub do Desenvolvedor';
    githubLink.innerHTML = '<img src="https://raw.githubusercontent.com/DevZurvan/Full-Edge/main/assets/github.png" alt="GitHub" style="width:60px; transition: transform 0.3s;">';
    Object.assign(githubLink.style, {
        background: 'rgba(255, 255, 255, 0)',
        borderRadius: '8px',
        padding: '5px',
        boxShadow: '0 0 3px rgba(252, 252, 252, 0)'
    });
    const donationIcon = document.createElement('div');
    donationIcon.style.cursor = 'pointer';
    donationIcon.title = 'Copiar carteira BTC';
    donationIcon.innerHTML = '<img src="https://raw.githubusercontent.com/DevZurvan/Full-Edge/main/assets/donate.png" alt="Doação BTC" style="width:60px; transition: transform 0.3s;">';
    Object.assign(donationIcon.style, {
        background: 'rgba(241, 241, 241, 0)',
        borderRadius: '8px',
        padding: '5px',
        boxShadow: '0 0 3px rgba(255, 255, 255, 0)'
    });
    footerTop.appendChild(githubLink);
    footerTop.appendChild(donationIcon);

    // Linha inferior: crédito do desenvolvedor centralizado
    const footerBottom = document.createElement('div');
    Object.assign(footerBottom.style, {
        textAlign: 'center',
        fontSize: '10px',
        color: '#cccccc',
        fontFamily: '"Cinzel", serif',
        letterSpacing: '1px'
    });
    footerBottom.textContent = 'by Zurvan';

    footerContainer.appendChild(footerTop);
    footerContainer.appendChild(footerBottom);
    uiContainer.appendChild(footerContainer);

    const addHoverEffect = (img) => {
        img.addEventListener('mouseover', () => { img.style.transform = 'scale(1.1)'; });
        img.addEventListener('mouseout', () => { img.style.transform = 'scale(1)'; });
    };
    addHoverEffect(githubLink.querySelector('img'));
    addHoverEffect(donationIcon.querySelector('img'));

    const btcAddress = '17jGRDbuMb5oxsjTG64FFB2Ax4BNBhqrV';
    donationIcon.addEventListener('click', () => {
        navigator.clipboard.writeText(btcAddress).then(() => {
            showTooltip(donationIcon, 'Carteira copiada!');
        });
    });

    function showTooltip(element, message) {
        const tooltip = document.createElement('div');
        tooltip.textContent = message;
        Object.assign(tooltip.style, {
            position: 'absolute',
            background: '#FF4136',
            color: '#fff',
            padding: '4px 8px',
            borderRadius: '5px',
            fontSize: '12px',
            top: '-30px',
            left: '50%',
            transform: 'translateX(-50%)',
            opacity: '0',
            pointerEvents: 'none',
            transition: 'opacity 0.3s'
        });
        element.style.position = 'relative';
        element.appendChild(tooltip);
        setTimeout(() => { tooltip.style.opacity = '1'; }, 50);
        setTimeout(() => { tooltip.style.opacity = '0'; }, 2000);
        setTimeout(() => { element.removeChild(tooltip); }, 2500);
    }

    let offsetX = 0, offsetY = 0;
    headerTop.addEventListener('mousedown', (e) => {
        e.preventDefault();
        offsetX = e.clientX - uiContainer.offsetLeft;
        offsetY = e.clientY - uiContainer.offsetTop;
        document.addEventListener('mousemove', moveAt);
        document.addEventListener('mouseup', () => { 
            document.removeEventListener('mousemove', moveAt); 
        }, { once: true });
    });
    function moveAt(e) {
        uiContainer.style.left = (e.clientX - offsetX) + 'px';
        uiContainer.style.top = (e.clientY - offsetY) + 'px';
    }

    document.body.appendChild(uiContainer);
    return uiContainer;
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址