再见了百家号搜索结果

删除百度搜索结果的百家号的结果

// ==UserScript==
// @name         再见了百家号搜索结果
// @namespace    http://tampermonkey.net/
// @home-url     https://greasyfork.org/zh-CN/scripts/41037
// @description  删除百度搜索结果的百家号的结果
// @version      1.2.3
// @include      http://www.baidu.com/*
// @include      https://www.baidu.com/*
// @author       依然菜刀
// @grant        none
// @run-at       document-end
// ==/UserScript==
(function () {
  String.prototype.endWith = function (s) {
    if (s == null || s === "" || this.length === 0 || s.length > this.length)
      return false;
    return this.substring(this.length - s.length) === s;
  };

  String.prototype.startWith = function (s) {
    if (s == null || s === "" || this.length === 0 || s.length > this.length)
      return false;
    return this.substr(0, s.length) === s;
  };

  var INS = ' -baijiahao';

  function addINS() {
    var kw = $("#kw").val();
    if (kw.trim().length > 0 && !kw.endWith(INS)) {
      $("#kw").val(kw + INS);
    }
  }

  function removeINS() {
    var kw = $("#kw").val();
    if (kw.endWith(INS)) {
      $("#kw").val(kw.substr(0, kw.length - INS.length));
    }
  }

  var sUrl = '/s?';

  function encode(param, url) {
    return encodeURIComponent(param);
  }

  function decode(param, url) {
    if (param.indexOf('+')) {
      param = param.replace('+', '%20');
    }
    return decodeURIComponent(param);
  }

  /**
   * 处理url,增加或者删除INS
   * @param url 原始url
   * @param toRemove 是否是移除,undefined表示添加
   * @returns {*}
   */
  function processUrlINS(url, toRemove) {
    var originUrl = url;
    var toAdd = !toRemove;
    var index = url.indexOf(sUrl);
    if (index === -1) {
      return url;
    }
    var prefix = url.substr(0, index + sUrl.length);
    url = url.substr(index + sUrl.length);
    var params = url.split('&');
    var newUrlArr = [];

    $.each(params, function (i, item) {
      var kv = item.split('=');
      if (kv[0] === 'wd' || kv[0] === 'word') {
        try {
          var v = decode(kv[1], originUrl);
          if (toAdd) {
            // 增加INS
            if (!v.endWith(INS)) {
              v = v + INS;
              kv[1] = encode(v, originUrl);
            }
          } else {
            // 移除INS,用于获取相关搜索
            if (v.endWith(INS)) {
              v = v.substr(0, v.length - INS.length);
              kv[1] = encode(v, originUrl);
            }
          }
        } catch (e) {
          console.error(e, item);
        }
      }
      newUrlArr.push(kv[0] + '=' + kv[1]);
    });
    return prefix + newUrlArr.join('&');
  }

  function delegateAjax() {
    var ajax = $.ajax;
    $.ajax = function (settings) {
      if (settings && settings.url && settings.url.startWith('/s?')) {
        settings.url = processUrlINS(settings.url);
      }
      return ajax.apply(this, arguments);
    };
  }

  delegateAjax();
  var hostname = window.location.hostname;
  // 移除百家号的搜索结果
  if (hostname === 'www.baidu.com') {
    process();
    tabsUrlProcess();
    // 相关搜索替换
    rsProcess();
    //document.addEventListener("DOMSubtreeModified", process);
    //document.addEventListener("DOMSubtreeModified", tabsUrlprocess);
    document.addEventListener("DOMSubtreeModified", rsProcess);
  }

  function tabsUrlProcess() {
    $(document).off('click').on('click', 'a', function () {
      this.href = processUrlINS(this.href);
    });
  }

  var rsHandler;
  function rsProcess(event) {
    if (rsHandler) {
      clearTimeout(rsHandler);
    }
    // 避免递归
    if (event && event.target === $("#rs")[0]) {
      return;
    }

    if (window.location.href.indexOf('/s?') === -1) {
      return;
    }

    rsHandler = setTimeout(function () {
      if ($.trim($("#kw").val()).length > 0 && $("#rs").length > 0) {
        var originUrl = processUrlINS(window.location.href, true);
        $.get(originUrl, function (html) {
          var $rs = $(html).find('#rs');
          if ($rs.length > 0) {
            $rs.find('a').each(function (i, item) {
              var href = $(this).attr('href');
              $(this).attr('href', processUrlINS(href));
            });
            $("#rs").html($rs.html());
          }
        });
      }
      rsHandler = undefined;
    }, 500);
  }

  function process() {
    $("#form").on('submit', function () {
      addINS();
    });
    $("#su").on('click', function () {
      addINS();
    });

    $("#kw").on('focus', function () {
      removeINS();
    }).on('blur', function () {
      addINS();
    });
  }
})();