Globo.com - Anti-Adblock Bypass

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

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

You will need to install an extension such as Tampermonkey to install this script.

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

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

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

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

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

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

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

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

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

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

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

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

// ==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

})();