Site Switcher

Add links to each other in search engines. Including multiple search modes.

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

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

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

作者のサイトでサポートを受ける。または、このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name                Site Switcher
// @name:zh-CN          一键切换搜索/镜像站
// @name:zh-TW          壹鍵切換搜索/镜像站
// @description         Add links to each other in search engines. Including multiple search modes.
// @description:zh-CN   在常用的搜索引擎/镜像站页面中添加互相切换的按钮。
// @description:zh-TW   在常用的搜索引擎/镜像站頁面中添加互相切換的按鈕。

// @author              l1xnan
// @namespace           http://hzy.pw
// @homepageURL         http://hzy.pw/p/1849
// @supportURL          https://github.com/h2y/link-fix
// @icon                http://q.qlogo.cn/qqapp/100229475/F1260A6CECA521F6BE517A08C4294D8A/100
// @license             GPL-3.0
// @include             https://github.com/*
// @include             https://github.com.cnpmjs.org/*
// @include             *.baidu.com/*
// @exclude             *.baidu.com/link?*
// @include             *.so.com/*
// @include             *.bing.com/*
// @include             *.zhihu.com/search?*
// @include             *.soku.com/*
// @include             *.sogou.com/*
// @include             /^https?://[a-z]+\.google\.[a-z,\.]+/.+$/
// @grant               none
// @run-at              document_end

// @date                02/16/2020
// @modified            02/16/2020
// @version             1.0.0
// ==/UserScript==

{
  const sites = [
    {
      name: '百度',
      host: 'baidu.com',
      link: 'https://www.baidu.com/s',
      key: 'wd',
    },
    {
      name: '必应',
      host: 'bing.com',
      link: 'https://bing.com/search',
      key: 'q',
    },
    {
      name: '谷歌',
      host: 'www.google.com',
      link: 'https://www.google.com/search',
      key: 'q',
      mirror: 'google.fuckcloudnative.io',
    },
    {
      name: 'Github',
      host: 'github.com',
      link: 'https://github.com/search',
      key: 'q',
      mirror: 'github.com.cnpmjs.org',
    },
    // {
    //   name: '搜搜',
    //   host: 'so.com',
    //   link: 'https://www.so.com/s?q=',
    //   key: 'q',
    //   hidden: true,
    // },
    // {
    //   name: '搜狗',
    //   host: 'sogou.com',
    //   link: 'https://www.sogou.com/web?query=',
    //   key: 'query',
    //   hidden: true,
    // },
  ];

  // 镜像站
  const mirrors = {
    'github.com': 'https://github.com.cnpmjs.org/search?q=',
    'google.com': 'https://google.fuckcloudnative.io/search?q=',
  };
  const css = `
  .search-switcher {
      position: fixed;
      box-sizing:border-box;
      background-color: #000;
      opacity: 0.3;
      border-radius: 40px;
      color: #fff;
      padding: 15px 20px;
      bottom: 100px;
      left: -280px;
      width: 300px;
      z-index: 9999999;
      transition: all 400ms;
    }
    .search-switcher:hover {
      left: 5px;
      opacity: 1;
      border-radius: 10px;
      box-shadow: 5px -5px 10px #777;
    }
    .search-switcher p {
      margin: 0;
    }
    p.search-switcher-title {
      font-weight: bold;
      margin-bottom: 5px;
    }
    .search-switcher a {
      color: #0cf;
      margin-right: 20px;
    }
    .search-switcher a.mirror {
      font-weight: bold;
    }
    `;

  function setup() {
    let site;
    let isMirror;
    for (let s of sites) {
      if (location.host.includes(s.host)) {
        site = s;
      }
      if (location.href.includes(s.mirror)) {
        site = s;
        isMirror = true;
      }
    }
    sites.filter(({ host }) => location.hostname.includes(host))[0];
    let mirror = sites.filter(({ mirror }) =>
      location.hostname.includes(mirror),
    )[0];

    let query = new URLSearchParams(location.search).get(site.key || 'q');
    console.log(site, query, isMirror);
    const body = document.getElementsByTagName('body')[0];

    // 样式
    const style = document.createElement('style');
    style.innerHTML = css;
    body.appendChild(style);

    // 生成切换框
    const content = document.createElement('div');
    const aTag = ({ link, name, host, mirror, key }) => {
      let className = '';
      let text = name;
      let href = `${link}?${key}=${query}`;
      if (mirror && name === site.name) {
        href = location.href.replace(host, mirror);
        text = '镜像';
        className = 'mirror';
        if (isMirror) {
          text = '原站';
          href = location.href.replace(mirror, host);
        }
      }
      return `<a href='${href}' target='_blank' class=${className}>${text}</a>`;
    };
    const tags = sites
      .filter(({ hidden }) => !hidden)
      .map(aTag)
      .join('');

    content.innerHTML = `
      <div id='search-switcher' class='search-switcher'>
        <p class='search-switcher-title'>一键切换引擎:</p>
        <p>${tags}</p>
      </div>`;
    body.appendChild(content);
  }

  let href0 = '';

  !(function init() {
    var href = location.href;
    if (href0 != href) {
      var oldDOM = document.getElementById('search-switcher');
      if (oldDOM) {
        oldDOM.parentNode.removeChild(oldDOM);
      }
      setup();
      href0 = href;
    }
    setTimeout(init, 2222);
  })();
}
//end userScript