Globo.com - Anti-Adblock Bypass

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

  1. // ==UserScript==
  2. // @name Globo.com - Anti-Adblock Bypass
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.3
  5. // @description Tenta esconder o banner anti-adblock (Google Funding Choices) do globo.com e restaurar scroll.
  6. // @author Seu Nome Aqui
  7. // @match *://*.globo.com/*
  8. // @match *://globo.com/*
  9. // @grant GM_addStyle
  10. // @grant none
  11. // @run-at document-start
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16.  
  17. console.log('Tentando bloquear anti-adblock Globo (Funding Choices)...');
  18.  
  19. // --- Seletores específicos para o Google Funding Choices encontrados ---
  20. const selectorsToHide = [
  21. '.fc-ab-root', // Contêiner principal do Funding Choices
  22. '.fc-dialog-overlay', // Sobreposição que bloqueia a página
  23. '.fc-ab-dialog', // A caixa de diálogo em si
  24. // '.fc-dialog-container' // Descomente se os acima não forem suficientes
  25. ];
  26.  
  27. // --- CSS para esconder os elementos ---
  28. // Usamos !important para tentar sobrescrever estilos do site.
  29. let css = selectorsToHide.join(',\n') + ' {\n';
  30. css += ' display: none !important;\n';
  31. css += ' visibility: hidden !important;\n';
  32. css += ' z-index: -9999 !important; \n'; // Tenta jogar para trás
  33. css += ' position: absolute !important;\n'; // Tira do fluxo normal
  34. css += ' top: -9999px !important;\n'; // Move para fora da tela
  35. css += ' left: -9999px !important;\n';
  36. css += '}\n';
  37.  
  38. // --- CSS para garantir que a rolagem da página funcione ---
  39. // O banner geralmente adiciona 'overflow: hidden' ao body ou html.
  40. css += 'body, html {\n';
  41. css += ' overflow: auto !important;\n';
  42. css += ' height: auto !important;\n'; // Garante altura automática
  43. // Adiciona remoção de possível classe de bloqueio (comum no Funding Choices)
  44. // css += ' position: static !important;\n'; // Pode ser necessário em alguns casos
  45. css += '}\n';
  46.  
  47. // Injeta o CSS na página o mais cedo possível
  48. GM_addStyle(css);
  49. console.log('CSS anti-adblock (Funding Choices) injetado.');
  50.  
  51. // --- Abordagem Adicional: Remover elementos via JS ---
  52. // Útil se esconder via CSS não for suficiente ou se o site os reativar.
  53. function removeAnnoyingElements() {
  54. let removed = false;
  55. selectorsToHide.forEach(selector => {
  56. try {
  57. const elements = document.querySelectorAll(selector);
  58. elements.forEach(el => {
  59. if (el && typeof el.remove === 'function') {
  60. console.log('Removendo elemento:', el);
  61. el.remove();
  62. removed = true;
  63. } else if (el) {
  64. // Fallback se .remove() não existir (muito improvável)
  65. el.style.display = 'none';
  66. el.style.visibility = 'hidden';
  67. }
  68. });
  69. } catch (e) {
  70. console.error('Erro ao tentar remover seletor:', selector, e);
  71. }
  72. });
  73.  
  74. // Tenta reativar o scroll novamente via JS, caso CSS não funcione
  75. // e remove classes comuns que bloqueiam scroll
  76. try {
  77. document.body.style.overflow = 'auto';
  78. document.documentElement.style.overflow = 'auto';
  79. document.body.style.position = 'static'; // Tenta resetar posição
  80. document.documentElement.style.position = 'static';
  81. // Remove classes comuns de bloqueio (ajuste se necessário)
  82. document.body.classList.remove('fc-ab-locked');
  83. document.documentElement.classList.remove('fc-ab-locked');
  84. } catch (e) {
  85. console.error('Erro ao tentar reativar scroll/remover classes via JS:', e);
  86. }
  87.  
  88. if (removed) {
  89. console.log('Elementos anti-adblock removidos via JS.');
  90. }
  91. return removed;
  92. }
  93.  
  94. // Tenta remover após um pequeno atraso e depois periodicamente por um tempo
  95. // (caso o banner apareça depois do carregamento inicial)
  96. setTimeout(removeAnnoyingElements, 500); // 0.5 segundos
  97. setTimeout(removeAnnoyingElements, 1500); // 1.5 segundos
  98. setTimeout(removeAnnoyingElements, 3000); // 3 segundos
  99.  
  100. // Observador de Mutações (alternativa mais avançada e eficiente que setInterval)
  101. // Observa se os elementos são adicionados ao DOM depois
  102. const observer = new MutationObserver((mutationsList, observer) => {
  103. for(const mutation of mutationsList) {
  104. if (mutation.type === 'childList') {
  105. if (removeAnnoyingElements()) {
  106. // Se removemos algo, podemos parar de observar por um tempo
  107. // ou até mesmo desconectar se o problema for resolvido.
  108. // console.log('Elemento detectado e removido pelo MutationObserver.');
  109. // observer.disconnect(); // Descomente se quiser parar após a primeira detecção/remoção
  110. }
  111. }
  112. }
  113. });
  114.  
  115. // Inicia a observação no body, procurando por adições de nós filhos
  116. observer.observe(document.body || document.documentElement, { childList: true, subtree: true });
  117. console.log('MutationObserver iniciado para detectar adições tardias do banner.');
  118.  
  119. // Para o observador após um tempo para não rodar indefinidamente (opcional)
  120. // setTimeout(() => {
  121. // observer.disconnect();
  122. // console.log('MutationObserver desconectado.');
  123. // }, 30000); // Desconecta após 30 segundos
  124.  
  125. })();