RU AdList JS Fixes

try to take over the world!

Tính đến 18-06-2016. Xem phiên bản mới nhất.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

Bạn sẽ cần cài đặt một tiện ích mở rộng như Tampermonkey hoặc Violentmonkey để cài đặt kịch bản này.

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

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

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

You will need to install a user script manager extension to install this script.

(Tôi đã có Trình quản lý tập lệnh người dùng, hãy cài đặt nó!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

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

(function() {
    'use strict';

    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 (!window.Proxy || !window.WebSocket) return;
            var to_block =[
                'et-code.ru',
                'mxtads.com',
                'torvind.com',
                'trafmag.com',
                'ws.hghit.com',
                'wsp.marketgid.com'
            ];
            var ws = window.WebSocket;
            window.WebSocket = new Proxy(ws, {
                construct: function(WS,i){
                    console.log('Opening WebSocket on', i[0], '…');
                    var d = i[0].match(/:\/\/[^:/]+/)[0];
                    if (d && to_block.indexOf(d.substring(3)) > -1) {
                        console.log("Nope! Not gonna happen!");
                        return {};
                    } else return new WS(i[0],i[1]);
                }
            });
        })();
        // https://greatest.deepsurf.us/scripts/14720-it-s-not-important
        (function(){
            var imptt = /((display|(margin|padding)(-top|-bottom)?)\s*:[^;!]*)!\s*important/ig,
                rplsf = function(str,grp){return grp;};

            function unimportanter(el, si) {
                if (!imptt.test(si) || el.style.display == 'none')
                    return 0; // get out if we have nothing to do here
                var so = si.replace(imptt, rplsf), 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 });

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

    document.addEventListener ("DOMContentLoaded", function() {
        // function to search and remove nodes by conten
        // 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 = [];

            while (i--)
                if (words.test(nodes[i].innerHTML) || !nodes[i].childNodes.length) {
                    var node = nodes[i],
                        siblings = Math.abs(params.siblings) || 0,
                        iterFunc = params.siblings > 0 ? 'nextSibling' : 'previousSibling';
                    // drill up to the specified parent node if required
                    if (params.parent)
                        while(node !== scope &&
                              node.tagName.toLowerCase() !== 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--; //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
        //   .watch - 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 dowsn 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 watch mode if required
            if (params.watch) {
                if (window.MutationObserver) {
                    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;
            }
            // watch for a full page load to do one extra cut
            window.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--;
                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));
        }

        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');
            var re = /\w{1,5}\d{1,5}\w{1,5}\d{1,5}/;
            for(var i = 0; i < divs.length; i++)
                if(re.test(divs[i].className))
                    divs[i].style.display = 'none';

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

            style.sheet.insertRule([
                '.b-aplayer-teasers > a',
                '.b-player-popup__content > div[class][style="position: relative;"]',
                'div[class^="b-adproxy"]',
                'div[id^="admixer_async_"]'
            ].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++;
                    },
                    cl = function(p) {
                        function skipListener() {
                            p.pause();
                            if (!p.classList.contains('m-hidden'))
                                p.classList.add('m-hidden');
                            setTimeout(adStepper, 1000, p);
                        }
                        p.addEventListener('timeupdate', skipListener, false);
                    },
                    o = new MutationObserver(function (mut) {
                        mut.forEach(function (e) {
                            for (var i = 0; i < e.addedNodes.length; 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['fishki.net'] = function() {
            gardener('.main-post', /543769|Реклама/);
        };

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

        };

        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['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', watch:true});
            gardener(catalogAds.join(','), words, {root:'.catalog__page,.content__wrapper', watch: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);
        };

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