Greasy Fork

Greasy Fork is available in English.

AI搜索引擎增强😈

AI搜索引擎功能增强,元宝AI搜索全自动跳转,kimi搜索跳转,百度添加网址显示,google结果新标签页打开,导航可自定义网址【脚本长期维护更新,完全免费,无广告,仅限学习交流!!】

当前为 2025-06-29 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name              AI搜索引擎增强😈
// @name:zh           AI搜索引擎增强😈
// @name:zh-TW        AI搜索引擎增強😈
// @namespace         ai_search_engine_enhancements
// @version           2025-06-30
// @description       AI搜索引擎功能增强,元宝AI搜索全自动跳转,kimi搜索跳转,百度添加网址显示,google结果新标签页打开,导航可自定义网址【脚本长期维护更新,完全免费,无广告,仅限学习交流!!】
// @description:zh    AI搜索引擎功能增强,元宝AI搜索全自动跳转,kimi搜索跳转,百度添加网址显示,google结果新标签页打开,导航可自定义网址【脚本长期维护更新,完全免费,无广告,仅限学习交流!!】
// @description:zh-TW AI搜索引擎功能增強,元寶AI搜索全自動跳轉,kimi搜索跳轉,百度添加網址顯示,google結果新標籤頁打開,導航可自定義網址【腳本長期維護更新,完全免費,無廣告,僅限學習交流!!】
// @author            huahuacat,CathyElla
// @icon              data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA5NJREFUWEfFl89vVFUUxz/nzpsyJe1MO6W1tFqkqUoCLdGyEIMYjMbE4MIVJiRd4gYT/StYagIu3KImEsOOhYkSIoIa0y76g4UKrRaLwHSG+VFgmM7cS+4M084rb957Vcjc1WTuOfd83rnnfO+9QsiRSpmBmOKw1hwUGEUYAroeuWcxLBqYVYqLRc253l65EWZpCTLKpc2raD4W4UiQbeO8MZxB8VmiR37182sKcOGCcfaN8qmB45sJvNFW4NTkLJ8cOiRlr3U8AVYyZkxXOI2w9/8EX/M1TKsIEx1JmfEAdP+Vv20OoDgHJJ5I8PVFcmgOx/vkUuO6rgxUv1xz8SkEr8fMKcXBxkysAdg9H9/D5BNLe7P0Gaan5thXr4k1gMKyORmm4HQFillNMQ/3M5r2pCIWh1iXQkXCbZotzM5t8pG1rgLYVhPDL0Hu/05rbs2VKd193LKtAwb2RujbHY7CCPtti9YAUuaboD6fO1vmXlq7Inf2C4WbxvVfclgx8pYT9C1YnUj0ygdiFW6LsOTn8cd3ZbKL7uDdQ4pXjtYCLf+pWfi5Qv5GDWb4DYdtL6lAiAeGQSmkzTFj+KKZdWZec/UHTw1h+PUI7d1C/+5asIVLFeZ/qlR/jx2JEkv4C60IH0ouZb4S4agXgC7D7LerPCi407zRtjEbk6dXyS0ZuncqXnjbfyuM4WvJp8w0wpgXwN204crZ1cBUWoOtPcL+Y1Gy/ximvlxFHBifaEP5MRhmJL9s7jScaq5g6Wuaa+e90+9FNfq+Q3xAuPx5DXrXuw7xZ31rIWsBmuZ3aarM0pS7+PzSYWti54EI50+UqmaD44rBcf9t8AXILGiufh8+A7YW7LjzqGN2vecQ3+7fDb5bYPve9v9/GSoqvDwRJeKvS1nfIrSyO3OmRGll8whdO4QX34n6O9oi9GtD6337SoW/Ltd6ezNj5M0oyRF/Hai2YZAQ2aBWiKwghR09zzt09Cq29kHnYHOvqhCFkWK7xPLvmvkfg+th+x6Htvb1woslIbHDG6IqxXYqzGFk7Yo5w/XfKmSva0wDixWd7ucUQ685KAW5RSjfWw8aH4L2HjfE2mFUBQh5HNeXsBK9clNTuKXpfEbR0a9cimfnc39DKV/z8ARoPI6tUdgLSdg6sPJWzICKwpa42+uxC4mdbvmVzEK09FJaT1JLr+V1iJY+TOoQLX2aNdZsyx6nG9vtaT3PHwJueJlAXsXHsQAAAABJRU5ErkJggg==

// @include           *://www.baidu.com/*
// @include           *://www.so.com/s*
// @include           *://www.sogou.com/web*
// @include           *://www.sogou.com/sogou*
// @include           *://cn.bing.com/search*
// @include           *://www.bing.com/search*
// @include           *://www4.bing.com/search*
// @include           *://so.toutiao.com/search*
// @include           *://www.google.com/search*
// @include           *://www.google.com.hk/search*
// @include           *://duckduckgo.com*
// @include           *://kimi.moonshot.cn/*
// @include           *://www.kimi.com/*
// @include           *://yuanbao.tencent.com/*
// @include           *://chat.deepseek.com/*
// @include           *://chat.qwen.ai/*
// @include           *://www.doubao.com/*

// @require           https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.2.1/jquery.min.js
// @require           http://greasyfork.icu/scripts/454236-findandreplacedomtext-huahuacat/code/findAndReplaceDOMText-huahuacat.js?version=1112990


