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

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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
    });

})();