Globo.com - Anti-Adblock Bypass

Tenta esconder o banner anti-adblock (Google Funding Choices) do globo.com e restaurar scroll.

// ==UserScript==
// @name         Globo.com - Anti-Adblock Bypass
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Tenta esconder o banner anti-adblock (Google Funding Choices) do globo.com e restaurar scroll.
// @author       Seu Nome Aqui
// @match        *://*.globo.com/*
// @match        *://globo.com/*
// @grant        GM_addStyle
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    console.log('Tentando bloquear anti-adblock Globo (Funding Choices)...');

    // --- Seletores específicos para o Google Funding Choices encontrados ---
    const selectorsToHide = [
        '.fc-ab-root',          // Contêiner principal do Funding Choices
        '.fc-dialog-overlay',   // Sobreposição que bloqueia a página
        '.fc-ab-dialog',        // A caixa de diálogo em si
        // '.fc-dialog-container' // Descomente se os acima não forem suficientes
    ];

    // --- CSS para esconder os elementos ---
    // Usamos !important para tentar sobrescrever estilos do site.
    let css = selectorsToHide.join(',\n') + ' {\n';
    css += '    display: none !important;\n';
    css += '    visibility: hidden !important;\n';
    css += '    z-index: -9999 !important; \n'; // Tenta jogar para trás
    css += '    position: absolute !important;\n'; // Tira do fluxo normal
    css += '    top: -9999px !important;\n'; // Move para fora da tela
    css += '    left: -9999px !important;\n';
    css += '}\n';

    // --- CSS para garantir que a rolagem da página funcione ---
    // O banner geralmente adiciona 'overflow: hidden' ao body ou html.
    css += 'body, html {\n';
    css += '    overflow: auto !important;\n';
    css += '    height: auto !important;\n'; // Garante altura automática
    // Adiciona remoção de possível classe de bloqueio (comum no Funding Choices)
    // css += '    position: static !important;\n'; // Pode ser necessário em alguns casos
    css += '}\n';

    // Injeta o CSS na página o mais cedo possível
    GM_addStyle(css);
    console.log('CSS anti-adblock (Funding Choices) injetado.');

    // --- Abordagem Adicional: Remover elementos via JS ---
    // Útil se esconder via CSS não for suficiente ou se o site os reativar.
    function removeAnnoyingElements() {
        let removed = false;
        selectorsToHide.forEach(selector => {
            try {
                const elements = document.querySelectorAll(selector);
                elements.forEach(el => {
                    if (el && typeof el.remove === 'function') {
                        console.log('Removendo elemento:', el);
                        el.remove();
                        removed = true;
                    } else if (el) {
                        // Fallback se .remove() não existir (muito improvável)
                        el.style.display = 'none';
                        el.style.visibility = 'hidden';
                    }
                });
            } catch (e) {
                console.error('Erro ao tentar remover seletor:', selector, e);
            }
        });

        // Tenta reativar o scroll novamente via JS, caso CSS não funcione
        // e remove classes comuns que bloqueiam scroll
        try {
            document.body.style.overflow = 'auto';
            document.documentElement.style.overflow = 'auto';
            document.body.style.position = 'static'; // Tenta resetar posição
            document.documentElement.style.position = 'static';
            // Remove classes comuns de bloqueio (ajuste se necessário)
            document.body.classList.remove('fc-ab-locked');
            document.documentElement.classList.remove('fc-ab-locked');
        } catch (e) {
             console.error('Erro ao tentar reativar scroll/remover classes via JS:', e);
        }

        if (removed) {
            console.log('Elementos anti-adblock removidos via JS.');
        }
        return removed;
    }

    // Tenta remover após um pequeno atraso e depois periodicamente por um tempo
    // (caso o banner apareça depois do carregamento inicial)
    setTimeout(removeAnnoyingElements, 500);  // 0.5 segundos
    setTimeout(removeAnnoyingElements, 1500); // 1.5 segundos
    setTimeout(removeAnnoyingElements, 3000); // 3 segundos

    // Observador de Mutações (alternativa mais avançada e eficiente que setInterval)
    // Observa se os elementos são adicionados ao DOM depois
    const observer = new MutationObserver((mutationsList, observer) => {
        for(const mutation of mutationsList) {
            if (mutation.type === 'childList') {
                if (removeAnnoyingElements()) {
                    // Se removemos algo, podemos parar de observar por um tempo
                    // ou até mesmo desconectar se o problema for resolvido.
                    // console.log('Elemento detectado e removido pelo MutationObserver.');
                    // observer.disconnect(); // Descomente se quiser parar após a primeira detecção/remoção
                }
            }
        }
    });

    // Inicia a observação no body, procurando por adições de nós filhos
    observer.observe(document.body || document.documentElement, { childList: true, subtree: true });
    console.log('MutationObserver iniciado para detectar adições tardias do banner.');

    // Para o observador após um tempo para não rodar indefinidamente (opcional)
    // setTimeout(() => {
    //     observer.disconnect();
    //     console.log('MutationObserver desconectado.');
    // }, 30000); // Desconecta após 30 segundos

})();