// @grant             unsafeWindow
// @grant             GM_openInTab
// @grant             GM.openInTab
// @grant             GM_getValue
// @grant             GM.getValue
// @grant             GM_setValue
// @grant             GM.setValue
// @grant             GM_download
// @grant             GM_xmlhttpRequest
// @grant             GM.xmlHttpRequest
// @grant             GM_addStyle
// @grant             GM_registerMenuCommand
// @license           AGPL License
// @charset		        UTF-8
// @run-at            document-idle
// ==/UserScript==
(function () {
    'use strict';
    /**
     * 脚本遵循AGPL License开源协议;在协议允许的范围类,可以自由修改
     * 开完万岁!!
    */
    //共有方法,全局共享
    function CommonFunction() {
        this.GMgetValue = function (name, value = null) {
            let storageValue = value;
            if (typeof GM_getValue === "function") {
                storageValue = GM_getValue(name, value);
            } else if (typeof GM.setValue === "function") {
                storageValue = GM.getValue(name, value);
            } else {
                var arr = window.localStorage.getItem(name);
                if (arr != null) {
                    storageValue = arr
                }
            }
            return storageValue;
        };
        this.GMsetValue = function (name, value) {
            if (typeof GM_setValue === "function") {
                GM_setValue(name, value);
            } else if (typeof GM.setValue === "function") {
                GM.setValue(name, value);
            } else {
                window.localStorage.setItem(name, value)
            }
        };
        this.GMaddStyle = function (css) {
            var myStyle = document.createElement('style');
            myStyle.textContent = css;
            var doc = document.head || document.documentElement;
            doc.appendChild(myStyle);
        };
        this.GMopenInTab = function (url, options = { "active": true, "insert": true, "setParent": true }) {
            if (typeof GM_openInTab === "function") {
                GM_openInTab(url, options);
            } else {
                GM.openInTab(url, options);
            }
        };
        this.addScript = function (url) {
            var s = document.createElement('script');
            s.setAttribute('src', url);
            document.body.appendChild(s);
        };
        this.randomNumber = function () {
            return Math.ceil(Math.random() * 100000000);
        };
        this.request = function (method, url, param, headers = { "Content-Type": "application/json;charset=UTF-8" }) {
            return new Promise(function (resolve, reject) {
                GM_xmlhttpRequest({
                    url: url,
                    method: method,
                    data: param,
                    headers: headers,
                    onload: function (response) {
                        var status = response.status;
                        var playurl = "";
                        if (status == 200 || status == '200') {
                            var responseText = response.responseText;
                            resolve({ "result": "success", "data": responseText });
                        } else {
                            reject({ "result": "error", "data": null });
                        }
                    }
                });
            })
        };
        this.crossRequest = function (method, url, param) {
            if (!method) {
                method = "get";
            }
            if (!url) {
                return new Promise(function (resolve, reject) {
                    reject({ "result": "error", "data": null });
                });
            }
            if (!param) {
                param = {};
            }
            method = method.toUpperCase();
            let config = {
                method: method
            };
            if (method === 'POST') {
                config.headers['Content-Type'] = 'application/json';
                config.body = JSON.stringify(param);
            }
            return new Promise(function (resolve, reject) {
                fetch(url, config).then(response => response.text()).then(text => {
                    resolve({ "result": "success", "data": text });
                }).catch(error => {
                    reject({ "result": "error", "data": null });
                });
            });
        };
        this.addCommonHtmlCss = function () {
            var cssText =
                `
                a[name='navigation'] {
                    transition: all 0.3s ease;
                    border: none;
                    border-radius: 4px;
                    padding: 1px 6px;
                    color: #666666;
                    text-decoration: none !important;
                    text-decoration-line: none !important;
                }
                a[name='navigation']:hover {
                    background: rgba(49, 94, 251, 0.1);
                    color: #315EFB;
                    text-decoration: none !important;
                    text-decoration-line: none !important;
                }
                .web-toast-kkli9{
                    position: fixed;
                    background: rgba(0, 0, 0, 0.7);
                    color: #fff;
                    font-size: 14px;
                    line-height: 1;
                    padding:10px;
                    border-radius: 3px;
                    left: 50%;
                    transform: translateX(-50%);
                    -webkit-transform: translateX(-50%);
                    -moz-transform: translateX(-50%);
                    -o-transform: translateX(-50%);
                    -ms-transform: translateX(-50%);
                    z-index: 999999999999999999999999999;
                    white-space: nowrap;
                }
                .fadeOut{
                    animation: fadeOut .5s;
                }
                .fadeIn{
                    animation:fadeIn .5s;
                }
                `;
            this.GMaddStyle(cssText);
        };
        this.webToast = function (params) {	//小提示框
            var time = params.time;
            var background = params.background;
            var color = params.color;
            var position = params.position;  //center-top, center-bottom
            var defaultMarginValue = 50;

            if (time == undefined || time == '') {
                time = 1500;
            }

            var el = document.createElement("div");
            el.setAttribute("class", "web-toast-kkli9");
            el.innerHTML = params.message;
            //背景颜色
            if (background != undefined && background != '') {
                el.style.backgroundColor = background;
            }
            //字体颜色
            if (color != undefined && color != '') {
                el.style.color = color;
            }

            //显示位置
            if (position == undefined || position == '') {
                position = "center-bottom";
            }

            //设置显示位置,当前有种两种形式
            if (position === "center-bottom") {
                el.style.bottom = defaultMarginValue + "px";
            } else {
                el.style.top = defaultMarginValue + "px";
            }
            el.style.zIndex = 999999;

            document.body.appendChild(el);
            el.classList.add("fadeIn");
            setTimeout(function () {
                el.classList.remove("fadeIn");
                el.classList.add("fadeOut");
                /*监听动画结束,移除提示信息元素*/
                el.addEventListener("animationend", function () {
                    document.body.removeChild(el);
                });
                el.addEventListener("webkitAnimationEnd", function () {
                    document.body.removeChild(el);
                });
            }, time);
        };
        this.filterStr = function (str) {
            if (!str) return "";
            str = str.replace(/\t/g, "");
            str = str.replace(/\r/g, "");
            return encodeURIComponent(str)
        };
        this.getParamterQueryUrl = function (text, tag) { //查询GET请求url中的参数
            if (text.indexOf("?") != -1) { //选取?后面的字符串,兼容window.location.search,前面的?不能去掉
                var textArray = text.split("?");
                text = "?" + textArray[textArray.length - 1];
            }
            var t = new RegExp("(^|&)" + tag + "=([^&]*)(&|$)");
            var a = text.substr(1).match(t);
            if (a != null) {
                return a[2];
            }
            return "";
        };
        this.getEndHtmlIdByUrl = function (url) { //获得以html结束的ID
            if (url.indexOf("?") != -1) {
                url = url.split("?")[0]
            }
            if (url.indexOf("#") != -1) {
                url = url.split("#")[0]
            }
            var splitText = url.split("/");
            var idText = splitText[splitText.length - 1];
            idText = idText.replace(".html", "");
            return idText;
        };
        this.suningParameter = function (url) {
            const regex = /product\.suning\.com\/(\d+\/\d+)\.html/;
            const match = url.match(regex);
            if (match) {
                return match[1].replace(/\//g, '-');
            }
            return null;
        };
        this.getEcommercePlatform = function (host = window.location.host) {
            let platform = "";
            if (host.indexOf(".taobao.") != -1 || host.indexOf(".liangxinyao.") != -1) {
                platform = "taobao";
            } else if (host.indexOf(".tmall.") != -1) {
                platform = "tmall";
            } else if (host.indexOf(".jd.") != -1 || host.indexOf(".yiyaojd.") != -1 || host.indexOf(".jkcsjd.") != -1) {
                platform = "jd";
            } else if (host.indexOf(".vip.") != -1 || host.indexOf(".vipglobal.") != -1) {
                platform = "vpinhui";
            } else if (host.indexOf(".suning.") != -1) {
                platform = "suning";
            }
            return platform;
        }
        this.isPC = function () {
            var userAgentInfo = navigator.userAgent;
            var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
            var flag = true;
            for (var v = 0; v < Agents.length; v++) {
                if (userAgentInfo.indexOf(Agents[v]) > 0) {
                    flag = false;
                    break;
                }
            }
            return flag;
        };
        this.getBilibiliBV = function () {
            var pathname = window.location.pathname;
            var bv = pathname.replace("/video/", "").replace("/", "");
            return bv;
        };
        this.getSystemOS = function () {
            var u = navigator.userAgent;
            if (!!u.match(/compatible/i) || u.match(/Windows/i)) {
                return 'windows';
            } else if (!!u.match(/Macintosh/i) || u.match(/MacIntel/i)) {
                return 'macOS';
            } else if (!!u.match(/iphone/i) || u.match(/Ipad/i)) {
                return 'ios';
            } else if (!!u.match(/android/i)) {
                return 'android';
            } else {
                return 'other';
            }
        };
        this.RPCDownloadFile = function (fileName, url, savePath = "D:/", RPCURL = "ws://localhost:16800/jsonrpc", RPCToken = "") {
            const self = this;
            if (!savePath) {
                savePath = "D:/";
            }
            if (!RPCURL) {
                RPCURL = "ws://localhost:16800/jsonrpc";
            }
            let options = { //下载配置文件
                "dir": savePath,
                "max-connection-per-server": "16",
                "header": ["User-Agent:" + navigator.userAgent + "", "Cookie:" + document.cookie + "", "Referer:" + window.location.href + ""]
            }
            if (!!fileName) {
                options.out = fileName;
            }
            let jsonRPC = {
                "jsonrpc": "2.0",
                "id": "huahuacat",
                "method": "aria2.addUri",
                "params": [[url], options],
            }
            if (!!RPCToken) {
                jsonRPC.params.unshift("token:" + RPCToken); // 必须要加在第一个
            }
            return new Promise(function (resolve, reject) {
                var webSocket = new WebSocket(RPCURL);
                webSocket.onerror = function (event) {
                    console.log("webSocket.onerror", event);
                    reject("Aria2连接错误,请打开Aria2和检查RPC设置!");
                }
                webSocket.onopen = function () {
                    webSocket.send(JSON.stringify(jsonRPC));
                }
                webSocket.onmessage = function (event) {
                    let result = JSON.parse(event.data);
                    switch (result.method) {
                        case "aria2.onDownloadStart":
                            resolve("Aria2 开始下载【" + fileName + "】");
                            webSocket.close();
                            break;
                        case "aria2.onDownloadComplete":
                            break;
                        default:
                            break;
                    }
                }
            });
        };
        this.getElementObject = function (selector, target = document.body, allowEmpty = true, delay = 10, maxDelay = 10 * 1000) {
            return new Promise((resolve, reject) => {
                if (selector.toUpperCase() === "BODY") {
                    resolve(document.body);
                    return;
                }
                if (selector.toUpperCase() === "HTML") {
                    resolve(document.html);
                    return;
                }
                let totalDelay = 0;

                let element = target.querySelector(selector);
                let result = allowEmpty ? !!element : (!!element && !!element.innerHTML);
                if (result) {
                    resolve(element);
                }

                const elementInterval = setInterval(() => {
                    if (totalDelay >= maxDelay) {
                        clearInterval(elementInterval);
                        resolve(null);
                    }
                    element = target.querySelector(selector);
                    result = allowEmpty ? !!element : (!!element && !!element.innerHTML);
                    if (result) {
                        clearInterval(elementInterval);
                        resolve(element);
                    } else {
                        totalDelay += delay;
                    }
                }, delay);
            });
        };
        /**
         * @param {Object} time
         * @param {Object} format
         * 时间格式化
         * DateFormat(new Date(dateCreated), "yyyy-MM-dd hh:mm:ss")
         */
        this.DateFormat = function (time, format) {
            var o = {
                "M+": time.getMonth() + 1, //月份
                "d+": time.getDate(), //日
                "h+": time.getHours(), //小时
                "m+": time.getMinutes(), //分
                "s+": time.getSeconds(), //秒
                "q+": Math.floor((time.getMonth() + 3) / 3), //季度
                "S": time.getMilliseconds() //毫秒
            };
            if (/(y+)/.test(format)) {
                format = format.replace(RegExp.$1, (time.getFullYear() + "").substr(4 - RegExp.$1.length));
            }
            for (var k in o) {
                if (new RegExp("(" + k + ")").test(format)) {
                    format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
                }
            }
            return format;
        };
        this.decryptStr = function (str) {
            let result = atob(str);
            return result.split('').reverse().join('');
        };
        this.encryptStr = function (str) {
            let result = str.split('').reverse().join('');
            return btoa(result);
        };
    }
    //全局弹窗对象
    const dialog = (function () {
        class Dialog {
            constructor() {
                this.mask = document.createElement('div');
                this.dialogStyle = document.createElement('style');

                this.setStyle(this.mask, {
                    "width": '100%',
                    "height": '100%',
                    "backgroundColor": 'rgba(0, 0, 0, .6)',
                    "position": 'fixed',
                    "left": "0px",
                    "top": "0px",
                    "bottom": "0px",
                    "right": "0px",
                    "z-index": "9999999999999"
                });

                this.content = document.createElement('div');
                this.setStyle(this.content, {
                    "max-width": '450px',
                    "width": "100%",
                    "max-height": '600px',
                    "backgroundColor": '#fff',
                    "boxShadow": '0 0 2px #999',
                    "position": 'absolute',
                    "left": '50%',
                    "top": '50%',
                    "transform": 'translate(-50%,-50%)',
                    "borderRadius": '5px'
                })
                this.mask.appendChild(this.content);
            }
            middleBox(param) {
                // 先清空中间小div的内容 - 防止调用多次,出现混乱
                this.content.innerHTML = '';

                let title = '默认标题内容';
                if ({}.toString.call(param) === '[object String]') {
                    title = param;
                } else if ({}.toString.call(param) === '[object Object]') {
                    title = param.title;
                }

                document.body.appendChild(this.mask);
                this.title = document.createElement('div');
                this.setStyle(this.title, {
                    "width": '100%',
                    "height": '40px',
                    "lineHeight": '40px',
                    "boxSizing": 'border-box',
                    "background-color": "#dedede",
                    "color": '#000',
                    "text-align": 'center',
                    "font-weight": "700",
                    "font-size": "17px",
                    "border-radius": "4px 4px 0px 0px"
                });

                this.title.innerText = title;
                this.content.appendChild(this.title);

                this.closeBtn = document.createElement('div');
                this.closeBtn.innerText = '×';

                this.setStyle(this.closeBtn, {
                    "textDecoration": 'none',
                    "color": '#000',
                    "position": 'absolute',
                    "right": '10px',
                    "top": '0px',
                    "fontSize": '25px',
                    "display": "inline-block",
                    "cursor": "pointer"
                })
                this.title.appendChild(this.closeBtn);

                const self = this;
                this.closeBtn.onclick = function () {
                    self.close();
                    if (param.onClose && (typeof param.onClose) === "function") {
                        param.onClose();
                    }
                }
            }
            showMake(param) {
                //添加公用样式表
                if (param.hasOwnProperty("styleSheet")) {
                    this.dialogStyle.textContent = param.styleSheet;
                }
                document.querySelector("head").appendChild(this.dialogStyle);

                this.middleBox(param);
                this.dialogContent = document.createElement('div');
                this.setStyle(this.dialogContent, {
                    "padding": "15px",
                    "max-height": "400px"
                });
                this.dialogContent.innerHTML = param.content;
                this.content.appendChild(this.dialogContent);
                param.onContentReady(this);
            }
            close() {
                document.body.removeChild(this.mask);
                document.querySelector("head").removeChild(this.dialogStyle);
            }
            setStyle(ele, styleObj) {
                for (let attr in styleObj) {
                    ele.style[attr] = styleObj[attr];
                }
            }
        }
        let dialog = null;
        return (function () {
            if (!dialog) {
                dialog = new Dialog()
            }
            return dialog;
        })()
    })();

    //全局统一方法对象
    const commonFunctionObject = new CommonFunction();
    commonFunctionObject.addCommonHtmlCss();	//统一html、css元素添加


    /**
     * 搜索引擎资源提醒
    */
    function SearchEnginesNavigation() {

        this.customNavigationkey = "custom-navigation-key-8898";
        this.serverNavigationkey = "server-navigation-key-8898";
        this.searchEnginesData = [
            { "host": "www.baidu.com", "element": "#content_right", "elementInput": "#kw" },
            { "host": "www.so.com", "element": "#side", "elementInput": "#keyword" },
            { "host": "www.sogou.com", "element": "#right", "elementInput": "#upquery" },
            { "host": "cn.bing.com", "element": "#b_context", "elementInput": "#sb_form_q" },
            { "host": "www.bing.com", "element": "#b_context", "elementInput": "#sb_form_q" },
            { "host": "www4.bing.com", "element": "#b_context", "elementInput": "#sb_form_q" },
            { "host": "so.toutiao.com", "element": ".s-side-list", "elementInput": "input[type='search']" },
            { "host": "www.google.com", "element": "#rhs", "elementInput": "textarea[name='q']" },
            { "host": "www.google.com.hk", "element": "#rhs", "elementInput": "textarea[name='q']" },
            { "host": "duckduckgo.com", "element": ".react-results--sidebar", "elementInput": "#search_form_input" }
        ];
        this.defaultNavigationData = [
            {
                "name": "资源搜索", "list": [
                    {
                        "name": "Google",
                        "url": "https://www.google.com/search?q=@@"
                    },
                    {
                        "name": "DuckDuckGo",
                        "url": "https://duckduckgo.com/?t=h_&q=@@&ia=web"
                    },
                    {
                        "name": "百度",
                        "url": "https://www.baidu.com/s?wd=@@"
                    },
                    {
                        "name": "必应",
                        "url": "https://cn.bing.com/search?q=@@"
                    },
                    {
                        "name": "360搜索",
                        "url": "https://www.so.com/s?ie=utf-8&fr=none&src=360sou_newhome&nlpv=basest&q=@@"
                    },
                    {
                        "name": "搜狗",
                        "url": "https://www.sogou.com/web?query=@@"
                    },
                    {
                        "name": "搜狗|公众号",
                        "url": "https://weixin.sogou.com/weixin?type=2&query=@@"
                    },
                    {
                        "name": "头条搜索",
                        "url": "https://so.toutiao.com/search?dvpf=pc&source=input&keyword=@@"
                    },
                    {
                        "name": "高德地图",
                        "url": "https://ditu.amap.com/search?query=@@"
                    },
                    {
                        "name": "网易云搜索",
                        "url": "https://music.163.com/#/search/m/?s=@@"
                    },
                    {
                        "name": "百度百科",
                        "url": "https://baike.baidu.com/item/@@"
                    },
                    {
                        "name": "知乎搜索",
                        "url": "https://www.zhihu.com/search?type=content&q=@@"
                    },
                    {
                        "name": "抖音搜索",
                        "url": "https://www.douyin.com/search/@@"
                    },
                    {
                        "name": "Bilibili",
                        "url": "https://search.bilibili.com/all?keyword=@@&from_source=webtop_search&spm_id_from=333.851"
                    },
                    {
                        "name": "Github",
                        "url": "https://github.com/search?q=@@"
                    },
                    {
                        "name": "YouTube",
                        "url": "https://www.youtube.com/results?search_query=@@&page={startPage?}&utm_source=opensearch"
                    },
                    {
                        "name": "推特搜索",
                        "url": "https://x.com/search?q=@@"
                    },
                    {
                        "name": "图标搜索",
                        "url": "https://www.iconfont.cn/search/index?searchType=icon&q=@@"
                    },
                    {
                        "name": "维基百科",
                        "url": "https://en.wikipedia.org/w/index.php?search=@@"
                    },
                    {
                        "name": "ChatGPT",
                        "url": "http://chatgpt.com/?q=@@"
                    },
                    {
                        "name": "MetaSo",
                        "url": "https://metaso.cn/?q=@@"
                    },
                    {
                        "name": "Qwen",
                        "url": "https://chat.qwen.ai/?q=@@"
                    },
                    {
                        "name": "DeepSeek🐳",
                        "url": "http://chat.deepseek.com/?q=@@"
                    },
                    {
                        "name": "Kimi🌙",
                        "url": "https://kimi.moonshot.cn?q=@@"
                    },
                    {
                        "name": "元宝🌕️",
                        "url": "https://yuanbao.tencent.com/?q=@@"
                    },
                    {
                        "name": "豆包🍭",
                        "url": "https://www.doubao.com/chat/?q=@@"
                    }
                ]
            }
        ];
        this.getNavigationData = async function (element, elementInput) {
            const self = this;
            let navigationData = self.defaultNavigationData;
            let finalNavigationData = null;
            try {
                let customNavigationData = commonFunctionObject.GMgetValue(self.customNavigationkey, null); //自定义的数据
                if (!!customNavigationData) {
                    finalNavigationData = [].concat(customNavigationData);
                    // console.log("使用本地");
                } else {
                    let currentMS = (new Date()).getTime();
                    let delayMS = 1000 * 60 * 5;
                    let serverNavigationData = commonFunctionObject.GMgetValue(self.serverNavigationkey, null);
                    if (!serverNavigationData || (currentMS - serverNavigationData.ms) > delayMS) {
                        // 直接使用 this.defaultNavigationData 存入本地
                        commonFunctionObject.GMsetValue(self.serverNavigationkey, self.defaultNavigationData);
                        serverNavigationData = self.defaultNavigationData;
                    }

                    if (!!serverNavigationData) {
                        finalNavigationData = JSON.parse(serverNavigationData.list);
                    } else {
                        finalNavigationData = navigationData;
                    }
                }
            } catch (e) {
                finalNavigationData = navigationData;
            }
            self.createHtml(element, elementInput, finalNavigationData);
        };
        this.createCss = function (elementNum) {
            var innnerCss = `
			#dsdsd99mmmjj7760011{
				margin-bottom:20px;
			}
			.tab`+ elementNum + `{
				margin-bottom:8px;
			}
			.tab-c-titles`+ elementNum + `{
				margin-bottom:8px;
			}
			.tab-c-links`+ elementNum + `{

			}

			.tabs-t`+ elementNum + `{
				display: inline-block;
				width: 80px;
				height: 28px;
				line-height: 28px;
				font-size: 15px;
				letter-spacing: 0;
				text-align: center;
				font-weight: 400;
				border-radius: 6px;
				cursor: pointer;
				background: #f8f8f8;
				color: #333;
			}
			.tabs-t-selected-ddsds1idddx90{
			    color: #315EFB;
			    font-weight: 500;
			    background: rgba(49, 94, 251, 0.1);
			}
			.tabs-t-small-ddsds1idddx90{
			    margin-left: 8px;
			}

			.tab-c-links`+ elementNum + ` a[name='navigation']{
				display:inline-block;
				text-align:center;
				margin-right:12px;
				margin-top:2px;
				overflow: hidden;
				white-space: nowrap;
				text-overflow:ellipsis;
				box-sizing:border-box;
				line-height:20px;
				font-size:14px!important;
				text-decoration: none;
				color: #666666;
			}
			.tab-c-links`+ elementNum + ` a[name='navigation']:hover{
				text-decoration: underline;
				color: #315EFB;
			}

			.bookmarks`+ elementNum + `{
				min-height:50px;
			}
		`;
            if ($("#plugin_css_style_dddsoo").length == 0) {
                $("body").prepend("<style id='plugin_css_style_dddsoo'>" + innnerCss + "</style>");
            }
        };
        this.showSetingDialog = function () {
            const self = this;

            var customNavigationData = "";
            const customNavigation = commonFunctionObject.GMgetValue(self.customNavigationkey, null);
            if (!!customNavigation) {
                customNavigationData = JSON.stringify(customNavigation, null, 4);
            }
            const content = `
			<div>
				<div style="font-size:13px;color:red;">
					注意事项如下:
					<br>1、请严格按照格式添加,否则不生效
					<br>2、数据为json格式,请确保json格式正确,必要时请到<a target="_blank" href="https://www.json.cn/">https://www.json.cn/</a>校验
					<br>3、点击下面”示例“按钮,查看具体格式情况
					<br>4、链接中的搜索关键词请用”@@“代替,脚本会自动替换成当前搜索词。例如:https://www.baidu.com/s?wd=@@
					<br>5、大家可以自定义导航数据,<b>但是必须要注意数据格式,发现出现错误,可点“初始化”</b>
				</div>
				<div style="margin-top:5px;height:200px;width:100%;">
					<textarea
						placeholder="请严格按照格式填写,否则不生效"
						class="navigation-textarea"
						style="color:#000;font-size:14px;box-sizing: border-box;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;padding:5px;height:100%;width:100%;Overflow:auto;border:1px solid #ccc;resize:none;background-color:#FFF;outline:none;">`+ customNavigationData + `</textarea>
				</div>
				<div style="text-align:center;margin-top:15px;">
					<button class="navigation-init" style="color:#000;cursor:pointer;">初始化</button>
					<button class="navigation-example" style="color:#000;cursor:pointer;">示例</button>
					<button class="navigation-clear" style="color:#000;cursor:pointer;">清空</button>
					<button class="navigation-save" style="color:#000;cursor:pointer;">保存自定义导航</button>
				</div>
			</div>
		`;
            dialog.showMake({
                "title": "自定义添加导航",
                "content": content,
                "onClose": function () {
                    location.reload();
                },
                "onContentReady": function ($that) {
                    var $navigationExample = $that.dialogContent.querySelector(".navigation-example");
                    var $navigationClear = $that.dialogContent.querySelector(".navigation-clear");
                    var $navigationSave = $that.dialogContent.querySelector(".navigation-save");
                    var $navigationInit = $that.dialogContent.querySelector(".navigation-init");

                    var $textarea = $that.dialogContent.querySelector(".navigation-textarea");
                    $navigationExample.addEventListener("click", function () {
                        $textarea.value = JSON.stringify(self.defaultNavigationData, null, 4);
                    });
                    $navigationClear.addEventListener("click", function () {
                        $textarea.value = "";
                    });
                    $navigationInit.addEventListener("click", function () {
                        $textarea.value = "";
                        commonFunctionObject.GMsetValue(self.customNavigationkey, null);
                    });
                    $navigationSave.addEventListener("click", function () {
                        var content = $textarea.value;
                        if (!content) {
                            commonFunctionObject.GMsetValue(self.customNavigationkey, null);
                            commonFunctionObject.webToast({ "message": "保存成功:数据为空", "background": "#FF4D40" });
                            return;
                        }
                        if (content.length == 0 || content.indexOf("{") == -1 || content.indexOf("[") == -1) {
                            commonFunctionObject.webToast({ "message": "格式错误,请更正", "background": "#FF4D40" });
                            return;
                        }
                        try {
                            var contentJson = JSON.parse(content);
                            if (Array.isArray(contentJson)) { //开始必须是数组
                                var isOK = true;
                                for (var i = 0; i < contentJson.length; i++) {
                                    if (Array.isArray(contentJson[i])) { //此处必须是对象
                                        isOK = false;
                                        break;
                                    }
                                    if (!contentJson[i].hasOwnProperty("name") || !contentJson[i].hasOwnProperty("list")) {
                                        isOK = false;
                                        break;
                                    }
                                    if (typeof (contentJson[i]["name"]) != "string") {
                                        isOK = false;
                                        break;
                                    }
                                    if (!Array.isArray(contentJson[i]["list"])) { //此处必须是数组
                                        isOK = false;
                                        break;
                                    }
                                    for (var j = 0; j < contentJson[i]["list"].length; j++) {
                                        if (!contentJson[i]["list"][j].hasOwnProperty("name") || !contentJson[i]["list"][j].hasOwnProperty("url")) {
                                            isOK = false;
                                            break;
                                        }
                                        if (typeof (contentJson[i]["list"][j]["name"]) != "string" || typeof (contentJson[i]["list"][j]["url"]) != "string") {
                                            isOK = false;
                                            break;
                                        }
                                    }
                                    if (!isOK) {
                                        break;
                                    }
                                }
                                if (isOK) {
                                    commonFunctionObject.GMsetValue(self.customNavigationkey, contentJson);
                                    commonFunctionObject.webToast({ "message": "保存成功", "background": "#FF4D40" });
                                } else {
                                    commonFunctionObject.webToast({ "message": "格式错误,请更正", "background": "#FF4D40" });
                                }
                            } else {
                                commonFunctionObject.webToast({ "message": "格式错误,请更正", "background": "#FF4D40" });
                            }
                        } catch (e) {
                            commonFunctionObject.webToast({ "message": "格式错误,请更正", "background": "#FF4D40" });
                        }
                    });
                }
            })
        }
        this.createHtml = function (element, elementInput, navigationData) {
            $("#dsdsd99mmmjj7760011").remove();

            var isComplate = true;
            const host = window.location.host;
            const self = this;
            const elementNum = commonFunctionObject.randomNumber();
            const elementInterval = setInterval(function () {
                if (isComplate) {
                    var $element = $(element);
                    var $box = $("#dsdsd99mmmjj7760011");
                    isComplate = false;
                    if ($element.length != 0 && $box.length == 0) {
                        var nameArray = [];
                        var linkArray = [];
                        for (var i = 0; i < navigationData.length; i++) {
                            var name = "";
                            if (i == 0) {
                                name += '<span class="tabs-t' + elementNum + ' tabs-t-selected-ddsds1idddx90" name="tab-list-xxsddddssd-' + i + '">' + navigationData[i].name + '</span>';
                            } else {
                                name += '<span class="tabs-t' + elementNum + ' tabs-t-small-ddsds1idddx90" name="tab-list-xxsddddssd-' + i + '">' + navigationData[i].name + '</span>';
                            }
                            nameArray.push(name);

                            var links = "";
                            if (i == 0) {
                                links = '<div id="tab-list-xxsddddssd-' + i + '">';
                            } else {
                                links = '<div id="tab-list-xxsddddssd-' + i + '" style="display:none;">';
                            }
                            for (var j = 0; j < navigationData[i].list.length; j++) {
                                let url = navigationData[i].list[j].url;
                                url = url.replace("${t}", (new Date()).getTime());
                                let name = navigationData[i].list[j].name;
                                links += "<a target='_blank' name='navigation' data-url='" + url + "' href='javascript:void(0);'>" + name + "</a>"
                            }
                            links += "</div>";
                            linkArray.push(links);
                        }

                        var html = `
						<div id="dsdsd99mmmjj7760011" style="position:relative!important;left:0px!important;">
							<div class="tab`+ elementNum + `">
								<div class="tab-c-titles`+ elementNum + `">` + nameArray.join("") + `</div>
								<div class="tab-c-links`+ elementNum + `">` + linkArray.join("") + `</div>
							</div>
							<div style='margin-bottom:10px;margin-top:5px;font-size:12px;'>
								<a href="javascript:void(0);" name="customNavigation" style="color: #666;background-color: #efefef;padding: 2px 5px; border-radius: 2px;">🔧自定义网址</a>
							</div>
						<div>
					`;

                        // //添加css 添加html
                        self.createCss(elementNum);
                        $element.prepend(html);


                        //点击切换tab
                        $("#dsdsd99mmmjj7760011 .tabs-t" + elementNum).on("click", function (e) {
                            $("div[id^='tab-list-xxsddddssd-']").hide();
                            $(".tabs-t" + elementNum).removeClass("tabs-t-selected-ddsds1idddx90");

                            $("#" + $(this).attr("name")).show();
                            $(this).addClass("tabs-t-selected-ddsds1idddx90");
                        });

                        //点击链接
                        $("#dsdsd99mmmjj7760011 a[name='navigation']").on("click", function (e) {
                            commonFunctionObject.GMopenInTab($(this).data("url").replace("@@", $(elementInput).val()));
                            e.preventDefault()
                        });

                        //弹出自定义导航弹窗
                        $("#dsdsd99mmmjj7760011 a[name='customNavigation']").on("click", function (e) {
                            self.showSetingDialog();
                            e.preventDefault()
                        });
                    }
                    isComplate = true;
                }
            }, 100);
        };
        this.hookBaidu = function () {
            let items = document.querySelectorAll("#content_left>div");
            for (let item of items) {
                //给处理完成的做一个标识
                if (!!item.getAttribute("baidu_dealxx")) {
                    continue;
                }
                item.setAttribute("baidu_dealxx", "--");

                let a = item.querySelector("a");
                if (!a || !a.href) {
                    continue;
                }

                //标注了html网址的忽略
                let OP_LOG_LINK = item.querySelector(".OP_LOG_LINK");
                if (!!OP_LOG_LINK && OP_LOG_LINK.innerText.search("http") != -1) {
                    continue;
                }

                //有多个点击点的忽略
                let cGapBottomSmall = item.querySelector(".c-gap-bottom-small");
                if (!!cGapBottomSmall) {
                    continue;
                }

                //https://www.baidu.com/s?wd=一夜醒来欠地铁600 много钱?官方回应
                if (a.href.includes("www.baidu.com/link?url=")) {
                    let url = item.getAttribute("mu");
                    if (url && url.indexOf("http") != -1 && !url.includes("nourl.ubs.baidu.com")) {
                        a.href = url;
                        item.innerHTML += `<div style="color:#ccc;font-size:12px;display:flex;align-items:center;width:100%;overflow:hidden;white-space: nowrap;text-overflow: ellipsis;-o-text-overflow:ellipsis;">
										<img style="width:15px;height:15px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAKhJREFUOE+9k9ENwjAMBc8RA7AR7UhMQDsBszBBw0YMAAmKrBS3pM1HpOb/ne9ZjtD4pDHPEYBTB2FSU9fD21vrisEcHsF5BS0hFYCLwAhh0KkZGOZcBSATyAM4K8QNEC8Q+1yjAEhTPjeQ50+bq0KW4QRZAWxnXsBdO4euFC4AbOe1fvlijEGebrecOqeXl/gP2aiwr125g2wSvd321skfccr7363Z4Asklz4RHmdA1gAAAABJRU5ErkJggg=="/>
										<a style="color:#626675;" href="`+ url + `" target="_blank">` + url + `</a>
									</div>`;
                    }
                }

                let itemNews = item.querySelectorAll("[class^=single-card-wrapper] div,[class^=group-wrapper] div");
                if (!itemNews) {
                    continue;
                }
                //single-card-wrapper: https://www.baidu.com/s?ie=UTF-8&wd=es6                          xxx的最新相关信息
                //group-wrapper:       https://www.baidu.com/s?ie=UTF-8&wd=五一消费成绩单折射市场活力     资讯
                for (let itemNew of itemNews) {
                    let dataUrl = null;
                    let divs = itemNew.querySelectorAll("div");
                    for (let div of divs) {
                        dataUrl = div.getAttribute("data-url")
                        if (dataUrl) {
                            let a = itemNew.querySelector("a");
                            a.setAttribute("href", dataUrl);
                        }
                    }
                }
            }
        };
        this.hookGoogle = function () {
            let items = document.querySelectorAll("#center_col a");
            for (let a of items) {
                if (!a.getAttribute("target")) a.setAttribute("target", "_blank");
            }
        };
        this.hooks = function () {
            const host = window.location.host;
            const href = window.location.href;
            const search = window.location.search;
            const self = this;
            setInterval(function () {
                if (host === "www.baidu.com") {
                    self.hookBaidu();
                } else if (host === "www.google.com" || host === "www.google.com.hk") {
                    self.hookGoogle();
                }
            }, 300);
        };
        this.show = function () {
            const self = this;
            const host = window.location.host;
            const href = window.location.href;
            if ((host === "www.baidu.com")
                || (host === "www.so.com" && href.indexOf("www.so.com/s") != -1)
                || (host === "www.sogou.com" && (href.indexOf("www.sogou.com/web") != -1 || href.indexOf("www.sogou.com/sogou") != -1))
                || (host === "cn.bing.com" && href.indexOf("cn.bing.com/search") != -1)
                || (host === "www.bing.com" && href.indexOf("www.bing.com/search") != -1)
                || (host === "www4.bing.com" && href.indexOf("www4.bing.com/search") != -1)
                || (host === "so.toutiao.com" && href.indexOf("so.toutiao.com/search") != -1)
                || (host === "www.google.com" && href.indexOf("www.google.com/search") != -1)
                || (host === "www.google.com.hk" && href.indexOf("www.google.com.hk/search") != -1)
                || (host === "duckduckgo.com" && href.indexOf("duckduckgo.com") != -1)) {
                let currentSearchEnginesData = null;
                for (var i = 0; i < self.searchEnginesData.length; i++) {
                    if (host === self.searchEnginesData[i].host) {
                        currentSearchEnginesData = self.searchEnginesData[i];
                    }
                }
                if (currentSearchEnginesData != null) {
                    self.getNavigationData(currentSearchEnginesData.element, currentSearchEnginesData.elementInput);
                }
                self.hooks();
            }
        };
        this.start = function () {
            this.show();
        };
    }
    try {
        (new SearchEnginesNavigation()).start();
    } catch (e) {
        console.log("搜索引擎导航:error:" + e);
    }

    /**
     * 给kimi网站添加q查询参数
    */

    async function addKimiQueryParam() {
        const query = new URLSearchParams(window.location.search).get('q');
        if (!query) return;

        const waitForElement = (selector) => {
            return new Promise((resolve) => {
                const elem = document.querySelector(selector);
                if (elem) {
                    return resolve(elem);
                }

                const observer = new MutationObserver(() => {
                    const elem = document.querySelector(selector);
                    if (elem) {
                        observer.disconnect();
                        resolve(elem);
                    }
                });
                observer.observe(document.body, { childList: true, subtree: true });
            });
        };
        const delay = (ms) => new Promise(res => setTimeout(res, ms));


        const chat = await waitForElement('.chat-input-editor');
        chat.value = query;
        chat.dispatchEvent(new InputEvent('input', { data: query, bubbles: true }));

        await delay(500);
        chat.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', keyCode: 13, bubbles: true }));
    }

    try {
        //如果匹配到kimi.moonshot.cn,就执行addKimiQueryParam函数
        if (window.location.host === 'kimi.moonshot.cn' || window.location.host === 'www.kimi.com') {
            addKimiQueryParam();
        }
    } catch (e) {
        console.log("给kimi网站添加q查询参数:error:" + e);
    }


    /*
     * 给元宝添加查询参数
    */
    async function addYuanbaoQueryParam() {


        const params = new URLSearchParams(window.location.search);
        const query = params.has('q') ? decodeURIComponent(params.get('q')) : null;
        // console.log("查询参数:"+query)
        if (!query?.trim()) return;



        // 增强版元素等待器
        function waitForElement(selector, timeout = 8000) {
            return new Promise((resolve, reject) => {
                let retry = 0;
                const check = () => {
                    const elem = document.querySelector(selector);
                    if (elem) {
                        console.log(`[加载跟踪] 元素${selector}在第${Date.now() - start}ms加载完成`);
                        resolve(elem);
                    } else if (Date.now() - start > timeout) {
                        reject(`元素加载超时: ${selector}`);
                    } else {
                        setTimeout(check, 500);
                    }
                };
                const start = Date.now();
                check();
            });
        }

        try {
            // 等待富文本编辑器
            const inputBox = await waitForElement('.ql-editor[contenteditable="true"]');

            // 模拟真实输入
            inputBox.focus();
            await new Promise(r => setTimeout(r, 300));
            inputBox.innerHTML = `<p>${query}</p>`; // 富文本特殊处理

            // 触发React状态更新
            inputBox.dispatchEvent(new InputEvent('input', {
                bubbles: true,
                composed: true
            }));

            // 提交优化(增加延迟确保渲染完成)
            setTimeout(() => {
                inputBox.dispatchEvent(new KeyboardEvent('keydown', {
                    key: 'Enter',
                    code: 'Enter',
                    bubbles: true
                }));
            }, 1200);

        } catch (error) {
            console.error('[最终错误处理]', error);
        }
    }

    try {
        //如果匹配到yuanbao.tencent.com,就执行addYuanbaoQueryParam函数
        if (window.location.host === 'yuanbao.tencent.com') {
            addYuanbaoQueryParam();
        }
    } catch (e) {
        console.log("给元宝添加q查询参数:error:" + e);
    }

    /*
     * 给DeepSeek添加q查询参数
    */
    async function addDeepSeekQueryParam() {
        const query = new URLSearchParams(window.location.search).get('q');
        if (!query) return;

        const waitForElement = (selector) => {
            return new Promise((resolve) => {
                const elem = document.querySelector(selector);
                if (elem) {
                    return resolve(elem);
                }

                const observer = new MutationObserver(() => {
                    const elem = document.querySelector(selector);
                    if (elem) {
                        observer.disconnect();
                        resolve(elem);
                    }
                });
                observer.observe(document.body, { childList: true, subtree: true });
            });
        };
        const getReactProps = el => el[Object.keys(el).find(k => k.startsWith('__reactProps$'))];
        const delay = (ms) => new Promise(res => setTimeout(res, ms));


        const chat = await waitForElement("#chat-input");
        chat.value = query;
        getReactProps(chat)?.onChange?.({
            target: { value: query },
            currentTarget: { value: query },
            preventDefault: () => { },
            stopPropagation: () => { }
        });

        await delay(500);
        getReactProps(chat)?.onKeyDown?.({
            key: 'Enter',
            keyCode: 13,
            shiftKey: false,
            target: chat,
            currentTarget: chat,
            preventDefault: () => { },
            stopPropagation: () => { },
        });
    }


    try {
        //如果匹配到deepseek.com,就执行addDeepSeekQueryParam函数
        if (window.location.host === 'chat.deepseek.com') {
            addDeepSeekQueryParam();
        }
    } catch (e) {
        console.log("给DeepSeek添加q查询参数:error:" + e);
    }



    async function addQwenQueryParam() {
        // 获取URL查询参数
        const getQueryParam = () => {
            const q = new URLSearchParams(window.location.search).get('q');
            return q;
        };

        // 等待元素加载
        const waitForElement = async (selector, timeout = 20000) => {
            const start = Date.now();
            return new Promise((resolve, reject) => {
                const check = () => {
                    const el = document.querySelector(selector);
                    if (el) {
                        return resolve(el);
                    }
                    if (Date.now() - start > timeout) {
                        return reject(new Error(`Element timeout: ${selector}`));
                    }
                    setTimeout(check, 100);
                };
                check();
            });
        };

        // 模拟完整用户输入流程
        const simulateInput = async (text) => {
            try {
                const chatBox = await waitForElement('#chat-input');

                // 模拟点击聚焦
                chatBox.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
                chatBox.focus();

                // 设置输入值并触发事件(兼容React)
                const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
                    window.HTMLTextAreaElement.prototype,
                    "value"
                ).set;

                nativeInputValueSetter.call(chatBox, text);

                // 触发输入事件链
                ['input', 'change', 'keydown', 'keyup'].forEach(eventType => {
                    chatBox.dispatchEvent(new Event(eventType, {
                        bubbles: true,
                        cancelable: true
                    }));
                });

                // 等待内容处理完成
                await new Promise(resolve => setTimeout(resolve, 300));

                // 模拟回车发送
                ['keydown', 'keypress', 'keyup'].forEach(eventType => {
                    const event = new KeyboardEvent(eventType, {
                        key: 'Enter',
                        code: 'Enter',
                        keyCode: 13,
                        bubbles: true
                    });
                    chatBox.dispatchEvent(event);
                });



            } catch (error) {
                console.error('[QwenAutoInput] 错误详情:', error);
            }
        };
        const query = getQueryParam();
        if (!query) return;

        // 确保页面完全加载
        await waitForElement('#chat-input');
        await new Promise(resolve => setTimeout(resolve, 1000));

        // 执行自动输入
        await simulateInput(query);
    }

    try {
        if (window.location.host === 'chat.qwen.ai') {
            addQwenQueryParam();
        }
    } catch (e) {
        console.log("给qwen添加q查询参数:error:" + e);
    }





    async function addDoubaoQueryParam() {
        // 获取URL中的q参数
        const query = new URLSearchParams(window.location.search).get('q');
        if (!query) {
            console.log('URL中未检测到q参数,脚本终止');
            return;
        }

        console.log(`检测到查询参数:${query}`);

        // 元素等待函数
        const waitForElement = async (selectors, timeout = 10000) => {
            const selectorList = Array.isArray(selectors) ? selectors : [selectors];

            while (timeout > 0) {
                for (const selector of selectorList) {
                    const element = document.querySelector(selector);
                    if (element) {
                        console.log(`通过选择器 "${selector}" 定位到元素`);
                        return element;
                    }
                }
                await delay(300);
                timeout -= 300;
            }

            throw new Error(`所有选择器均未定位到元素:${selectorList.join(' / ')}`);
        };

        // 延时函数
        function delay(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        }

        // 注入式输入内容
        async function injectText(element, text) {
            console.log(`开始注入内容,长度:${text.length} 字符`);

            // 分块注入
            const chunks = splitTextIntoChunks(text);

            for (let i = 0; i < chunks.length; i++) {
                const chunk = chunks[i];

                // 使用不同的方法注入内容
                if (chunk.type === 'normal') {
                    setNativeValue(element, chunk.content);
                } else if (chunk.type === 'html') {
                    if (element.insertAdjacentHTML) {
                        element.insertAdjacentHTML('beforeend', chunk.content);
                    } else {
                        setNativeValue(element, chunk.content);
                    }
                } else if (chunk.type === 'paste') {
                    simulatePaste(element, chunk.content);
                }

                // 触发必要的事件
                triggerInputEvents(element);

                // 等待页面响应
                await delay(150 + Math.random() * 100);

                // 检查内容是否被清空
                if (element.value.length < chunk.content.length) {
                    console.warn('警告:内容被部分清空,尝试恢复');
                    if (Math.random() > 0.5) {
                        setNativeValue(element, element.value + chunk.content);
                    } else {
                        simulatePaste(element, chunk.content);
                    }
                    triggerInputEvents(element);
                    await delay(200);
                }

                // 模拟思考时间
                if (i < chunks.length - 1) {
                    await delay(300 + Math.random() * 400);
                }
            }

            // 触发最终事件
            element.dispatchEvent(new Event('change', { bubbles: true }));
            element.dispatchEvent(new Event('blur', { bubbles: true }));

            console.log(`内容注入完成:${text}`);
        }

        // 将文本分成不同类型的块
        function splitTextIntoChunks(text) {
            const chunks = [];
            const maxChunkSize = 15 + Math.floor(Math.random() * 10);

            let currentType = 'normal';
            let currentChunk = '';

            for (let i = 0; i < text.length; i++) {
                currentChunk += text[i];

                if (currentChunk.length >= maxChunkSize || /[,.?!;:]/.test(text[i])) {
                    chunks.push({
                        content: currentChunk,
                        type: currentType
                    });

                    const types = ['normal', 'html', 'paste'];
                    currentType = types[Math.floor(Math.random() * types.length)];
                    currentChunk = '';
                }
            }

            if (currentChunk) {
                chunks.push({
                    content: currentChunk,
                    type: currentType
                });
            }

            return chunks;
        }

        // 使用原生方法设置值
        function setNativeValue(element, value) {
            const valueSetter = Object.getOwnPropertyDescriptor(element, 'value').set;
            const prototype = Object.getPrototypeOf(element);
            const prototypeValueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;

            if (valueSetter && valueSetter !== prototypeValueSetter) {
                prototypeValueSetter.call(element, value);
            } else {
                valueSetter.call(element, value);
            }
        }

        // 模拟粘贴操作
        function simulatePaste(element, text) {
            const clipboardData = new DataTransfer();
            clipboardData.setData('text/plain', text);

            const pasteEvent = new ClipboardEvent('paste', {
                bubbles: true,
                cancelable: true,
                clipboardData: clipboardData,
                composed: true
            });

            element.dispatchEvent(pasteEvent);
        }

        // 触发完整的输入事件序列
        function triggerInputEvents(element) {
            const events = [
                'focus',
                'input',
                'change',
                'keydown',
                'keypress',
                'keyup'
            ];

            events.forEach(eventName => {
                const event = new Event(eventName, { bubbles: true, cancelable: true, composed: true });
                element.dispatchEvent(event);
            });

            if (document.activeElement === element) {
                document.dispatchEvent(new Event('selectionchange'));
            }
        }

        // 模拟真实鼠标点击按钮
        async function realisticClick(element) {
            // 获取元素位置
            const rect = element.getBoundingClientRect();

            // 计算点击位置
            const clickX = rect.left + rect.width / 2 + (Math.random() * 10 - 5);
            const clickY = rect.top + rect.height / 2 + (Math.random() * 10 - 5);

            // 模拟鼠标移动轨迹
            const moveToButton = (x, y) => {
                const moveEvent = new MouseEvent('mousemove', {
                    bubbles: true,
                    cancelable: true,
                    clientX: x,
                    clientY: y,
                    view: window,
                    buttons: 0
                });
                document.dispatchEvent(moveEvent);
            };

            // 贝塞尔曲线移动
            const startX = clickX + (Math.random() * 100 - 50);
            const startY = clickY + (Math.random() * 100 - 50);
            const controlX = (startX + clickX) / 2 + (Math.random() * 40 - 20);
            const controlY = (startY + clickY) / 2 + (Math.random() * 40 - 20);

            const points = [];
            for (let t = 0; t <= 1; t += 0.1) {
                const x = Math.pow(1 - t, 2) * startX + 2 * (1 - t) * t * controlX + Math.pow(t, 2) * clickX;
                const y = Math.pow(1 - t, 2) * startY + 2 * (1 - t) * t * controlY + Math.pow(t, 2) * clickY;
                points.push({ x, y });
            }

            // 移动鼠标
            for (const point of points) {
                moveToButton(point.x, point.y);
                await delay(10 + Math.random() * 15);
            }

            // 鼠标交互序列
            element.dispatchEvent(new MouseEvent('mouseenter', {
                bubbles: true,
                cancelable: true,
                clientX: clickX,
                clientY: clickY,
                view: window,
                buttons: 0
            }));
            await delay(120 + Math.random() * 80);

            element.dispatchEvent(new MouseEvent('mousedown', {
                bubbles: true,
                cancelable: true,
                clientX: clickX,
                clientY: clickY,
                view: window,
                buttons: 1,
                button: 0
            }));
            await delay(70 + Math.random() * 30);

            element.dispatchEvent(new MouseEvent('mouseup', {
                bubbles: true,
                cancelable: true,
                clientX: clickX,
                clientY: clickY,
                view: window,
                buttons: 0,
                button: 0
            }));

            element.dispatchEvent(new MouseEvent('click', {
                bubbles: true,
                cancelable: true,
                clientX: clickX,
                clientY: clickY,
                view: window,
                buttons: 0,
                button: 0
            }));

            element.dispatchEvent(new MouseEvent('mouseleave', {
                bubbles: true,
                cancelable: true,
                clientX: clickX + 10,
                clientY: clickY + 10,
                view: window,
                buttons: 0
            }));

            await delay(150 + Math.random() * 100);
        }

        try {
            // 定位输入框
            const textarea = await waitForElement([
                '[data-testid="chat_input_input"]',
                '.semi-input-textarea.semi-input-textarea-autosize',
                'textarea[placeholder="发消息、输入 @ 选择技能或 / 选择文件"]'
            ]);

            // 准备输入框
            textarea.focus();
            await delay(600 + Math.random() * 200);

            // 清除可能存在的内容
            textarea.value = '';
            triggerInputEvents(textarea);
            await delay(200 + Math.random() * 100);

            // 注入内容
            await injectText(textarea, query);

            // 调整输入框高度
            textarea.style.height = 'auto';
            textarea.style.height = `${textarea.scrollHeight}px`;
            await delay(200 + Math.random() * 100);

            // 验证内容
            if (textarea.value.trim() !== query.trim()) {
                console.warn(`内容验证不匹配(期望: ${query}, 实际: ${textarea.value}),尝试修复`);
                setNativeValue(textarea, query);
                triggerInputEvents(textarea);
                await delay(300 + Math.random() * 150);

                if (textarea.value.trim() !== query.trim()) {
                    throw new Error(`内容验证失败:期望 "${query}",实际 "${textarea.value}"`);
                }
            }

            console.log(`内容已成功设置:${query}`);
            await delay(500 + Math.random() * 200);

            // 定位发送按钮
            const sendButton = await waitForElement([
                '[data-testid="chat_input_send_button"]',
                '.send-btn-DDB6yN:not([disabled])',
                '.semi-button-primary:not([disabled])'
            ]);

            // 发送消息
            console.log('准备发送消息...');

            // 确保输入框有焦点
            textarea.focus();
            await delay(200 + Math.random() * 100);

            // 点击发送按钮
            await realisticClick(sendButton);

            // 等待发送结果
            await delay(1000 + Math.random() * 500);

            // 验证是否发送成功
            if (textarea.value.trim() !== '') {
                console.warn('警告:发送后输入框未清空,可能发送失败');

                // 尝试使用Enter键发送
                const enterEvent = new KeyboardEvent('keydown', {
                    bubbles: true,
                    cancelable: true,
                    key: 'Enter',
                    code: 'Enter',
                    keyCode: 13,
                    which: 13,
                    location: 0,
                    repeat: false,
                    isComposing: false,
                    view: window
                });
                textarea.dispatchEvent(enterEvent);

                await delay(150);

                const keyupEvent = new KeyboardEvent('keyup', {
                    bubbles: true,
                    cancelable: true,
                    key: 'Enter',
                    code: 'Enter',
                    keyCode: 13,
                    which: 13,
                    location: 0,
                    repeat: false,
                    isComposing: false,
                    view: window
                });
                textarea.dispatchEvent(keyupEvent);

                await delay(1000 + Math.random() * 500);

                if (textarea.value.trim() !== '') {
                    throw new Error('消息发送失败:输入框内容未清空');
                }
            }

            console.log('消息已成功发送!');

        } catch (error) {
            console.error('脚本执行失败:', error.message);
            console.trace('错误堆栈跟踪');
        }
    }


    try {
        if (window.location.host === 'www.doubao.com' && window.location.pathname.startsWith('/chat')) {
            addDoubaoQueryParam();
        }
    } catch (e) {
        console.log("给doubao添加q查询参数:error:" + e);
    }


})();