百度搜索结果过滤

兼容AC双列baidu脚本,搜索结果增加屏蔽按钮,有可视化列表查看编辑保存,支持通配符* ?

// ==UserScript==
// @name         百度搜索结果过滤
// @name:zh      百度搜索结果过滤
// @name:zh-CN   百度搜索结果过滤
// @name:zh-TW   百度搜索结果过滤
// @namespace    http://tampermonkey.net/
// @version      0.3
// @connect       *
// @description  兼容AC双列baidu脚本,搜索结果增加屏蔽按钮,有可视化列表查看编辑保存,支持通配符* ?
// @description:zh      兼容AC双列baidu脚本,搜索结果增加屏蔽按钮,有可视化列表查看编辑保存,支持通配符* ?
// @description:zh-CN   兼容AC双列baidu脚本,搜索结果增加屏蔽按钮,有可视化列表查看编辑保存,支持通配符* ?
// @description:zh-TW   兼容AC双列baidu脚本,搜索结果增加屏蔽按钮,有可视化列表查看编辑保存,支持通配符* ?
// @author       关公说爱情
// @license      MIT
// @match        https://*.baidu.com/*
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/layer/3.5.1/layer.min.js
// @exclude      https://www.baidu.com/img/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';
    const baiduHelper={};

    var $ = $ || window.$,
        removing = false,
        blacklist,
        refUrls={};

    $(document.body).append(`<link href="https://cdn.bootcdn.net/ajax/libs/layer/3.5.1/theme/default/layer.min.css" rel="stylesheet">`);

    function globToRegex (glob) {
        var specialChars = "\\^$*+?.()|{}[]";
        var regexChars = ["^"];
        for (var i = 0; i < glob.length; ++i) {
            var c = glob.charAt(i);
            switch (c) {
                case '?':
                    regexChars.push(".");
                    break;
                case '*':
                    regexChars.push(".*");
                    break;
                default:
                    if (specialChars.indexOf(c) >= 0) {
                        regexChars.push("\\");
                    }
                    regexChars.push(c);
            }
        }
        regexChars.push("$");
        return new RegExp(regexChars.join(""));
    }

    baiduHelper.init = function(){
      blacklist = GM_getValue("blacklist");
      if(blacklist==undefined)
      {
        blacklist = [];
      }

      $('.s_tab_inner').append('<a id="showBlackList" href="javascript:;" class="s-tab-item">屏蔽列表</a>');
      $('#showBlackList').on('click', function () {
          let listvalue='';
          for (let x = 0; x < blacklist.length; x++) {
              listvalue += blacklist[x];
              if(x<blacklist.length - 1)
              {
                  listvalue += "\n";
              }
          }

          layer.prompt({
              title: '域名屏蔽列表,一行一个,支持 * ? 通配符!自动过滤空行',
              formType: 2,
              area: ['500px', '350px'],
              value:listvalue,
              yes: function (index, layero) {
                  let pass = $(document.getElementsByClassName('layui-layer-input')[0]).val();
                  if(pass.length > 0){
                      blacklist = pass.split('\n');
                  }
                  else{
                      blacklist = [];
                  }
                  blacklist = blacklist.filter(function (s) { return s && s.trim(); });
                  GM_setValue("blacklist",blacklist);
                  layer.close(index);
                }
          });
      });

      $('body').on('click', '.removeItemButton', function () {
          let domain = $(this).attr('data-domain');
          layer.confirm('是否将『'+domain+'』加入到屏蔽列表?', {
              btn: ['是','否']
          }, function(index){
              blacklist.push(domain);
              GM_setValue("blacklist",blacklist);
              baiduHelper.removeItem();
              layer.close(index)
          });
      });

      var beforeScrollTop = document.documentElement.scrollTop
        window.addEventListener("scroll", function (e) {
            var afterScrollTop = document.documentElement.scrollTop,
                delta = afterScrollTop - beforeScrollTop;
            if (delta === 0) return false;
            if (delta > 0) {
               var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
               let scrollDelta = 666;
               if (document.documentElement.scrollHeight <= document.documentElement.clientHeight + scrollTop + scrollDelta) {
                   if(!removing)
                   {
                       removing=true;
                       setTimeout(function() {
                           baiduHelper.addButton();
                           baiduHelper.removeItem();
                           removing=false;
                       }, 2000);
                   }
               }
            }
            beforeScrollTop = afterScrollTop;
        }, false);
    }

    baiduHelper.cleanAd = function(){
		$('#content_right').remove();
        $('#rs_new').remove();
        $('#foot').remove();
	};

    baiduHelper.removeItem = function(){
		let $rows = $('#content_left .new-pmd');
        $rows.each(function(){
            let $row = $(this);
            let mu = $row.attr('mu');
            let domain='';
            if(mu !== undefined )
            {
                domain = baiduHelper.getUrlDomain(mu);
            }else
            {
                domain = $row.attr('data-domain');
            }

            for (let x = 0; x < blacklist.length; x++) {
                if(globToRegex(blacklist[x]).test(domain))
                {
                    $(this).remove()
                    break;
                }
            }
        });
	};

    baiduHelper.getUrlDomain = function(refUrl){
        let domain = refUrl.split('/');
        if(domain[2])
        {
            return domain[2];
        }
        return '';
    };

    baiduHelper.addButton = function(){
        let $rows = $('#content_left .new-pmd');

        $rows.each(function(){
            let $row = $(this);
            let mu = $row.attr('mu');

            if(mu !==undefined)
            {
                let $tools = $row.find('.c-icon').closest(".c-row.c-gap-top-xsmall");
                let domain = baiduHelper.getUrlDomain(mu);
                $row.attr('data-domain',domain);
                if($tools.find('.removeItemButton').length==0)
                {
                    $tools.append('<a style="margin-left: 8px" class="removeItemButton" data-domain="' + domain + '"><span class="c-color-gray" aria-hidden="true">✌屏蔽它✌</span></a>');
                }
            }
            else
            {
                let $a = $(this).find('a').eq(1);
                if($a.length > 0)
                {
                    let href = $a.attr('href');
                    let refUrl = refUrls[href];
                    if(refUrl == undefined)
                    {
                        if(href.startsWith("http"))
                        {

                            let url = href.replace(/^http:/, "https:");
                            let request = GM_xmlhttpRequest({
                                url: url,
                                headers: {"Accept": "*/*", "Referer": url},
                                method: "GET",
                                timeout: 5000,
                                onreadystatechange: function (response) {
                                    if(response.readyState===4)
                                    {
                                        refUrls[href] = response.finalUrl;
                                        let domain = baiduHelper.getUrlDomain(refUrls[href]);
                                        let $tools = $row.find('.c-icon').closest(".c-row.c-gap-top-xsmall");
                                        if($tools.length==0)
                                        {
                                            $tools = $row.find('.c-icon').closest(".g");
                                        }
                                        if($tools.length >0 )
                                        {
                                            $row.attr('data-domain',domain);
                                            if($tools.find('.removeItemButton').length==0)
                                            {
                                                $tools.append('<a style="margin-left: 8px" class="removeItemButton" data-domain="' + domain + '"><span class="c-color-gray" aria-hidden="true">✌屏蔽它✌</span></a>')
                                            }
                                        }
                                    }
                                },
                                onerror: function (response) {

                                }
                            });
                        }
                    }
                    else
                    {

                    }
                }
            }
        });
	};

    baiduHelper.cleanAd();
    baiduHelper.init();
    baiduHelper.addButton();
    baiduHelper.removeItem();
})();