移除csdn

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

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

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

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==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
  }
})()