Anti Anti-AdBlock — Inspector + Whitelist + UA Badge

Безопасный обход анти-AdBlock. Создает отсутствующие заглушки, логирует существующие свойства, предлагает добавить текущий хост в whitelist. Панель draggable/resizable/collapsible. Логотип "Зроблено в Україні".

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Anti Anti-AdBlock — Inspector + Whitelist + UA Badge
// @namespace    https://example.com
// @version      6.2
// @description  Безопасный обход анти-AdBlock. Создает отсутствующие заглушки, логирует существующие свойства, предлагает добавить текущий хост в whitelist. Панель draggable/resizable/collapsible. Логотип "Зроблено в Україні".
// @author       You
// @match        *://*/*
// @grant        unsafeWindow
// @run-at       document-start
// ==/UserScript==

(function () {
  'use strict';

  // --- Storage keys ---
  const STORAGE_ENABLED = 'antiAB_enabled_v6';
  const STORAGE_DISABLED_HOSTS = 'antiAB_disabled_hosts_v6';
  const STORAGE_CREATED_STUBS = 'antiAB_created_stubs_v6';
  const STORAGE_WHITELIST = 'antiAB_whitelist_v6';
  const STORAGE_SUGGEST_THRESHOLD = 'antiAB_suggest_threshold_v6';

  // --- State ---
  let enabled = localStorage.getItem(STORAGE_ENABLED) !== 'false';
  let disabledHosts = JSON.parse(localStorage.getItem(STORAGE_DISABLED_HOSTS) || '{}');
  let createdStubs = JSON.parse(localStorage.getItem(STORAGE_CREATED_STUBS) || '[]');
  let whitelist = JSON.parse(localStorage.getItem(STORAGE_WHITELIST) || '[]');
  let suggestThreshold = parseInt(localStorage.getItem(STORAGE_SUGGEST_THRESHOLD) || '5', 10);

  // --- Keywords for stub creation / scanning ---
  const adKeywords = [
    'adblock','ads','advert','admiral','blockad','popunder','ez_ad',
    'carbonads','zaraz','piwik','matomo','googlead','canrunads','adscore',
    'generatorads','adplugin','postantiadblockinfo','hasadblocker','adtracker'
  ];

  // --- Save helpers ---
  const saveCreatedStubs = () => { try{localStorage.setItem(STORAGE_CREATED_STUBS, JSON.stringify(Array.from(new Set(createdStubs))));}catch(e){} };
  const saveDisabledHosts = () => { try{localStorage.setItem(STORAGE_DISABLED_HOSTS, JSON.stringify(disabledHosts));}catch(e){} };
  const saveEnabled = () => { try{localStorage.setItem(STORAGE_ENABLED, enabled?'true':'false');}catch(e){} };
  const saveWhitelist = () => { try{localStorage.setItem(STORAGE_WHITELIST, JSON.stringify(whitelist));}catch(e){} };
  const saveSuggestThreshold = () => { try{localStorage.setItem(STORAGE_SUGGEST_THRESHOLD, String(suggestThreshold));}catch(e){} };

  // --- Whitelist helpers ---
  const isWhitelisted = (host = location.hostname) => whitelist.includes(host) || whitelist.some(w => host === w || host.endsWith('.'+w));
  const addToWhitelist = host => { if(!whitelist.includes(host)) { whitelist.push(host); saveWhitelist(); } };
  const removeFromWhitelist = host => { whitelist = whitelist.filter(h=>h!==host); saveWhitelist(); };

  // --- Scan existing properties ---
  function scanExistingProperties(){
    try{
      const props = Object.getOwnPropertyNames(window || {});
      const found = [];
      const lowerKeywords = adKeywords.map(k=>k.toLowerCase());
      for(const p of props) if(lowerKeywords.some(k=>p.toLowerCase().includes(k))) found.push(p);
      if(found.length){
        console.group('%c[AntiAB] Found existing properties matching ad keywords','color:#0ea5a6;font-weight:700');
        found.forEach(n=>{try{console.log(n,typeof window[n]!=='undefined'?window[n]:'undefined');}catch(e){console.log(n,'(access error)')}})
        console.groupEnd();
      } else console.log('%c[AntiAB] No existing window properties matched ad keywords.','color:#60a5fa');
      return found;
    } catch(e){console.warn('[AntiAB] scanExistingProperties error', e); return [];}
  }

  const existingPropsFound = scanExistingProperties();

  // --- Stub creation ---
  function safeCreateStub(name){
    try{
      if(typeof unsafeWindow[name]!=='undefined') return false;
      unsafeWindow[name] = {};
      try{unsafeWindow[name].init=function(){}}catch(e){}
      if(!createdStubs.includes(name)){createdStubs.push(name); saveCreatedStubs();}
      return true;
    } catch(e){return false;}
  }
  function createStubsForKeyword(k){
    safeCreateStub(k); safeCreateStub(k.toLowerCase());
    const cap = k.charAt(0).toUpperCase()+k.slice(1); safeCreateStub(cap); safeCreateStub('_'+k);
  }

  function applyBypassOnce(){
    if(!enabled || disabledHosts[location.hostname] || isWhitelisted(location.hostname)) return;
    adKeywords.forEach(createStubsForKeyword);
  }
  function scheduleAttempts(){
    applyBypassOnce();
    [250,800,1800,3500].forEach(t=>setTimeout(applyBypassOnce,t));
  }

  function removeStubs(names){
    const removed = [];
    names.forEach(name=>{
      try{
        if(createdStubs.includes(name)){
          try{delete unsafeWindow[name];}catch(e){unsafeWindow[name]=undefined;}
          removed.push(name); createdStubs=createdStubs.filter(x=>x!==name);
        }
      }catch(e){}
    });
    saveCreatedStubs();
    return removed;
  }

  // --- Notifications ---
  function showNotification(text,bg='#bbf7d0',color='#000'){
    try{
      const el=document.createElement('div'); el.textContent=text;
      Object.assign(el.style,{
        position:'fixed',right:'12px',bottom:'70px',zIndex:2147483647,
        padding:'8px 10px',borderRadius:'6px',background:bg,color:color,
        fontWeight:'700',fontFamily:'Arial, sans-serif',boxShadow:'0 6px 18px rgba(2,6,23,0.5)'
      });
      document.documentElement.appendChild(el);
      setTimeout(()=>el.remove(),2600);
    }catch(e){}
  }

  // --- UI Panel ---
  function createPanel(){
    try{
      const panel=document.createElement('div');
      Object.assign(panel.style,{
        position:'fixed',right:'10px',bottom:'10px',width:'400px',maxWidth:'calc(100%-20px)',
        background:'#0b1220',color:'#e6eef8',borderRadius:'10px',zIndex:2147483647,
        boxShadow:'0 10px 30px rgba(2,6,23,0.6)',fontFamily:'Arial, sans-serif',
        fontSize:'13px',resize:'both',overflow:'auto',minWidth:'240px'
      });

      const header=document.createElement('div');
      Object.assign(header.style,{display:'flex',alignItems:'center',justifyContent:'space-between',padding:'8px 10px',cursor:'move',userSelect:'none'});
      header.innerHTML='<strong>Anti-AdBlock — Inspector</strong>';
      panel.appendChild(header);

      const body=document.createElement('div'); body.style.padding='8px 10px'; panel.appendChild(body);

      const badge=document.createElement('div'); badge.textContent='🇺🇦 Зроблено в Україні'; badge.style.fontWeight='700'; badge.style.marginBottom='8px'; body.appendChild(badge);

      // Status row
      const statusRow=document.createElement('div'); Object.assign(statusRow.style,{display:'flex',justifyContent:'space-between',alignItems:'center'}); body.appendChild(statusRow);
      const statusText=document.createElement('div'); statusText.textContent=enabled?'Status: ON':'Status: OFF'; statusText.style.fontWeight='700'; statusRow.appendChild(statusText);
      const statusDot=document.createElement('div'); Object.assign(statusDot.style,{width:'12px',height:'12px',borderRadius:'50%',background:enabled?'#10b981':'#ef4444'}); statusRow.appendChild(statusDot);

      // Controls
      const toggleBtn=document.createElement('button'); toggleBtn.textContent=enabled?'Turn OFF':'Turn ON';
      Object.assign(toggleBtn.style,{flex:'1',padding:'6px',borderRadius:'6px',border:'none',cursor:'pointer',background:enabled?'#10b981':'#ef4444',color:'#000',fontWeight:'700'});
      body.appendChild(toggleBtn);

      // Pause checkbox
      const pauseChk=document.createElement('input'); pauseChk.type='checkbox'; pauseChk.checked=!!disabledHosts[location.hostname];
      const pauseLabel=document.createElement('label'); pauseLabel.textContent='Pause on this site'; pauseLabel.style.cursor='pointer';
      body.appendChild(pauseChk); body.appendChild(pauseLabel);

      toggleBtn.addEventListener('click',()=>{
        enabled=!enabled; saveEnabled();
        toggleBtn.textContent=enabled?'Turn OFF':'Turn ON';
        toggleBtn.style.background=enabled?'#10b981':'#ef4444';
        statusText.textContent=enabled?'Status: ON':'Status: OFF';
        statusDot.style.background=enabled?'#10b981':'#ef4444';
        if(enabled){scheduleAttempts(); showNotification('Anti-AdBlock active ✅');}else{showNotification('Anti-AdBlock disabled ❌','#fecaca');}
      });

      pauseChk.addEventListener('change',()=>{
        if(pauseChk.checked){disabledHosts[location.hostname]=true; showNotification('Paused on this site','#fecaca');}else{delete disabledHosts[location.hostname]; if(enabled) scheduleAttempts(); showNotification('Activated on this site','#bbf7d0');} saveDisabledHosts();
      });

      // Drag support
      (function makeDraggable(handle,target){
        let isDown=false,startX=0,startY=0,startLeft=0,startTop=0;
        handle.addEventListener('mousedown',e=>{
          isDown=true; startX=e.clientX; startY=e.clientY;
          const rect=target.getBoundingClientRect(); startLeft=rect.left; startTop=rect.top;
          document.body.style.userSelect='none';
          target.style.left=startLeft+'px'; target.style.top=startTop+'px'; target.style.right='auto'; target.style.bottom='auto'; target.style.position='fixed';
        });
        window.addEventListener('mouseup',()=>{isDown=false; document.body.style.userSelect='';});
        window.addEventListener('mousemove',e=>{if(!isDown) return; const dx=e.clientX-startX, dy=e.clientY-startY; target.style.left=(startLeft+dx)+'px'; target.style.top=(startTop+dy)+'px';});
      })(header,panel);

      document.documentElement.appendChild(panel);

    }catch(e){setTimeout(createPanel,300);}
  }

  // --- Run ---
  try{
    scheduleAttempts();
    if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',createPanel);
    else createPanel();
  }catch(e){console.error('AntiAB error',e);}

})();