移除csdn

自动从搜索结果中移除csdn, 目前支持 google, bing, baidu(回车或点击按钮触发). 有任何问题请提交反馈

// ==UserScript==
// @name         移除csdn
// @version      0.9
// @description  自动从搜索结果中移除csdn, 目前支持 google, bing, baidu(回车或点击按钮触发). 有任何问题请提交反馈
// @author       zhylmzr
// @grant        none
// @run-at       document-start

// @include https://www.google.*/*
// @include https://*.bing.com/*
// @include https://www.baidu.com/*
// @namespace http://tampermonkey.net/
// ==/UserScript==

(function () {
  const host = location.host
  const params = parseUrlParams()

  if (~host.indexOf('google')) {
    removeFromGoogle()
  } else if (~host.indexOf('bing')) {
    removeFromBing()
  } else if (~host.indexOf('baidu')) {
    removeFromBaidu()
  }

  function removeFromBaidu() {
    let res = generateSearch('wd')
    if (res.redirect) {
      location.search = res.search
      return
    }

    window.onload = () => {
      let searchInput = document.getElementById('kw')
      let searchSubmit = document.getElementById('su')
      const extraKeyword = '-csdn'

      searchInput.value = searchInput.value.replace(extraKeyword, '').trim()
      searchInput.addEventListener('keydown', e => {
        if (e.key === 'Enter') {
          _modifyQuery()
        }
      }, true)
      searchSubmit.addEventListener('click', () => {
        _modifyQuery()
      }, true)

      function _modifyQuery() {
        searchInput.value += ` ${extraKeyword}`
        setTimeout(() => {
          searchInput.value = searchInput.value.replace(extraKeyword, '').trim()
        })
      }
    }
  }

  function removeFromBing() {
    // 判断是否使用国际版
    const cookies = parseCookies()
    const isInternaltional = 'ensearch' in params || cookies.ENSEARCH.includes('BENVER=1')

    // 国际版 "NOT csdn" 排除不了
    const extraKeyword = isInternaltional ? 'NOT blog.csdn.net' : 'NOT csdn'
    let res = generateSearch('q', extraKeyword)
    console.log(isInternaltional, extraKeyword, res, params)
    if (res.redirect) {
      location.search = res.search
      return
    }

    window.onload = () => {
      let searchInput = document.getElementById('sb_form_q')
      let searchForm = document.getElementById('sb_form')

      let originFunc = Element.prototype.appendChild
      Element.prototype.appendChild = function (n) {
        originFunc.apply(this, arguments)
        if (n.name === 'pq') {
          n.value += ` ${extraKeyword}`
        }
      }

      try {
        searchInput.value = searchInput.value.replace(extraKeyword, '').trim()
        searchForm.addEventListener('submit', () => {
          searchInput.value += ` ${extraKeyword}`
        }, true)
      } catch (e) {
        // DON'T HANDLER
      }
    }
  }

  function removeFromGoogle() {
    let res = generateSearch(['q', 'oq'])

    if (res.redirect) {
      location.search = res.search
      return
    }
    window.onload = () => {
      let searchInput = document.getElementsByClassName('gLFyf')[0]
      let searchForm = document.getElementsByClassName('tsf')[0]
      let searchBtn = document.getElementsByClassName('Tg7LZd')[0]

      const extraKeyword = '-csdn'
      searchInput.value = searchInput.value.replace(extraKeyword, '').trim()

      searchForm.addEventListener('submit', (e) => {
        e.stopPropagation
        _restore()
      }, true)
      searchBtn.addEventListener('click', () => {
        _restore()
      }, true)

      function _restore() {
        searchInput.value += ` ${extraKeyword}`
        let hiddenInput = document.querySelector('[name=oq]')
        if (hiddenInput && !~hiddenInput.value.indexOf(extraKeyword)) {
          hiddenInput.value += ` ${extraKeyword}`
        }
        let originFunc = window.s__we
        window.s__we = (a, b) => {
          originFunc(a, b)
          hiddenInput = document.querySelector('[name=oq]')
          if (!~hiddenInput.value.indexOf(extraKeyword)) {
            hiddenInput.value += ` ${extraKeyword}`
          }
        }
      }
    }
  }

  // 生成重定向url参数
  function generateSearch(keyNameArray = [''], extraParam = '-csdn') {
    if (!(keyNameArray instanceof Array)) {
      keyNameArray = [keyNameArray]
    }

    let flag = false
    for (const k of keyNameArray) {
      // 如果关键字存在 并且 关键值中不包含有额外参数值
      if (k in params && !params[k].includes(extraParam)) {
        params[k] += ` ${extraParam}`
        flag = true
      }
    }

    return {
      redirect: flag,
      search: Object.keys(params)
        .map(k => [k, encodeURIComponent(params[k])]) // 生成[k, encode(v)]式参数数组
        .map(e => e.join('=')) // 生成k=encode(v)式参数数组
        .join('&')
    }
  }

  // 解析url的参数
  function parseUrlParams() {
    const url = new URL(location.href)
    const params = url.searchParams
    const it = params.keys()

    let obj = {}
    let result = it.next()
    while (!result.done) {
      obj[result.value] = params.get(result.value)
      result = it.next()
    }
    return obj
  }

  // 解析cookies
  function parseCookies() {
    let obj = {}
    document.cookie.split(";").forEach(e => {
      let v = e.trim()
      let i = v.indexOf("=")
      let pair = [v.substring(0, i), v.substring(i + 1, v.length)]
      obj[pair[0]] = pair[1]
    })
    return obj
  }
})()