RU AdList JS Fixes

try to take over the world!

Per 19-08-2016. Zie de nieuwste versie.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         RU AdList JS Fixes
// @namespace    ruadlist_js_fixes
// @version      1.0.40
// @description  try to take over the world!
// @author       lainverse & dimisa
// @match        *://*/*
// @grant        unsafeWindow
// @grant        window.close
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';
    var win = unsafeWindow || window;
    function inIFrame() {
        try {
            return win.self !== win.top;
        } catch (ignore) {
            return true;
        }
    }

    if (!(/firefox/i.test(navigator.userAgent))) { // scripts for non-Firefox browsers

        // https://greatest.deepsurf.us/scripts/19144-websuckit/
        (function() {
            // check if the browser supports Proxy and WebSocket
            if (typeof Proxy !== 'function' ||
                typeof WebSocket !== 'function') {
                return;
            }
            var to_block = [
                '||bgrndi.com^',
                '||brokeloy.com^',
                '||dreadfula.ru^',
                '||et-code.ru^',
                '||gocdn.ru^',
                '||hghit.com^',
                '||kuveres.com^',
                '||lepubs.com^',
                '||mail.ru^',
                '||marketgid.com^',
                '||mxtads.com^',
                '||psma01.com^',
                '||psma02.com^',
                '||psma03.com^',
                '||recreativ.ru^',
                '||regpole.com^',
                '||skidl.ru^',
                '||torvind.com^',
                '||trafmag.com^',
                '||xxuhter.ru^',
                '||yuiout.online^'
            ];
            var masks = [];
            to_block.forEach(function(m){
                masks.push(new RegExp(
                    m.replace(/([\\\/\[\].*+?(){}$])/g, '\\$1')
                    .replace(/\^(?!$)/g,'\\.?[^\\w%._-]')
                    .replace(/\^$/,'\\.?([^\\w%._-]|$)')
                    .replace(/^\|\|/,'^wss?:\\/+([^\/.]+\\.)*'),
                    'i'));
            });
            var ws = win.WebSocket,
                closingFunctions = ['close', 'send'];
            function wsGetter(tgt, nm) {
                console.log('[WSI] Registered call to property "', nm, '"');
                try {
                    if (typeof ws.prototype[nm] === 'function') {
                        if (closingFunctions.indexOf(nm) > -1) {
                            tgt.readyState = ws.CLOSED;
                        }
                        return function(){return;};
                    }
                    if (typeof ws.prototype[nm] === 'number') {
                        return ws[nm];
                    }
                } catch(ignore) {}
                return tgt[nm];
            }
            win.WebSocket = new Proxy(ws, {
                construct: function(target, args) {
                    var url = args[0];
                    console.log('[WSI] Opening socket on', url, '…');
                    var i = masks.length;
                    while(i--) {
                        if (masks[i].test(url)) {
                            console.log("[WSI] Blocked.");
                            return new Proxy({url: url, readyState: ws.OPEN}, {
                                get: wsGetter
                            });
                        }
                    }
                    return new target(args[0], args[1]);
                }
            });
        })();

        // https://greatest.deepsurf.us/scripts/14720-it-s-not-important
        (function(){
            var imptt = /((display|(margin|padding)(-top|-bottom)?)\s*:[^;!]*)!\s*important/ig;

            function unimportanter(el, si) {
                if (!imptt.test(si) || el.style.display === 'none') {
                    return 0; // get out if we have nothing to do here
                }
                if (el.nodeName === 'IFRAME' && el.src &&
                    el.src.slice(0,17) === 'chrome-extension:') {
                    return 0; // Web of Trust uses this method to add their frame
                }
                var so = si.replace(imptt, function(){return arguments[1];}), ret = 0;
                if (si !== so) {
                    ret = 1;
                    el.setAttribute('style', so);
                }
                return ret;
            }

            function logger(c) {
                if (c) {
                    console.log('Some page elements became a bit less important.');
                }
            }

            function checkTarget(m, c) {
                var si = m.getAttribute ? m.getAttribute('style') : null;
                if (si && si.indexOf('!') > -1) {
                    c += unimportanter(m, si);
                }
                return c;
            }

            function checkNodes(m, c) {
                var i = m.length;
                while(i--) {
                    c = checkTarget(m[i], c);
                }
                return c;
            }

            var observer = new MutationObserver(function(mutations) {
                setTimeout(function(m) {
                    var i = m.length, c = 0;
                    while(i--) {
                        if (m[i].target) {
                            c = checkTarget(m[i].target, c);
                        }
                        if (m[i].addedNodes.length) {
                            c = checkNodes(m[i].addedNodes, c);
                        }
                    }
                    logger(c);
                },0,mutations);
            });

            observer.observe(document, { childList : true, attributes : true, attributeFilter : ['style'], subtree : true });

            win.addEventListener ("load", function(){
                var c = 0, imp = document.querySelectorAll('[style*="!"]'), i = imp.length;
                while(i--) {
                    c+= checkTarget(imp[i], c);
                }
                logger(c);
            }, false);
        })();

    }

    if (/^https?:\/\/(news\.yandex\.|(www\.)?yandex\.[^\/]+\/(yand)?search[\/?])/i.test(win.location.href)) {
        // https://greatest.deepsurf.us/en/scripts/809-no-yandex-ads
        (function(){
            // Generic ads removal and fixes
            function removeGenericAds() {
                var s, i;
                s = document.querySelector('.serp-header');
                if (s) {
                    s.style.marginTop='0';
                }
                s = document.querySelectorAll('.serp-adv__head + .serp-item');
                i = s.length;
                while(i--) {
                    s[i].parentNode.removeChild(s[i]);
                }
                s = document.querySelectorAll('#adbanner, .serp-adv, .b-spec-adv, div[class*="serp-adv__"]');
                i = s.length;
                while(i--) {
                    s[i].parentNode.removeChild(s[i]);
                }
            }
            // Search ads
            function removeSearchAds() {
                var s = document.querySelectorAll('.serp-block, .serp-item, .search-item');
                var i = s.length, item;
                while(i--) {
                    item = s[i].querySelector('.label, .serp-item__label, .document__provider-name');
                    if (item && (
                        item.textContent.indexOf('Реклама') > -1 ||
                        item.textContent.indexOf('Яндекс.Директ') > -1)) {
                        s[i].parentNode.removeChild(s[i]);
                        console.log('Ads removed.');
                    }
                }
            }
            // News ads
            function removeNewsAds() {
                var s = document.querySelectorAll('.story[id], .document[id], .story__group[id]');
                var i = s.length;
                while(i--) {
                    if (win.getComputedStyle(s[i]).position === 'absolute') {
                        s[i].parentNode.removeChild(s[i]);
                        console.log('Ads removed.');
                    }
                }
            }
            // News fixes
            function removePageAdsClass() {
                if (document.body.classList.contains("b-page_ads_yes")){
                    document.body.classList.remove("b-page_ads_yes");
                    console.log('Page ads class removed.');
                }
            }
            // Function to attach an observer to monitor dynamic changes on the page
            function pageUpdateObserver(func, obj, params) {
                if (obj) {
                    var o = new MutationObserver(func);
                    o.observe(obj,(params || {childList:true}));
                }
            }
            // Cleaner
            document.addEventListener ("DOMContentLoaded", function() {
                removeGenericAds();
                if (win.location.hostname.search(/^news\./i) === 0) {
                    pageUpdateObserver(removeNewsAds, document.querySelector('BODY'));
                    pageUpdateObserver(removePageAdsClass, document.body, {attributes:true, attributesFilter:['class']});
                    removeNewsAds();
                    removePageAdsClass();
                } else {
                    pageUpdateObserver(removeSearchAds, document.querySelector('.main__content'));
                    removeSearchAds();
                }
            });
        })();
        return; //skip fixes for other sites
    }

    // https://greatest.deepsurf.us/en/scripts/21937-moonwalk-hdgo-kodik-fix
    (function () {
        if (!inIFrame) {
            return;
        }

        document.addEventListener ("DOMContentLoaded", function() {
            var player;
            if (win.iframe_adv_enabled !== undefined) {
                win.iframe_adv_enabled = false;
            } else if (win.banner_second !== undefined) {
                win.banner_second = 0;
                player = document.getElementById('play-player-hd');
                if (player) {
                    player.onclick = function() {
                        var adsdiv = document.getElementById("ads-player-hd");
                        adsdiv.parentNode.removeChild(adsdiv);
                        win.setPlayer();
                    };
                }
            } else if (win.MXoverrollCallback !== undefined) {
                player = document.getElementsByClassName('play_button')[0];
                if (player) {
                    player.onclick = win.MXoverrollCallback.bind(window);
                }
            }
        },false);
    })();

    document.addEventListener ("DOMContentLoaded", function() {
        // function to search and remove nodes by content
        // selector - standard CSS selector to define set of nodes to check
        // words - regular expression to check content of the suspicious nodes
        // params - object with multiple extra parameters:
        //   .parent - parent node to remove if content is found in the child node
        //   .siblings - number of simling nodes to remove (excluding text nodes)
        function scissors (selector, words, scope, params) {
            var nodes = scope.querySelectorAll(selector),
                i = nodes.length,
                toRemove = [],
                siblings = Math.abs(params.siblings) || 0,
                iterFunc = params.siblings > 0 ? 'nextSibling' : 'previousSibling',
                node;
            while(i--) {
                node = nodes[i];
                if (words.test(node.innerHTML) || !node.childNodes.length) {
                    // drill up to the specified parent node if required
                    if (params.parent) {
                        while(node !== scope && !(node.matches(params.parent))) {
                            node = node.parentNode;
                        }
                    }
                    if (node === scope) {
                        break;
                    }
                    toRemove.push(node);
                    // add multiple nodes if defined more than one sibling
                    while (siblings) {
                        node = node[iterFunc];
                        toRemove.push(node);
                        if (node.tagName) {
                            siblings -= 1; //don't count text nodes
                        }
                    }
                }
            }
            i = toRemove.length;
            while(i--) {
                toRemove[i].parentNode.removeChild(toRemove[i]);
            }

            return toRemove.length;
        }

        // function to perform multiple checks if ads inserted with a delay
        // by default does 30 checks withing a 3 seconds unless nonstop mode specified
        // also does 1 extra check when a page completely loads
        // selector and words - passed dow to scissors
        // params - object with multiple extra parameters:
        //   .root - selector to narrow down scope to scan;
        //   .observe - if true then check will be performed continuously;
        //   .parent - passed down to scissors;
        //   .siblings - passed down to scissors;
        function gardener(selector, words, params) {
            params = params || {};
            var scope = document.body,
                nonstop = false;
            // narrow down scope to a specific element
            if (params.root) {
                scope = scope.querySelector(params.root);
                if (!scope) {// exit if the root element is not present on the page
                    return 0;
                }
            }
            // add observe mode if required
            if (params.observe) {
                if (typeof MutationObserver === 'function') {
                    var o = new MutationObserver(function(ms){
                        ms.forEach(function(m){
                            if (m.addedNodes.length) {
                                scissors(selector, words, scope, params);
                            }
                        });
                    });
                    o.observe(document.querySelector(params.root),
                              {childList:true, subtree: true});
                } else {
                    nonstop = true;
                }
            }
            // wait for a full page load to do one extra cut
            win.addEventListener('load',function(){
                scissors(selector, words, scope, params);
            });
            // do multiple cuts until ads removed
            function cut(sci, s, w, sc, p, i) {
                if (i > 0) {
                    i -= 1;
                }
                if (i && !sci(s, w, sc, p)) {
                    setTimeout(cut, 100, sci, s, w, sc, p, i);
                }
            }
            cut(scissors, selector, words, scope, params, (nonstop ? -1 : 30));
        }

        function preventBackgroundRedirect() {
            console.log("Background redirect prevention enabled.");
            var orgOpen = win.open;
            win.open = function(){
                var loc = arguments[0];
                if (loc.indexOf(win.location.host) > -1 ||
                    loc.indexOf('://') === -1) {
                    win.addEventListener('unload',function(){
                        win.close();
                    }, true);
                }
                orgOpen.apply(window, arguments);
            };
        }

        var scripts = {};
        scripts['fs.to'] = function() {
            function skipClicker(i) {
                if (!i) {
                    return;
                }
                var skip = document.querySelector('.b-aplayer-banners__close');
                if (skip) {
                    skip.click();
                } else {
                    setTimeout(skipClicker, 100, i-1);
                }
            }
            setTimeout(skipClicker, 100, 30);

            var divs = document.getElementsByTagName('div'),
                re = /\w{1,5}\d{1,5}\w{1,5}\d{1,5}/,
                i = divs.length;
            while(i--) {
                if (re.test(divs[i].className)) {
                    divs[i].style.display = 'none';
                }
            }

            var style = document.head.appendChild( document.createElement('style') );
            style.type = 'text/css';

            var toHide = [
                '.b-aplayer-teasers > a',
                '.b-player-popup__content > div[class][style="position: relative;"]',
                'div[class^="b-adproxy"]',
                'div[id^="admixer_async_"]'
            ];
            style.sheet.insertRule(toHide.join(',')+'{display:none!important}', 0);

            if (/\/view_iframe\//i.test(document.location.pathname)) {
                var p = document.querySelector('#player:not([preload="auto"])'),
                    m = document.querySelector('.main'),
                    adStepper = function(p) {
                        if (p.currentTime < p.duration) {
                            p.currentTime += 1;
                        }
                    },
                    adSkipper = function(f, p) {
                        f.click();
                        p.waitAfterSkip = false;
                        console.log('Пропущена.');
                    },
                    cl = function(p) {
                        var faster = document.querySelector('.b-aplayer__html5-desktop-skip');

                        function skipListener() {
                            if (p.waitAfterSkip) {
                                console.log('Доступен быстрый пропуск рекламы…');
                                return;
                            }
                            p.pause();
                            if (!p.classList.contains('m-hidden')) {
                                p.classList.add('m-hidden');
                            }
                            if (faster &&
                                win.getComputedStyle(faster).display === 'block' &&
                                !faster.querySelector('.b-aplayer__html5-desktop-skip-timer')) {
                                p.waitAfterSkip = true;
                                setTimeout(adSkipper, 1000, faster, p);
                            } else {
                                setTimeout(adStepper, 1000, p);
                            }
                        }

                        p.addEventListener('timeupdate', skipListener, false);
                    },
                    o = new MutationObserver(function (mut) {
                        mut.forEach(function (e) {
                            var i = e.addedNodes.length;
                            while(i--) {
                                if (e.addedNodes[i].id === 'player' &&
                                    e.addedNodes[i].nodeName === 'VIDEO' &&
                                    e.addedNodes[i].getAttribute('preload') !== 'auto') {
                                    cl(e.addedNodes[i]);
                                }
                            }
                        });
                    });
                if (p.nodeName === 'VIDEO') {
                    cl(p);
                } else {
                    o.observe(m, {childList: true});
                }
            }
        };
        scripts['brb.to'] = scripts['fs.to'];
        scripts['cxz.to'] = scripts['fs.to'];

        scripts['drive2.ru'] = function() {
            gardener('.g-column-wide > .c-block', /Реклама|\.relap\./i);
        };

        scripts['pikabu.ru'] = function() {
            gardener('.story', /story__sponsor|profile\/ads"/i, {root:'.stories,.page-story', observe: true});
        };

        scripts['fishki.net'] = function() {
            gardener('.main-post', /543769|Реклама/);
        };

        scripts['hdrezka.me'] = function() {
            gardener('div[id][onclick][onmouseup][onmousedown]', /onmouseout/i);
        };

        scripts['naruto-base.tv'] = function() {
            gardener('div[id^="entryID"],center', /\/goo.gl\//i);
        };

        scripts['pb.wtf'] = function() {
            gardener('a[href$="=="]', /img/i, {root:'#page_container .containe', observe:true, parent:'div[class]'});
            gardener('a[href^="/"]', /<img\s.*<br>/i, {root:'#main_content', observe:true, parent:'div[class]'});
        };
        scripts['piratbit.org'] = scripts['pb.wtf'];
        scripts['piratbit.ru'] = scripts['pb.wtf'];

        scripts['sports.ru'] = function() {
            gardener('.aside-news-list__item', /aside-news-list__advert/i, {root:'.aside-news-block'});
        };

        scripts['rustorka.com'] = function() {
            var s = document.head.childNodes, i = s.length;
            if (i < 5) {
                while(i--) {
                    if (s[i].httpEquiv && s[i].httpEquiv === 'refresh') {
                        win.close();
                    }
                }
            }
            gardener('span[class],ul[class],span[id],ul[id]', /\/\d{12,}\.php/i, {root:'#sidebar1', observe:true});
            gardener('div[id][style*="!important"]', /!important/i);
        };
        scripts['rumedia.ws'] = scripts['rustorka.com'];

        scripts['yap.ru'] = function() {
            var words = /member1438|Administration/;
            gardener('form > table[id^="p_row_"]', words);
            gardener('tr > .holder.newsbottom', words, {parent:'tr', siblings:-2});
        };
        scripts['yaplakal.com'] = scripts['yap.ru'];

        scripts['reactor.cc'] = preventBackgroundRedirect;
        scripts['joyreactor.cc'] = preventBackgroundRedirect;
        scripts['pornreactor.cc'] = preventBackgroundRedirect;

        scripts['auto.ru'] = function() {
            var words = /Реклама|Яндекс.Директ|yandex_ad_/;
            var userAdsListAds = [
                '.listing-list > .listing-item',
                '.listing-item_type_fixed.listing-item'
            ];
            var catalogAds = [
                'div[class*="layout_catalog-inline"]',
                'div[class$="layout_horizontal"]'
            ];
            var otherAds = [
                '.advt_auto',
                '.sidebar-block',
                '.pager-listing + div[class]',
                '.card > div[class][style]',
                '.sidebar > div[class]',
                '.main-page__section + div[class]',
                '.listing > tbody'];
            gardener(userAdsListAds.join(','), words, {root:'.listing-wrap', observe:true});
            gardener(catalogAds.join(','), words, {root:'.catalog__page,.content__wrapper', observe:true});
            gardener(otherAds.join(','), words);
        };

        scripts['online.anidub.com'] = function() {
            var script = document.createElement('script');
            script.type = "text/javascript";
            script.innerHTML = "function ogonekstart1() {}";
            document.getElementsByTagName('head')[0].appendChild(script);

            var style = document.createElement('style');
            style.type = 'text/css';
            style.appendChild(document.createTextNode('.background {background: none!important;}'));
            style.appendChild(document.createTextNode('.background > script + div, .background > script ~ div:not([id]):not([class]) + div[id][class] {display:none!important}'));
            document.head.appendChild(style);
        };

        scripts['rsload.net'] = function() {
            win.addEventListener('load', function() {
                var dis = document.querySelector('.cb-disable');
                if (dis) {
                    dis.click();
                }
            });
            document.addEventListener('click',function(e){
                var t = e.target;
                if (t && t.href && (/:\/\/\d+\.\d+\.\d+\.\d+\//.test(t.href))) {
                    t.href = t.href.replace('://','://rsload.net:rsload.net@');
                }
            });
        };

        var domain = document.domain;
        while (domain.indexOf('.') !== -1) {
            if (scripts.hasOwnProperty(domain)) {
                scripts[domain]();
                break;
            }
            domain = domain.slice(domain.indexOf('.') + 1);
        }
    });
})();