// ==UserScript== // @name AI搜索引擎增强😈 // @name:zh AI搜索引擎增强😈 // @name:zh-TW AI搜索引擎增強😈 // @namespace ai_search_engine_enhancements // @version 2025-05-08 // @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 *://yuanbao.tencent.com/* // @include *://chat.deepseek.com/* // @require https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.2.1/jquery.min.js // @require https://greasyfork.org/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 // @downloadURL https://update.greasyfork.icu/scripts/534977/AI%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E5%A2%9E%E5%BC%BA%F0%9F%98%88.user.js // @updateURL https://update.greasyfork.icu/scripts/534977/AI%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E5%A2%9E%E5%BC%BA%F0%9F%98%88.meta.js // ==/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": "DeepSeek🐳", "url": "http://chat.deepseek.com/?q=@@" }, { "name": "Kimi🌙", "url": "https://kimi.moonshot.cn?q=@@" }, { "name": "元宝🌕️", "url": "https://yuanbao.tencent.com/?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(""); } }; 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 = `
注意事项如下:
1、请严格按照格式添加,否则不生效
2、数据为json格式,请确保json格式正确,必要时请到https://www.json.cn/校验
3、点击下面”示例“按钮,查看具体格式情况
4、链接中的搜索关键词请用”@@“代替,脚本会自动替换成当前搜索词。例如:https://www.baidu.com/s?wd=@@
5、大家可以自定义导航数据,但是必须要注意数据格式,发现出现错误,可点“初始化”
`; 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 += '' + navigationData[i].name + ''; } else { name += '' + navigationData[i].name + ''; } nameArray.push(name); var links = ""; if (i == 0) { links = '
'; } else { links = '"; linkArray.push(links); } var html = `
` + nameArray.join("") + `
` + linkArray.join("") + `
🔧自定义网址
`; // //添加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 += `
` + url + `
`; } } 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') { 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 = `

${query}

`; // 富文本特殊处理 // 触发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); } })();