百度搜索 - 优化

1、屏蔽百度推广 2、关闭百度广告联盟信息收集 3、绑定快捷键 4、布局调整 5、居中单列(可选) 6、居中双列(可选)

当前为 2018-05-07 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         百度搜索 - 优化
// @namespace    http://tampermonkey.net/
// @home-url     https://greasyfork.org/zh-CN/scripts/31642
// @description  1、屏蔽百度推广 2、关闭百度广告联盟信息收集 3、绑定快捷键 4、布局调整 5、居中单列(可选) 6、居中双列(可选)
// @version      3.1.3
// @author       浮生未歇
// @include      http://www.baidu.com/*
// @include      https://www.baidu.com/*
// @require      https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js
// @resource     baiduIndexStyle   https://lche.win/baidu/Baidu-2018-04-27/baiduIndexStyle.css
// @resource     baiduIndexStyleNo https://lche.win/baidu/Baidu-2018-04-27/baiduIndexStyleNo.css
// @resource     baiduCommonStyle  https://lche.win/baidu/Baidu-2018-04-27/commonStyle.css
// @resource     baiduMyMenuStyle  https://lche.win/baidu/Baidu-2018-04-27/customMenuStyle.css
// @resource     baiduOnePageStyle https://lche.win/baidu/Baidu-2018-04-27/onePageCenterStyle.css
// @resource     baiduTwoPageStyle https://lche.win/baidu/Baidu-2018-04-27/twoPageCenterStyle.css
// @run-at       document-start
// @connect      *
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';
    // Your code here...
    /*
    模块:配置
    */
    var Config = {

        //是否开启DEBUG。true:表示开启,false:表示关闭
        isDebug:false,

        //是否开启重定向。true:表示开启,false表示关闭
        redirect:GM_getValue("redirect",false),

        //是否开启自动加载下一页。true:表示开启,false表示关闭
        //preLoader:GM_getValue("preLoader",false),

        //是否导入首页样式
        isImportIndexStyple:false,

        //Run刷新名称,
        runResetElementName:"#isRunReset",

        //功能选择页。0:表示普通页,1:表示居中单页,2:表示居中双页
        option:GM_getValue("option",0),

        //监测点元素默认最大高度。监测到点的高度小于该值时,触发脚本
        testDefinedMaxHeight:50,

        //监测元素默认最小高度
        testDefinedMinHeight:5,

        //监测点元素
        testElementName:"#form",

        //样式集
        styles:[{
            //百度首页
            indexStyle   : "baiduIndexStyle",

            //未登录
            indexStyleNo : "baiduIndexStyleNo",

            //普通样式
            commonStyle  : "baiduCommonStyle",

            //自定义菜单样式
            menuStyle    : "baiduMyMenuStyle",

            //单页样式
            onePageStyle : "baiduOnePageStyle",

            //双页样式
            twoPageStyle : "baiduTwoPageStyle",
        }],



        //需要安装重置Run的选择器(让函数可以再次运行)
        resetSelectors:[
            "#page a",
            "#su",
            "#result_logo",
            "#s_kw_wrap",
        ],

        //需要屏蔽的广告
        ads:[
            "#content_left>div[style*='display:block !important;']",
            "#content_left>div[id^='30']",
            "#content_left>div:not([id])",
            "#content_left>#clone",

        ],

        //需要重定向的元素(重定向过的元素会添加 "redirect"类)
        redirectElements:[
            "#content_left .c-container h3 > a:not([class*='redirect'])",
        ],

        //重定向地址
        redirectURL:"www.baidu.com/link",


        //自动加载下一页
        preLoaderConfig:[{
            //当前域名
            hostName     : "https://www.baidu.com" ,
            //下一页按钮
            nextPageButton : "#page a[href*='rsv_page=1']" ,
            //页码按钮
            pageButton : "#page > a:first",

            //条目块
            itemSelector : ".c-container" ,

            //条目总数可能值(即一页加载多少结果)
            itemNums:[10,20,50],

        }],


    };


    /*
    模块:Debug
    */
    var Debug = {
        isDebug:Config.isDebug,
        printDebugInfo:function(name,message){
            if(this.isDebug){
                console[name](message);
            }
        },
        group:function(message){
            this.printDebugInfo("group",message);
        },
        groupEnd:function(message){
            this.printDebugInfo("groupEnd",message);
        },
        log:function(message){
            this.printDebugInfo("log",message);
        },
        info:function(message){
            this.printDebugInfo("info",message);
        },
        error:function(message){
            this.printDebugInfo("error",message);
        },
        count:function(message){
            this.printDebugInfo("count",message);
        }
    };

    /*
    模块:Run运行
    */
    var Run = {
        _ready:function(callback){
            return function(){
                $(document).ready(callback);
            };
        },
        ready:function(callback){
            this._ready(callback)();
        },

    };
    /*
    模块:样式
    */
    var Style ={
        //缓存
        cache: [],
        //清除缓存
        clearCache:function(){
            this.cache = [];
        },
        //加入样式队列
        addQueue:function(style){
            this.cache.push(style);
        },

        //开始导入样式(必须先将样式加入队列)
        import:function(){
            var styles = null;
            this.cache.forEach(function(style,index,arr){
                styles += GM_getResourceText (style);
                Debug.log("import( " + style + " )style……" );
            });
            GM_addStyle(styles);
            this.clearCache();
        },
    };

    /*
    模块:数据
    */
    var Data={
        getGmValue(name){
            return GM_getValue(name,Config[name]);
        },
        setGmValue(name,value){
            GM_setValue(name,value);
        },
        resetCount(){
            Config.count = 0;
        },
        resetRun(){
            Config.runCache = [];
        },
        resetAll(){
            Data.resetCount();
            Data.resetRun();

        }
    };

    /*
    模块:检查
    */
    var Check = {
        //获取到顶部的距离
        isOffsetHight:function(){
            var offsetTopHight = $(Config.testElementName).offset().top;// 0 < top < 50
            Debug.log("offsetTopHight : " + offsetTopHight);
            return Config.testDefinedMinHeight < offsetTopHight  && offsetTopHight < Config.testDefinedMaxHeight;
        },
        //页布局 0: 普通页,1:单页居中,2:双页居中,3:
        isLayout:function(num){
            return Data.getGmValue("option") == num;
        },
        //存在元素
        isExist:function(elementName){
            return $(elementName).length > 0;
        },
        //是否重定向
        isRedirect:function(){
            return Data.getGmValue("redirect");
        },

    };

    //多页布局
    var MultiColumnLayout = {
        //添加LIST类,用于存放ITEM
        addList:function($parent,list,colsum){
            //if( $parent.children(list).length > 0)return;
            var div = "";
            for(var i = 1; i <= colsum; i++){
                div += "<div id='list" + i + " ' class='list'></div>";
            }
            $parent.prepend(div);
        },

        //将结果移动到list
        addItem:function($item){
            var $list  = $("#content_left > .list");
            if($item.length == 0 || $list.length == 0)return;
            $item.each(function(){
                var heightArray = [] ; //高度集合
                var minHightIndex = 0; //最小高度 INDEX
                $list.each(function(){
                    heightArray.push($(this).height());
                });
                minHightIndex = heightArray.indexOf(Math.min.apply(window,heightArray));
                $(this).appendTo($list.eq(minHightIndex));
            });

        }
    };
    /*
    模块 - 重定向
    */
    var Redirect = {
        isRedirect:Check.isRedirect(),
        start:function(){
            if(!this.isRedirect)return;
            $(Config.redirectElements.join()).each(function(){
                var that = this;
                var URL = $(that).attr("href");
                if(URL.indexOf(Config.redirectURL) > 0){
                    $(that).removeAttr("data-click");
                    GM_xmlhttpRequest({
                        url:URL,
                        method:"HEAD",
                        onload:function(xhr){
                            //Debug.log("finalUrl:" + xhr.finalUrl);
                            try{
                                //将真实地址替换原来地址,并添加标志类(防止再次重定向)
                                $(that).attr("href",xhr.finalUrl).addClass("redirect");
                            }catch(e){
                                Debug.log("重定向发生错误:" + e);
                            }
                        },

                    });
                }

            });

        },
    };



    /*
    自动加载下一页
    */
    function PreLoader(config){
        //当前配置
        this.config = config;

        //条目计数器
        this.item_sum = 0;

        //页地址 (需要初始化)
        this.page_url = null;

        //缓存数据(需要初始化)
        this.cache = [];

        //第几页(0表示本页)(需要初始化)
        this.page_count = 1;

    }
    PreLoader.prototype={

        //是否存在缓存
        hasCache:function(){
            return this.cache.length > 0;
        },

        //重置
        reset:function(){
            this.cache = [];
            this.page_count = 1;
            this.page_url = null;
        },

        //获取解析地址
        getPageURL:function(){
            if(this.page_url == null){
                this.page_url = this.config.hostName + $(this.config.pageButton).attr("href");
            }
            return this.page_url;
        },
        //获取条目数量
        getItemSum:function(){
            if(this.item_sum == 0){
                var that = this;
                var URL = this.getPageURL();
                that.config.itemNums.forEach(function(num){
                    if(URL.indexOf("pn=" + num) > 0){
                        that.item_sum = num;
                    }
                });
            }
            return this.item_sum;
        },
        //获取下一页地址
        getNextPageURL:function(pageCount){
            var url = this.getPageURL();
            var sum = this.getItemSum();
            return url.replace(/pn=\d+/g, "pn="+ pageCount * sum);
        },
        //发送请求
        send:function(){
            Debug.log("sendRequest");
            var that = this;
            var URL = this.getNextPageURL(this.page_count++);
            $.ajax({
                url      : URL,
                async    : true,
                timeOut  : 5000 ,
                type     : "GET",
                dataType : "HTML",
                cache    : false,
                success  : function(data,status){
                    var reg = /<body[\s\S.]+<\/body>/g;
                    var body = reg.exec(data)[0];
                    var item = $(body).find(that.config.itemSelector);
                    that.cache.push(item);
                },
                error   : function(e){
                    Debug.log("请求失败:" + e);
                }
            });
        },

        //将数据加载到网页中
        addDataToWeb:function(){
            Debug.log("addDataToWeb");
            MultiColumnLayout.addItem(this.cache.shift());
            Redirect.start();
        },

        //预加载
        start:function(callback){
            var $element = $("#content_left");
            var className = "PreLoaderInit";
            var hide = ["#rs","#page"];
            //如果还没有初始化
            if( $element.length > 0 && !$element.hasClass(className)){
                $element.addClass(className);
                $(hide.join()).hide();

                //重置数据
                this.reset();

                //第一次预加载
                this.send();

                //第二次预加载
                var that = this;
                var timer = setInterval(function(){
                    if(that.hasCache()){
                        clearInterval(timer);
                        that.load();
                        callback();
                    }
                },100);
            }

        },
        //正常加载
        load:function(){
            //发送数据
            this.send();

            //如果存在缓存数据
            if(this.hasCache()){
                this.addDataToWeb();
            }else{
                var that = this;
                var timer = setInterval(function(){
                    if(that.hasCache()){
                        clearInterval(timer);
                        that.load();
                    }
                },100);
            }

        }
    };



    /*****************************************************************************************/
    /* 函数功能化  */
    /*****************************************************************************************/

    var Launch = {

        //导入首页样式(已登录版)
        importIndexStyles:function(){
            Style.addQueue(Config.styles[0].indexStyle);
            Style.import();
        },

        //导入首页样式(未登录版)
        importIndexStylesNo:function(){
            Style.addQueue(Config.styles[0].indexStyleNo);
            Style.import();
        },

        //导入搜索页样式
        importStyles:function(itemOption){
            var styles = Config.styles[0];
            var option = itemOption || Data.getGmValue("option");
            Debug.log("option:"+option);
            Style.addQueue(styles.commonStyle);
            Style.addQueue(styles.menuStyle);
            switch(option){
                case 1:Style.addQueue(styles.onePageStyle);break;
                case 2:
                case 3:Style.addQueue(styles.twoPageStyle);break;
            }
            Style.import();
        },

        //屏蔽广告
        removeAds:function(){
            //1. 屏蔽普通广告
            var removeCommonAds = function(){
                $( Config.ads.join()).remove();
            };

            //2. 屏蔽再次出现的广告
            var removeLaterAds = function(){
                var $selector = $("#content_left > div[id='1']");
                var $result1 =  $selector.next().attr('id') == 2;
                var $result2 =  $("#content_left > div[id]").length != 1;
                if($result1){
                    $selector.attr("id","a1");
                }
                if($result2){
                    GM_addStyle("#content_left > div[id='1'],#content_left .result~div[id='1'] {display: none!important;}");
                }
            };

            //自执行
            (function(){
                removeCommonAds();
                removeLaterAds();
            })();


        },

        //插入自定义菜单
        inserCustomMenu:function(){
            if(Check.isExist("#CustomMenu") ) return;

            var parent = "#u";
            var content = "";
            var div = "";

            //1.添加三种排版
            content += "<li>普通样式</li> <li>居中单列</li> <li>居中双列</li>";

            //2.添加居中双列高级版
            content += "<li  title='自动加载下一页'>居中双列(高级版)</li>";

            //3.添加重定向
            if(Check.isRedirect()){
                content += "<li class='error'>关闭重定向</li>";
            }else{
                content += "<li class='success'>开启重定向</li>";
            }

            //拼接完整div
            div = "<a id='CustomMenu'><ol class='button'><li>自定义</li> </ol> <ol class='menu'>"+ content +"</ol></a>";
            $(parent).prepend($(div));

        },
        //绑定自定义菜单事件
        bindCustomMenuEvent:function(){
            var $menu =  $("#CustomMenu .menu");
            var $li  =  $("#CustomMenu .menu li");
            //自定义菜单点击
            $("#CustomMenu").unbind('click').click(function() {
                $menu.css("display", "block");
            });
            //关闭自定义菜单
            $(document).unbind('mouseup').mouseup(function(e) {
                var _con = $menu;
                if(!_con.is(e.target) && _con.has(e.target).length === 0) { // Mark 1
                    $menu.css("display", "none");
                }
            });
            //自定义菜单选择
            $li .each(function(index){
                $(this).unbind('click').click(function(){
                    //页面布局(0,1,2,3)
                    if(0 <= index && index <= 3){
                        Data.setGmValue("option",index);
                    }
                    //重定向(4)
                    if(index == 4){
                        if(Check.isRedirect()){
                            Data.setGmValue("redirect",false); //关闭重定向
                        }else{
                            Data.setGmValue("redirect",true);  //开启重定向
                        }
                    }
                    location.href = location.href;
                });
            });

        },


        //双页布局
        addTwoList:function(){
            var $parent = $("#content_left");
            var $item   = $("#content_left > .c-container");
            var list    = "#content_left > .list";
            //如果存在则退出
            if( $(list).length > 0) return;

            //添加节点(在 content_left 插入 2 个 list )
            MultiColumnLayout.addList($parent,list,2);

            //添加结果列表(将 item 结果添加到 list 中)
            MultiColumnLayout.addItem($item);

        },

        //绑定快捷键
        bindQuickHotkey:function(){
            $(document).keydown(function(event) {
                //上一页  Ctrl + <-
                if(event.keyCode == 37 && event.ctrlKey) {
                    $(".n:first").click();
                }
                //下一页  Ctrl + ->
                if(event.keyCode == 39 && event.ctrlKey) {
                    $(".n:last").click();
                }
                //搜索框  Ctrl + Enter
                if(event.keyCode == 13 && event.ctrlKey ) {
                    $("#kw").select();
                }
            });
        },

        //改变百度首页logo图片
        changeBaiduIndexLogo:function(){
            var URL = "https://s1.ax1x.com/2018/04/15/CZXxG4.gif";
            $("#head #lg>img").attr("src",URL);
        },

        //初始化加载
        init:function(num){
            Launch.importStyles(num);
            Run.ready(Launch.inserCustomMenu);      //插入自定义菜单
            Run.ready(Launch.bindCustomMenuEvent);  //绑定菜单事件
            Run.ready(Launch.bindQuickHotkey);      //绑定快捷键
            Run.ready(Launch.removeAds);            //移除广告
            Run.ready(Redirect.start);              //重定向
        }

    };


    /*****************************************************************************************/
    /* 自动加载下一页(只对双页居中有效) - 初始化  */
    /*****************************************************************************************/

    var preLoader = new PreLoader(Config.preLoaderConfig[0]);
    var scrollTop = 0;     //获取滚动条到顶部的距离
    var scrollHeight = 0;  //获取滚动条的高度
    var windowHeight = 0;  //获取文档区域高度

    //滚动加载下一页
    function scrollLoadPage(){
        $(window).unbind("scroll").scroll(function(){
            scrollTop    = $(this).scrollTop();     //获取滚动条到顶部的距离
            scrollHeight = $(this).height();        //获取滚动条的高度
            windowHeight = $(document).height();    //获取文档区域高度

            if( scrollTop + scrollHeight + 500  >= windowHeight){
                $(this).unbind("scroll");
                setTimeout(function(){
                    scrollLoadPage();
                },500);
                preLoader.load.call(preLoader);

            }
        });

    }

    //回到顶部按钮
    function insertBanner(){
        var selector = $("#content_left>#banner");
        if(selector.length == 0){
            $("#content_left").append("<div title='双击返回顶部' id='banner'><div class='uicon'></div></div>");
            $("#banner").unbind("click").click(function () {
                var speed= "slow";//滑动的速度
                $('body,html').animate({ scrollTop: 0 }, speed);
                return false;
            });
        }
    }

    /*****************************************************************************************/
    /* 动态函数 */
    /*****************************************************************************************/

    function  mutationfunc(){
        if(Check.isOffsetHight()){
            //设置
            Config.isImportIndexStyple = true;
            try{
                Debug.count("multationfunc()执行的次数");

                //普通页
                if(Check.isLayout(0)){
                    Launch.init(0);
                    return;
                }
                //居中单页
                if(Check.isLayout(1)){
                    Launch.init(1);
                    return;
                }
                //居中双页
                if(Check.isLayout(2)){
                    Launch.init(2);
                    //添加双列表
                    Run.ready(Launch.addTwoList);
                    return;
                }
                //居中双页(高级版)
                if(Check.isLayout(3)){
                    Launch.init(3);
                    //添加双列表
                    Run.ready(Launch.addTwoList);
                    //添加回到顶部按钮
                    Run.ready(insertBanner);
                    //加载下一页
                    Run.ready(preLoader.start(scrollLoadPage));
                    return;
                }

            }catch(e){
                Debug.error("mutationfunc()函数出现问题:" + e);
            }
        }else{
            if(!Config.isImportIndexStyple){
                Config.isImportIndexStyple = true;
                if($("#u1").length > 0){
                    Launch.changeBaiduIndexLogo();
                    Launch.importIndexStylesNo();
                }else{
                    Launch.importIndexStyles();
                }

            }
        }

    }

    /*****************************************************************************************/
    /* 执行区域 */
    /*****************************************************************************************/

    //1. 导入样式(防止加载出现闪烁)
    var inportOneStyle = function(){
        var url = "https://www.baidu.com/s?wd";
        if(location.href.indexOf(url)> -1){
            Launch.importStyles();
        }
    };
    inportOneStyle();

    //2.关闭广告收集(提取于百度js代码)
    var closeAdsCookie = function(){
        setTimeout(function(){
            var cpro_url = "http://help.wangmeng.baidu.com/cpro.php";
            var img = document.createElement("img");
            img.src = cpro_url + "?pry=" + 1 + "&_t=" + (new Date()).getTime();
        },5000);
    };
    closeAdsCookie();

    //3.动态监视并执行
    $(document).ready(function(){
        try{
            //动态监视DOM树的变化
            var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
            if( MutationObserver){
                var observer = new MutationObserver(mutationfunc);
                var wrapper = document.querySelector("#wrapper");
                observer.observe(wrapper, {
                    'childList': true,
                    //"attributes": true,
                    //"subtree":true,
                    //"characterData":true,
                    //"attributesFilter": ["class"],
                });
                // 动态加载函数
                mutationfunc();
            }else{
                //浏览题版本过旧导致不支持MutationObserver
                console.error("<百度搜索-优化> : 浏览器版本过旧,导致不支持 'MutationObserver' 接口,请升级浏览器");
                mutationfunc();
            }
        }catch(e){
            Debug.error(e);
        }
    });



})();