搜索引擎切换|搜索跳转(支持PC端+移动端)

快速切换搜索引擎,支持PC端、移动端,自动提取搜索关键词,一键跳转,自动隐藏、自动显示。目前支持谷歌、百度、Yandex、Bilibili、知乎等等

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         搜索引擎切换|搜索跳转(支持PC端+移动端)
// @namespace    http://tampermonkey.net/
// @version      1.0.3
// @description  快速切换搜索引擎,支持PC端、移动端,自动提取搜索关键词,一键跳转,自动隐藏、自动显示。目前支持谷歌、百度、Yandex、Bilibili、知乎等等
// @author       DQIT
// @match        *://*.google.com*/search*
// @match        *://*.google.com.hk*/search*
// @match        *://*.bing.com/search*
// @match        *://*.baidu.com/s*
// @match        *://chatgpt.com/*
// @match        *://metaso.cn/*
// @match        *://weixin.sogou.com/weixin*
// @match        *://search.bilibili.com/all*
// @match        *://m.bilibili.com/search*
// @match        *://*.zhihu.com/search*
// @match        *://*.xiaohongshu.com/explore*
// @match        *://*.douyin.com/search/*
// @match        *://*.yandex.com/*
// @match        *://*.duckduckgo.com/*
// @match        *://*.perplexity.ai/*
// @match        *://*.quark.sm.cn/*
// @grant        GM_addElement
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 搜索引擎列表
    const engins = [
        { name: "Google", searchUrl: "https://www.google.com/search?q="},
        { name: "Bing", searchUrl: "https://www.bing.com/search?q="},
        { name: "百度", searchUrl: "https://www.baidu.com/s?wd="},
        { name: "夸克", searchUrl: "https://quark.sm.cn/s?q="},
        { name: "Yandex", searchUrl: "https://yandex.com/search/?text="},
        { name: "DuckDuckGo", searchUrl: "https://duckduckgo.com/?q="},
        { name: "ChatGPT", searchUrl: "https://chatgpt.com/?hints=search&q="},
        { name: "秘塔", searchUrl: "https://metaso.cn/?q="},
        { name: "Youtube", searchUrl: "https://www.youtube.com/results?search_query="},
        { name: "GitHub", searchUrl: "https://github.com/search?q="},
        { name: "知乎", searchUrl: "https://www.zhihu.com/search?q="},
        { name: "B站", searchUrl: "https://search.bilibili.com/all?keyword="},
        { name: "微信", searchUrl: "https://weixin.sogou.com/weixin?type=2&s_from=input&query="},
        { name: "小红书", searchUrl: "https://www.xiaohongshu.com/explore?q="},
        { name: "抖音", searchUrl: "https://www.douyin.com/search/"},
        { name: "Perplexity", searchUrl: "https://www.perplexity.ai/?q="},
    ];

    const paramNames = ["wd", "q", "query", "keyword", "text", "word", "search_query"]

    function getSearchKeyword() {
        const queryString = window.location.search;
        if (!queryString) {
            return null;
        }
        const urlParams = new URLSearchParams(queryString);
        for (const paramName of paramNames) {
            if (urlParams.has(paramName)) {
                return urlParams.get(paramName);
            }
        }
        return null;
    }

    function createStyle() {
        const style = document.createElement('style');
        style.textContent = `
        /* 公共样式 */
        :root {
        --bg-blur: 12px;
        --button-spacing: 8px;
        }

        /* 设备检测容器 */
        #search-tool-container {
            position: fixed;
            backdrop-filter: blur(var(--bg-blur));
            -webkit-backdrop-filter: blur(var(--bg-blur));
            background-color: rgba(255, 255, 255, 0.7);
            border-radius: 16px;
            box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
            transition: all 0.3s ease;
            z-index: 9999
        }

        /* 彩色模糊背景元素 */
        #search-tool-container::before {
            content: '';
            position: absolute;
            inset: 0;
            background: radial-gradient(circle at 30% 30%,
                rgba(79, 96, 204, 0.2) 0%,
                rgba(100, 100, 255, 0.2) 100%);
            filter: blur(40px);
            z-index: -1;
        }

        /* PC端样式 */
        @media (min-width: 768px) {
            #search-tool-container {
                width: 100px;
                height: 700px;
                top: 150px;
                left: 10px;
                padding: 16px 8px;
                display: flex;
                flex-direction: column;
                gap: var(--button-spacing);
            }

            .search-tool-button {
                background: rgba(255, 255, 255, 0.15);
                border: 1px solid rgba(255, 255, 255, 0.2);
                padding: 8px;
                border-radius: 8px;
                cursor: pointer;
                transition: all 0.3s ease;
                backdrop-filter: blur(4px);
                display: flex;
                justify-content: center;
            }

            .search-tool-button:hover {
                background: rgba(255, 255, 255, 0.3);
                transform: translateX(3px);
            }
        }

        /* 移动端样式 */
        @media (max-width: 767px) {
            #search-tool-container {
                width: 100%;
                height: 40px;
                bottom: 0;
                left: 0;
                right: 0;
                padding: 4px 8px;
                display: flex;
                overflow-x: auto;
                scrollbar-width: none;
                border-radius: 8px 8px 0 0;
                background: linear-gradient(135deg, rgb(212, 227, 252, 0.4), rgb(240, 239, 253, 0.4));
            }

            #search-tool-container::-webkit-scrollbar {
                display: none;
            }

            .search-tool-button {
                flex-shrink: 0;
                min-width: 60px;
                height: 32px;
                margin: 0 4px;
                padding: 0 12px;
                border-radius: 16px;
                background: rgba(0, 0, 0, 0.1);
                display: flex;
                align-items: center;
                justify-content: center;
                transition: all 0.2s ease;
                color: rgba(0, 0, 0, 0.9);
            }

            .search-tool-button:active {
                transform: scale(0.95);
            }
        }

        /* 白天模式 */
        @media (prefers-color-scheme: light) {
            #search-tool-container {
                background-color: rgba(255, 255, 255, 0.7);
            }
        }

        /* 夜间模式 */
        @media (prefers-color-scheme: dark) {
            #search-tool-container {
                background-color: rgba(0, 0, 0, 0.5);
            }
        }

        /* 夜间模式按钮调整 */
        @media (prefers-color-scheme: dark) {
            .search-tool-button {
                background: rgba(255, 255, 255, 0.1);
                color: rgba(255, 255, 255, 0.9);
            }
        }
        `;
        document.head.appendChild(style);
    }

    // 创建按钮
    function createSearchTool(){
        //创建容器
        const container = document.createElement('div');
        container.id = 'search-tool-container';

        //创建按钮
        for (const engine of engins) {
            const btn = document.createElement('div');
            btn.classList.add('search-tool-button')
            btn.textContent = engine.name;
            // 绑定点击跳转事件
            btn.addEventListener('click', function() {
                let keyword = getSearchKeyword()
                window.open(engine.searchUrl + encodeURIComponent(keyword),'_self')
            });
            container.appendChild(btn);
        }

        //显示容器
        document.body.appendChild(container);

        let lastScrollTop = 0;
        window.addEventListener('scroll', function() {
            const scrollTop = window.pageYOffset || document.documentElement.scrollTop;

            if (scrollTop > lastScrollTop) {
                // 向下滚动,隐藏横条
                container.style.display = 'none';
            } else {
                // 向上滚动,显示横条
                container.style.display = 'inline-flex';
            }

            lastScrollTop = scrollTop;
        });

    }

    function init(){
        let keyword = getSearchKeyword();
        if(!keyword){
            //未提取到关键词不显示
            return;
        } else {
            createStyle();
            createSearchTool(keyword);
        }

    }

    // 使用 MutationObserver 来确保脚本在动态加载的页面上也能正常工作
    const observer = new MutationObserver((mutations, obs) => {
        const body = document.querySelector('body');
        if (body) {
            init();
            obs.disconnect();
        }
    });

    observer.observe(document.documentElement, {
        childList: true,
        subtree: true
    });

})();