// ==UserScript== // @name AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列 // @name:en AC-baidu-google_sogou_bing_RedirectRemove_favicon_adaway_TwoLine // @name:zh AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列 // @name:ja AC-baidu-重定向最適化Baiduの搜狗のGoogleのBing検索結果のリダイレクト除去+favicon // @description 1.繞過百度、搜狗、谷歌、好搜搜索結果中的自己的跳轉鏈接,直接訪問原始網頁-反正都能看懂 2.新增自定义网站拦截功能 3添加Favicon显示 4.页面CSS 5.添加计数 6.开关选择以上功能 7.自动翻页功能 // @description:en 1.bypass the redirect link at baidu\sogou\google\haosou; 2.remove ads at baidu; 3.add Favicon for each website; 4.render your own style; 5.counter; 6.Switch to handle all 7.Auto Pager // @description:ja 1.迂回Baidu、Sogou、Google、Haosou検索検索結果の中の自分の遷移リンク; 2.Baiduの余分な広告を取り除く; 3.コメントを追加; 4.ページのカスタムCSP; 5.カウントを追加; 6.スイッチは以上の機能を選択します; 7.自動ページめくり. // @icon https://ae01.alicdn.com/kf/Hac1a58055c5047cdb91349e91aa208d5k.jpg // @author AC // @license GPL-3.0-only // @create 2015-11-25 // @run-at document-body // @version 26.07 // @connect baidu.com // @connect google.com // @connect google.com.hk // @connect google.com.jp // @connect bing.com // @connect duckduckgo.com // @connect dogedoge.com // @connect so.com // @include *://ipv6.baidu.com/* // @include *://www.baidu.com/* // @include *://www1.baidu.com/* // @include *://m.baidu.com/* // @include *://xueshu.baidu.com/s* // @include *://www.so.com/s?* // @include *://*.bing.com/* // @include *://encrypted.google.*/search* // @include *://*.google*/search* // @include *://scholar.google.com/scholar* // @include *://*.google*/webhp* // @include *://*.zhihu.com/* // @include *://*duckduckgo.com/* // @include *://*.dogedoge.com/* // @exclude *://*.google*/sorry* // @exclude https://zhidao.baidu.com/* // @exclude https://*.zhidao.baidu.com/* // @exclude https://www.baidu.com/img/* // @exclude https://lens.google.com/* // @supportURL https://ac.tujidu.com/ // @home-url https://greasyfork.org/zh-TW/scripts/14178 // @home-url2 https://github.com/langren1353/GM_script // @homepageURL https://greasyfork.org/zh-TW/scripts/14178 // @copyright 2015-2023, AC // @lastmodified 2023-12-16 // @feedback-url https://github.com/langren1353/GM_script // @note 2023.12-16-V26.07 日常维护;优化各页面加载卡顿的问题,优化搜索引擎显示效果 // @note 2023.06-19-V26.06 修复谷歌显示效果的错位问题等,修复谷歌异常白屏问题 // @note 2022.12-07-V26.04 修复必应错位问题;优化谷歌双列动画问题 // @note 2022.08-23-V26.03 修复因背景图引起的看不清字的问题;修复百度单列错位问题;修复google自定义按钮不可见 // @note 2022.08-23-V26.02 加快代码执行速度;减少动画撕裂;替换CDN的md5库 // @note 2022.08-22-V26.01 因甲癌手术和公司事务停更了2个月,目前补上,推荐更新。 1.修复百度加载缓慢的问题;2.修复谷歌样式加载顺序异常的问题;3.整体优化样式加载时间,更流畅了 // @note 2022.06-18-V25.09 修复可能出现的脚本参数读取失败导致的脚本不执行的异常 & 修复 拦截规则特殊参数的问题 & 更换CDN地址 // @note 2022.06-16-V25.06 优化重定向逻辑,部分网站只需要稍作处理,不用做接口请求了,感谢众多搜索引擎的版本迭代更新 // @note 2022.04-08-V25.05 主要修复Block功能;其次优化样式加载速度-减少撕裂感 // @note 2022.03-07-V25.04 修复谷歌、必应样式问题;修复并优化拦截功能 // @note 2022.01-29-V25.02 修复谷歌、百度、必应的部分样式错位的问题 // @note 2021.12-06-V25.01 修复百度样式偏左 & 修复谷歌样式显示 // @note 2021.10-31-V24.29 fixed Less requirement for faster Load // @note 2021.10-29-V24.27 移除必应能选择的广告;增加自定义样式less的支持 // @note 2021.09-02-V24.26 修复必应多favicon,修复百度百科问题;修复谷歌一个小问题 // @note 2021.07-16-V24.25 修复一个bug;兼容百度下搜索股票tag; // @note 2021.06-15-V24.24 更换cdn地址 // @note 2017.05.12 -> 2021.06-15 && V8.6 -> V24.24 各种各样的历史更新记录,从一个版本迭代到另一个版本 // @note 2017.05.12-V8.4 新增:默认屏蔽谷歌的安全搜索功能 // @note 2017.05.05-V8.3 修复include范围太小导致的百度知道的屏蔽问题 // @note 2017.05.04-V8.2 终于修复了百度知道图片替换了文字的这个大BUG; 顺便处理了superapi.zhidao.baidu.com; 新增谷歌搜索结果重定向去除 // @note 2017.05.04-V8.1 终于修复了百度知道图片替换了文字的这个大BUG,顺便处理了superapi.zhidao.baidu.com // @note 2017.05.04-V8.0 终于修复了百度知道图片替换了文字的这个大BUG,待测试 // @note 2017.03.28-V7.6 修复在ViolentMonkey上的不支持的问题 // @note 2017.03.28-V7.5 尝试修复chrome上的问题 // @note 2017.03.21-V7.4 尝试处理Edge上不支持的问题,结果发现是Edge本身的TamperMonkey支持有问题 // @note 2017.03.19-V7.3 修复打开百度之后再次点击“百度一下”导致的无法更新重定向问题 // @note 2017.03.19-V7.2 未知原因chrome的MutationObserver无法使用了,继续回归以前的DOMNodeInserted // @note 2017.02.17-V7.0 修复搜狗的搜索结果重定向问题+改个名字 // @note 2017.02.17-V6.9 修复搜狗的搜索结果重定向问题 // @note 2016.10.27-V6.7 修复了以前的重复请求,现在的请求数应该小了很多,网络也就不卡了,感觉萌萌哒 // @note 2016.04.24-V6.6 恢复以前的版本,因为兼容性问题 // @note 2015.12.01-V5.0 加入搜狗的支持,但是支持不是很好 // @note 2015.11.25-V2.0 优化,已经是真实地址的不再尝试获取 // @note 2015.11.25-V1.0 完成去掉百度重定向的功能 // @resource baiduCommonStyle https://ibaidu.tujidu.com/newcss/baiduCommonStyle.less?t=26.05 // @resource baiduOnePageStyle https://ibaidu.tujidu.com/newcss/baiduOnePageStyle.less?t=26.05 // @resource baiduTwoPageStyle https://ibaidu.tujidu.com/newcss/baiduTwoPageStyle.less?t=26.05 // @resource googleCommonStyle https://ibaidu.tujidu.com/newcss/googleCommonStyle.less?t=26.06 // @resource googleOnePageStyle https://ibaidu.tujidu.com/newcss/googleOnePageStyle.less?t=26.05 // @resource googleTwoPageStyle https://ibaidu.tujidu.com/newcss/googleTwoPageStyle.less?t=26.05 // @resource bingCommonStyle https://ibaidu.tujidu.com/newcss/bingCommonStyle.less?t=26.05 // @resource bingOnePageStyle https://ibaidu.tujidu.com/newcss/bingOnePageStyle.less?t=26.05 // @resource bingTwoPageStyle https://ibaidu.tujidu.com/newcss/bingTwoPageStyle.less?t=26.05 // @resource duckCommonStyle https://ibaidu.tujidu.com/newcss/duckCommonStyle.less?t=26.05 // @resource duckOnePageStyle https://ibaidu.tujidu.com/newcss/duckOnePageStyle.less?t=26.05 // @resource duckTwoPageStyle https://ibaidu.tujidu.com/newcss/duckTwoPageStyle.less?t=26.05 // @resource dogeCommonStyle https://ibaidu.tujidu.com/newcss/dogeCommonStyle.less?t=26.05 // @resource dogeOnePageStyle https://ibaidu.tujidu.com/newcss/dogeOnePageStyle.less?t=26.05 // @resource dogeTwoPageStyle https://ibaidu.tujidu.com/newcss/dogeTwoPageStyle.less?t=26.05 // @resource MainHuYanStyle https://ibaidu.tujidu.com/newcss/HuYanStyle.less?t=26.06 // @resource BgAutoFit https://ibaidu.tujidu.com/newcss/BgAutoFit.less?t=26.05 // @resource baiduLiteStyle https://gitcode.net/-/snippets/1906/raw/master/LiteStyle.css?inline=false // @require https://cdn.staticfile.org/vue/2.6.14/vue.min.js // @require https://cdn.staticfile.org/less.js/4.1.2/less.min.js // @require https://lib.baomitu.com/vue/2.6.14/vue.min.js // @require https://lib.baomitu.com/less.js/4.1.2/less.min.js // @require https://lib.baomitu.com/md5-wasm/1.2.0/md5-wasm.min.js // @grant GM_getValue // @grant GM.getValue // @grant GM_setValue // @grant GM.setValue // @grant GM_addStyle // @grant GM_getResourceURL // @grant GM_listValues // @grant GM.getResourceUrl // @grant GM_xmlhttpRequest // @grant GM_getResourceText // @grant GM_registerMenuCommand // @grant unsafeWindow // @namespace 1353464539@qq.com // @downloadURL none // ==/UserScript== // calc(X1(vw) + X2(px)) -> B(px) 使用 http://www.yunsuan.info/matrixcomputations/solvelinearsystems.html 进行计算 !function () { let isdebug = false; // 调试日志用 let isLocalDebug = false; // 加载本地资源用,调试的时候小心GM的缓存机制 let debug = isdebug ? console.log.bind(console) : ()=>{} let acCssLoadFlag = false; let inExtMode = typeof (isExtension) !== "undefined"; let inGMMode = typeof (GM_info.scriptHandler) !== "undefined"; // = "Greasemonkey" || "Tampermonkey" || "ViolentMonkey" // inExtMode & inGMMode // true true =扩展下的GM代码 不执行 // true false=扩展下代码 执行 // false true =仅GM代码 执行 // false false=异常 但是还是要执行代码 debug("程序开始"); if (inExtMode === true && inGMMode === true || typeof(window.AC666Init) !== 'undefined') { console.log("扩展模式-脚本不启用"); return; } window.AC666Init = true if (typeof (GM) === "undefined") { // 这个是ViolentMonkey的支持选项 GM = {}; GM.setValue = GM_setValue; GM.getValue = GM_getValue; } // 增加了一个css的缓冲层,保证多次CSS操作不导致页面卡顿,减少重排的次数 class FlushDomFragment { constructor() { this.init() } init() { this.length = 0 this.fragmentHead = document.createDocumentFragment(); this.fragmentBody = document.createDocumentFragment(); this.fragmentDOM = document.createDocumentFragment(); this.reloadList = [] // 所有需要动态刷新的都在这里面 } _removeReload() { this.reloadList.map(selector => { safeRemove(selector) }) } _singleInsert(node, toDom, checkDom) { if(node) { const { dataset: { xclass: selector = '' } = {}, tagName = '' } = node if(tagName.toUpperCase() === 'STYLE') { if(selector) { if(checkDom.querySelector(selector)) return } else { console.error('出现没有样式的节点', node) } } toDom.appendChild(node) this.length += 1 debug('增加节点', node) debug('长度变化', this.length) } } // 如果CSS已经存在了,那么就不再添加了 _dropMultiCSS(fragment) { const newFrag = document.createDocumentFragment(); [...fragment.childNodes].map(node => { this._singleInsert(node, newFrag, document) }) return newFrag } flush() { if(this.length > 0) { // 有数据,才进行flush,否则没有必要 this._removeReload() // MARK 保证线程安全,将现有数据暂存,然后生成新的节点,避免其他js插入后丢失 const curBodyFrag = this.fragmentBody const curHeadFrag = this.fragmentHead const curDomFrag = this.fragmentDOM this.init() // 数据清除 const newBodyFrag = this._dropMultiCSS(curBodyFrag) const newHeadFrag = this._dropMultiCSS(curHeadFrag) const newDomFrag = this._dropMultiCSS(curDomFrag) debug('数据flush1', newBodyFrag.children.length) debug('数据flush2', newHeadFrag.children.length) debug('数据flush3', newDomFrag.children.length) safeWaitFunc("body", body => { document.body.appendChild(newBodyFrag) }) safeWaitFunc("head", body => { document.head.appendChild(newHeadFrag) }) document.insertBefore(newDomFrag, document.documentElement) } } appendChild(node, to = 'head', config = { isReload: false }) { return this.insert(node, to, config) } insert(node, to = 'head', config= { isReload: false }) { if (to === 'body') { this._singleInsert(node, this.fragmentBody, this.fragmentBody) } else if(to === 'head') { this._singleInsert(node, this.fragmentHead, this.fragmentHead) } else if(to === 'DOM') { this._singleInsert(node, this.fragmentDOM, this.fragmentDOM) } else{ console.error('不支持的节点操作') return } const { isReload } = config if(isReload) { const { classList = [] } = node if(classList.length) { this.reloadList.push('.' + [...(node.classList || [])].join('.')) } else { console.error('异常的reload参数,没有classList', node) } } return this } } function safeRemoveAd(cssSelectorOrNodeList) { safeRemove(cssSelectorOrNodeList, { withAni: false, isAd: true // 标志是广告 }) } function safeRemove(cssSelectorOrNodeList, option = { withAni: false, // 带动效的删除 isAd: false // true = 有日志,false = 无日志 }) { safeFunction(() => { const { withAni = false, isAd = false} = option let removeNodes = cssSelectorOrNodeList if(typeof cssSelectorOrNodeList === 'string') { removeNodes = document.querySelectorAll(cssSelectorOrNodeList); } if(removeNodes.length) { if(isAd) { console.log(`删除广告节点:${removeNodes.length}个`) console.table(removeNodes) } for (let i = 0; i < removeNodes.length; i++) { aniRemove(removeNodes[i], withAni) } } }) } function aniRemove(node, withAni) { if(withAni) { node.classList.add('aniDelete') setTimeout(() => { node.remove(); }, 200) } else { node.remove(); } } function safeFunction(func, failCb) { try { func(); } catch (e) { failCb && failCb() } } /** * * @param callback interval执行的函数,【注意this指针】 * @param timeout 时间周期 * @param slowAfterTime 等待多少时间后,调整时间周期 * @param newTimeout 新的时间周期 * @returns {{cancel: intervalInstance.cancel, reNew: intervalInstance.reNew, clear: intervalInstance.clear}} */ function setSlowInterval(callback = instance => {}, timeout = 50, slowAfterTime = 6000, newTimeout = 1500) { const runAt = new Date().getTime() let _timeout = timeout let shouldPause = false let shouldEnd = false let intervalInstance = { reNew: () => { shouldPause = false _timeout = new Date().getTime() }, pause: () => { shouldPause = true }, cancel: () => { shouldEnd = true } } function newCallBack() { const deltaT = new Date().getTime() - runAt if(deltaT > slowAfterTime) { _timeout = newTimeout } if(shouldEnd) { return } if(!shouldPause) { callback(intervalInstance) setTimeout(newCallBack, _timeout) } else { setTimeout(() => {}, 5000) } } newCallBack() return intervalInstance } /** * 每隔多少周期执行一次callback,减少调用周期 * 会先执行一次callback,然后开始计数 * * @param callback 回调函数,【注意this指针】 * @param countPeriod 每隔多少周期 */ function setCountFunction(callback, countPeriod) { let t = 0 if(t % countPeriod === 0) { callback() t ++ } } function safeWaitFunc(selector, callbackFunc, time, notClear) { time = time || 60; notClear = notClear || false; let doClear = !notClear; setSlowInterval(instance => { if ((typeof (selector) === "string" && document.querySelector(selector) != null)) { callbackFunc(document.querySelector(selector)); if (doClear) instance.pause(); } else if (typeof (selector) === "function" && (selector() != null || (selector() || []).length > 0)) { callbackFunc(selector()[0]); if (doClear) instance.pause(); } }, time); } (function () { debug("程序执行"); let needDisplayNewFun = true; // 本次更新是否有新功能需要展示 if (window.NodeList && !NodeList.prototype.forEach) { NodeList.prototype.forEach = function (callback, thisArg) { thisArg = thisArg || window; for (let i = 0; i < this.length; i++) { callback.call(thisArg, this[i], i, this); } }; } GM_registerMenuCommand('AC-重定向脚本设置', function() { document.querySelector("#sp-ac-content").style.display = 'block'; }); GM_registerMenuCommand('脚本重置 - 修复脚本', function() { GM_setValue('Config', '{}'); localStorage.setItem('ACConfig', '{}'); location.reload(); }); // let RedirectMap = new Map(); let ACConfig = {}; let DBConfig = {}; // 仅作为普通ACConfig的原始备份,在其他非关键位置时进行保存使用 /*存在对未初始化变量的初始化赋值-无需担心迭代兼容问题*/ let DefaultConfig = { isRedirectEnable: false, // 是否开启重定向功能 isAdsEnable: false, // 是否开启去广告模式 isAutopage: true, // 是否开启自动翻页功能 isBlockEnable: false, // 是否开启去拦截模式 isBlockDisplay: false, // 是否删除已拦截的条目 isBlockBtnNotDisplay: false, // 是否显示block按钮 AdsStyleEnable: true, // 是否开启自定义样式模式 baidu: { name: 'baidu', // CSS load 的前缀标志 AdsStyleMode: '1', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中 HuYanMode: false, // 护眼模式-百度 defaultBgUrl: '', // 默认背景图 BgFit: true, }, google: { name: 'google', AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中 HuYanMode: false, // 护眼模式-谷歌 defaultBgUrl: '', // 默认背景图 BgFit: true, }, bing: { name: 'bing', AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中 HuYanMode: false, // 护眼模式-必应 defaultBgUrl: '', // 默认背景图 BgFit: true, }, duck: { name: 'duck', AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中 HuYanMode: false, // 护眼模式-DuckGOGO }, doge: { name: 'doge', AdsStyleMode: '3', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中 HuYanMode: false, // 护眼模式-DuckGOGO }, sogou: { name: 'sogou', AdsStyleMode: '1', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中 HuYanMode: false, // 护眼模式-搜狗 }, zhihu: { name: 'zhihu', AdsStyleMode: '0', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中 HuYanMode: false, // 护眼模式-搜狗 }, other: { name: 'other', AdsStyleMode: '0', // 0-不带css;1-单列靠左;2-单列居中;3-双列居中 HuYanMode: false, // 护眼模式-搜狗 }, Style_BaiduLite: false, // Baidu_Lite样式表 defaultHuYanColor: "#DEF1EF", isUserColorEnable: true, // 是否开启favicon图标功能 isFaviconEnable: true, // 是否开启favicon图标功能 defaultFaviconUrl: "https://ae01.alicdn.com/kf/HTB1dRY0X8OD3KVjSZFFq6An9pXay.jpg", // 默认图标地址 doDisableSug: true, // 是否禁止百度搜索预测 isRightDisplayEnable: true, // 是否开启右侧边栏 isCounterEnable: false, // 是否显示计数器 isALineEnable: false, // 是否禁止下划线 isUserStyleEnable: false, // 是否开启自定义样式 normalizeDuck: true, // 是否按照常用习惯去配置DuckDuckGo acceptLicense: false, isEnLang: false, isGooleInBaiduModeEnable: false, // 是否开启谷歌搜索结果页的百度图标显示 UserBlockList: [], UserStyleText: `/**计数器的颜色样式*/ div .AC-CounterT { background: #FD9999; } /**百度样式区域**/ body[baidu] { position: relative; /**右侧栏的样式-其实不开启更好看一些*/ #content_right { padding: 20px 15px 15px !important; border-radius: 5px; background-color: #FFFFFF66; box-sizing: border-box; box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1); -webkit-box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1); -moz-box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1); } &:before { position: fixed; width: 100%; height: 100%; top: 0; left: 0; content: ''; background-size: 100% auto; opacity: 0.6; /*背景图透明度=0.8,最大1*/ } /**隐藏首页的大图标-修复可能导致外援样式异常**/ #s_lg_img_new { display: none !important; } #wrapper #s_tab { background-color: rgba(248, 248, 248, 0.4); } #content_left>.c-container { border-radius: 5px; background-color: rgba(255, 255, 255, 0.6) !important; /*百度搜索块体的颜色;透明度=0.1,最大1*/ h3 { background-color: rgba(248, 248, 248, 0.6) !important; /*百度搜索块体 - 标题的颜色;透明度=0.1,最大1*/ } } } body[google] { &:before { position: fixed; width: 100%; height: 100%; top: 0; left: 0; content: ''; background-size: 100% auto; opacity: 0.4; /*背景图透明度=0.8,最大1*/ } #rso .g, .sfbg, .f6F9Be, .k8XOCe { background-color: rgba(248, 248, 248, 0.6) !important; } .sfbg { margin-top: -10px; } .yg51vc { background-color: transparent !important; } }`, oldVersion: "", lastSaveTime: new Date().getTime(), }; let CONST = { hasNewFuncNeedDisplay: true, sortIndex: 1, isGoogleImageUrl: false, isGoogleSpecial: false, // 判断是否存在#rso>.g; true=存在 useItem: {}, fsBaidu: null, flushNode: new FlushDomFragment(), BG_List: { 1: 'https://img.90dao.com/images/2023/10/02/651a347eef3f5.jpg', 2: 'https://img.90dao.com/images/2023/12/17/657de42cb631e.webp', 3: 'https://img.90dao.com/images/2023/12/16/657d34e933276.png', 4: 'https://img.90dao.com/images/2023/10/26/653985cf1a46d.png', } }; var curSite = { SiteTypeID: 1, // 当前站点的ID MainType: "", // 主体节点,很多个的父节点 Stype_Normal: "", // 重定向选择器,只有百度-搜狗-好搜 FaviconType: "", // favicon的域名检查器cite,用于获取host用 FaviconAddTo: "", // favicon选择器,用于插入到title之前的 CounterType: "", // 计数器添加的位置,一般和favicon位置一致 BlockType: "", // 屏蔽按钮的位置,一般在title之后 GMStyleList: {}, }; let DBSite = { baidu: { SiteTypeID: 1, MainType: "#content_left>.c-container", Stype_Normal: "h3.t>a, .c-container article a", FaviconType: ".c-showurl, .c-title a", FaviconAddTo: "h3", CounterType: "#content_left>#double>div[srcid] *[class~=t],[class~=op_best_answer_question],#content_left>div[srcid] *[class~=t],[class~=op_best_answer_question]", BlockType: "h3 a", pager: { nextLink: '//div[@id="page"]//a[contains(text(),"下一页")][@href]', pageElement: "css;div#content_left > *", HT_insert: ["css;div#content_left", 2], // 1 = beforebegin; 2 = beforeend replaceE: "css;#page", stylish: ".autopagerize_page_info, div.sp-separator {margin-bottom: 10px !important;}.c-img-border{display:none}", } }, sogou: { SiteTypeID: 2, MainType: "#main .results>div", Stype_Normal: "h3.pt>a, h3.vrTitle>a", FaviconType: "cite[id*='cacheresult_info_']", FaviconAddTo: "h3", CounterType: ".results>div", BlockType: "h3 a", pager: { nextLink: "//div[@id=\"pagebar_container\"]//a[@id=\"sogou_next\"]", pageElement: "//div[@class=\"results\"]/div", HT_insert: ["//div[@class=\"results\"]", 2], // 1 = beforebegin; 2 = beforeend replaceE: "id(\"pagebar_container\")" } }, haosou: { SiteTypeID: 3, MainType: ".res-list", Stype_Normal: "h3>a", FaviconType: "cite", FaviconAddTo: "h3", CounterType: ".results>div", BlockType: "h3 a", pager: { nextLink: "//div[@id='page']//a[text()='下一页>'] | id('snext')", pageElement: "//div[@id='container']/div", HT_insert: ["//div[@id='container']", 2], // 1 = beforebegin; 2 = beforeend replaceE: "id('page')" } }, google: { SiteTypeID: 4, MainType: "#rso .g, div[data-micp-id='rso'] .g", FaviconType: ".iUh30", FaviconAddTo: "h3", CounterType: "#rso .g h3,._yE>div[class~=_kk] h3", BlockType: "a:not([href*='translate.google.com'])", // 修复block翻页的问题 pager: { nextLink: "id('pnnext')|id('navbar navcnt nav')//td[span]/following-sibling::td[1]/a|id('nn')/parent::a", pageElement: "id('rso')|id('center_col')/style[contains(.,'relative')][id('rso')]", HT_insert: ["css;#res", 2], // 1 = beforebegin; 2 = beforeend replaceE: '//div[@id="navcnt"] | //div[@id="rcnt"]//div[@role="navigation"]', } }, google_scholar: { SiteTypeID: 4.1, MainType: "#rso .g, div[data-micp-id='rso'] .g", FaviconType: ".iUh30", FaviconAddTo: "h3", CounterType: "#rso .g h3,._yE>div[class~=_kk] h3", BlockType: "a:not([href*='translate.google.com'])", // 修复block翻页的问题 pager: { nextLink: '//a[./span[@class="gs_ico gs_ico_nav_next"]]', pageElement: '//div[@class="gs_r gs_or gs_scl"]', HT_insert: null, // 1 = beforebegin; 2 = beforeend replaceE: '//div[@id="navcnt"] | //div[@id="rcnt"]//div[@role="navigation"]', } }, bing: { SiteTypeID: 5, MainType: "#b_results>li", FaviconType: ".b_attribution>cite", FaviconAddTo: "h2", CounterType: "#b_results>li[class~=b_ans] h2,#b_results>li[class~=b_algo] h2", BlockType: "h2 a", Stype_Normal: "h2>a", pager: { nextLink: "//a[contains(@class,\"sb_pagN\")]", pageElement: "id(\"b_results\")/li[not(contains(@class,\"b_pag\") or contains(@class,\"b_ans b_top\"))]", HT_insert: ["id(\"b_results\")/li[@class=\"b_pag\"]", 1], // 1 = beforebegin; 2 = beforeend replaceE: "id(\"b_results\")//nav[@role=\"navigation\"]", } }, duck: { SiteTypeID: 10, MainType: "#links_wrapper #links .nrn-react-div", FaviconType: ".nrn-react-div .result__url__domain", FaviconAddTo: "h2", CounterType: "#links_wrapper #links .nrn-react-div h2", BlockType: "h2 a", pager: { nextLink: "//a[contains(@class,\"sb_pagN\")]", pageElement: "id(\"b_results\")/li[not(contains(@class,\"b_pag\") or contains(@class,\"b_ans b_top\"))]", HT_insert: ["id(\"b_results\")/li[@class=\"b_pag\"]", 1], // 1 = beforebegin; 2 = beforeend replaceE: "id(\"b_results\")//nav[@role=\"navigation\"]", } }, doge: { SiteTypeID: 11, MainType: "#links_wrapper #links .results_links_deep", FaviconType: ".results_links_deep .result__url__domain", FaviconAddTo: "h2", CounterType: "#links_wrapper #links .results_links_deep h2", BlockType: "h2 a", pager: { nextLink: "//a[contains(@class,\"sb_pagN\")]", pageElement: "id(\"b_results\")/li[not(contains(@class,\"b_pag\") or contains(@class,\"b_ans b_top\"))]", HT_insert: ["id(\"b_results\")/li[@class=\"b_pag\"]", 1], // 1 = beforebegin; 2 = beforeend replaceE: "id(\"b_results\")//nav[@role=\"navigation\"]", } }, mBaidu: { SiteTypeID: 6, MainType: "#b_results>li", FaviconType: ".b_attribution>cite", FaviconAddTo: "h2", CounterType: "#b_results>li[class~=b_ans]>h2,#b_results>li[class~=b_algo]>h2,#b_results>li[class~=b_algo]>h2", BlockType: "h2 a", }, zhihu: { SiteTypeID: 7, }, baidu_xueshu: { SiteTypeID: 8, MainType: "#content_left .result", Stype_Normal: "h3.t>a, #results .c-container>.c-blocka", FaviconType: ".result-op, .c-showurl", // baidu 似乎要改版了? FaviconAddTo: "h3", CounterType: "#content_left>#double>div[srcid] *[class~=t]>a,[class~=op_best_answer_question],#content_left>div[srcid] *[class~=t]>a,[class~=op_best_answer_question]", BlockType: "h3 a", }, other: { SiteTypeID: 9, } }; let SiteType = { BAIDU: DBSite.baidu.SiteTypeID, MBAIDU: DBSite.mBaidu.SiteTypeID, SOGOU: DBSite.sogou.SiteTypeID, SO: DBSite.haosou.SiteTypeID, GOOGLE: DBSite.google.SiteTypeID, BING: DBSite.bing.SiteTypeID, DUCK: DBSite.duck.SiteTypeID, DOGE: DBSite.doge.SiteTypeID, ZHIHU: DBSite.zhihu.SiteTypeID, BAIDU_XUESHU: DBSite.baidu_xueshu.SiteTypeID, OTHERS: DBSite.other.SiteTypeID }; let otherData = { other: { curTab: 1, // 展示第二panel showBlockListArea: false, // blockList展示位textarea addBlockItem: "", // 用户手动输入的拦截规则 curHosts: [], // 存放已经访问的hosts数据内容 faviconListMap: { }, // favicon的遍历表 -> .AC-faviconTStyle isBlockChecking: false, // 当前Block功能是否还在执行中,避免多次执行,导致页面卡顿 } }; // 到时候挂载到other上 const AllData = { ACConfig: {}, other: otherData.other, CONST: CONST, lan: { use: {}, zh_cn: { menu_text: "自定义", curLang: "zh_cn", fieldset_panel: { panel_title: "AC-重定向设置 " + GM_info.script.version + (inExtMode? 'Ext':''), setting_panel: { redirect_text: "主功能-处理重定向", redirect_title: "重定向功能的开启与否", useEn_text: "En-Language", useEn_title: "Using English language to display", ads_text: "附加1-去广告功能", ads_title: "去除部分页面的广告信息,还你一个干净整洁的页面", autopage_text: "自动翻页", autopage_title: "自动翻页", blockenable_text: "附加2-自主拦截域名", blockenable_title: "点击页面block按钮添加你想要隐藏的地址,脚本将自动隐藏部分结果为小横幅,DIY按钮中点击表格内容可以取消隐藏", blockDiyBtn_text: "DIY", blockDiyBtn_title: "自定义BLOCK", blockAutoRemove_text: "隐藏结果", blockAutoRemove_title: "自动隐藏已经屏蔽的域名", blockBtnShow_text: "隐藏'block'按钮", blockBtnShow_title: "隐藏掉block按钮的显示", userStyle_text: "附加3-自定义样式", userStyle_baidu_lable: "展开百度设置>>", userStyle_baidu_origin: "百度-原始模式", userStyle_baidu_huyan: "百度-护眼模式", userStyle_baidu_baiduLite: "百度Lite样式", userStyle_baidu_1line: "单列", userStyle_baidu_1line_enter: "单列居中", userStyle_baidu_2line: "双列", userStyle_baidu_3line: "三列", userStyle_baidu_4line: "四列", userStyle_google_lable: "展开谷歌设置>>", userStyle_google_origin: "谷歌-原始模式", userStyle_google_huyan: "谷歌-护眼模式", userStyle_google_googleLite: "谷歌-伪装百度", userStyle_google_1line: "单列", userStyle_google_1line_enter: "单列居中", userStyle_google_2line: "双列", userStyle_google_3line: "三列", userStyle_google_4line: "四列", userStyle_bing_lable: "展开必应设置>>", userStyle_bing_origin: "必应-原始模式", userStyle_bing_huyan: "必应-护眼模式", userStyle_bing_1line: "单列", userStyle_bing_1line_enter: "单列居中", userStyle_bing_2line: "双列", userStyle_bing_3line: "三列", userStyle_bing_4line: "四列", userStyle_sogou_lable: "展开搜狗设置>>", userStyle_sogou_origin: "搜狗-原始模式", userStyle_sogou_huyan: "搜狗-护眼模式", userStyle_sogou_1line: "单列", userStyle_sogou_1line_enter: "单列居中", userStyle_sogou_2line: "双列", userStyle_sogou_3line: "三列", userStyle_sogou_4line: "四列", userStyle_duck_lable: "展开鸭鸭搜设置>>", userStyle_duck_origin: "鸭鸭-原始模式", userStyle_duck_huyan: "鸭鸭-护眼模式", userStyle_duck_normal: "鸭鸭-常见配置", userStyle_duck_1line: "单列", userStyle_duck_1line_enter: "单列居中", userStyle_duck_2line: "双列", userStyle_duck_3line: "三列", userStyle_duck_4line: "四列", userStyle_doge_lable: "展开多吉设置>>", userStyle_doge_origin: "多吉-原始模式", userStyle_doge_huyan: "多吉-护眼模式", userStyle_doge_normal: "多吉-常见配置", userStyle_doge_1line: "单列", userStyle_doge_1line_enter: "单列居中", userStyle_doge_2line: "双列", userStyle_doge_3line: "三列", userStyle_doge_4line: "四列", backgroundImage_text: "背景图:", backgroundImage_text_hint: "图片需要允许跨域,建议使用图床", backgroundImageAutoFit_text: "自动优化", backgroundImageAutoFit_text_hint: "有背景图时,自动优化页面效果", huyanMode_text: "附加4-护眼颜色配置-自定义3中需对应开启", huyanMode_title: "!需要在自定义样式中启用护眼模式", huyanColor_text: "默认护眼颜色:", huyanColor_title: "自定义的护眼颜色:", huyanColorMore_text: "更多颜色选择", favicon_text: "附加5-Favicon功能", favicon_title: "AC-添加Favicon", favicon_defaultIcon_text: "Favicon默认图标:", searchOrigin_text: "附加6-移除百度搜索预测(文字自动搜索)", searchOrigin_title: "AC-移除搜索预测", showRight_text: "附加7-显示右侧栏", showCounter_text: "附加8-编号功能", hintShowCounter_text: "可能会导致图片加载异常", showALine_text: "附加9-文字下划线", showUserStyle_text: "附加10-自定义样式 支持Less.js", contactMe_text: "联系作者,提建议,寻求帮助,自定义样式,脚本定制点我", contactMe_url: "https://github.com/langren1353/GM_script", setting_panel_second: { backBtn_text: "<-返回", blockLabel_text: " 拦截列表 想要生效的话需要手动保存", blockEditBtn_text: "编辑列表", blockEditBtnEnd_text: "结束编辑", addBlockLabel_text: "全匹配拦截:", addBtnLabel_text: "添加", }, cancelBtn_text: "取消", okBtn_text: "保存", resetBtn_text: "重置", } } }, en: { menu_text: "CUSTOM", curLang: "en", fieldset_panel: { panel_title: "AC Redirect Settings " + GM_info.script.version + (inExtMode? 'Ext':''), setting_panel: { redirect_text: "Main-Deal Redirect", redirect_title: "Turn on or off redirect", useEn_text: "En-Language", useEn_title: "使用英文显示页面", ads_text: "Add1-Remove Ads", ads_title: "Remove the ads on the page, and return you a clean page", autopage_text: "Auto Pager", autopage_title: "Auto Pager", blockenable_text: "Add2-Block host", blockenable_title: "Click the Block button to add the address which you want to hide. The script will hide it with small banner automatically. DIY button for editting the hiding list", blockDiyBtn_text: "DIY", blockDiyBtn_title: "Edit BLOCK", blockAutoRemove_text: "Auto remove", blockAutoRemove_title: "remove the block results automatically", blockBtnShow_text: "Hide 'Block' button", blockBtnShow_title: "Hide 'Block' button", userStyle_text: "Add3-CustomStyle", userStyle_baidu_lable: "Expand Baidu Settings>>", userStyle_baidu_origin: "Baidu-Origin", userStyle_baidu_huyan: "Baidu-EyeSave", userStyle_baidu_baiduLite: "BaiduLiteStyle", userStyle_baidu_1line: "SingleRow", userStyle_baidu_1line_enter: "SingleCenter", userStyle_baidu_2line: "Two", userStyle_baidu_3line: "Three", userStyle_baidu_4line: "Four", userStyle_google_lable: "Expand Google Settings>>", userStyle_google_origin: "Google-Origin", userStyle_google_huyan: "Google-EyeSave", userStyle_google_googleLite: "Fake Baidu", userStyle_google_1line: "SingleRow", userStyle_google_1line_enter: "SingleCenter", userStyle_google_2line: "Two", userStyle_google_3line: "Three", userStyle_google_4line: "Four", userStyle_bing_lable: "Expand Bing Settings>>", userStyle_bing_origin: "Bing-Origin", userStyle_bing_huyan: "Bing-EyeSave", userStyle_bing_1line: "SingleRow", userStyle_bing_1line_enter: "SingleCenter", userStyle_bing_2line: "Two", userStyle_bing_3line: "Three", userStyle_bing_4line: "Four", userStyle_sogou_lable: "Expand SoGou Settings>>", userStyle_sogou_origin: "SoGou-Origin", userStyle_sogou_huyan: "SoGou-EyeSave", userStyle_sogou_1line: "SingleRow", userStyle_sogou_1line_enter: "SingleCenter", userStyle_sogou_2line: "Two", userStyle_sogou_3line: "Three", userStyle_sogou_4line: "Four", userStyle_duck_lable: "Expand DuckDuckGo Settings>>", userStyle_duck_origin: "DuckDuck-Origin", userStyle_duck_huyan: "DuckDuck-EyeSave", userStyle_duck_normal: "DuckDuck-Normal", userStyle_duck_1line: "SingleRow", userStyle_duck_1line_enter: "SingleCenter", userStyle_duck_2line: "Two", userStyle_duck_3line: "Three", userStyle_duck_4line: "Four", userStyle_doge_lable: "Expand DogeDoge Settings>>", userStyle_doge_origin: "DogeDoge-Origin", userStyle_doge_huyan: "DogeDoge-EyeSave", userStyle_doge_normal: "DogeDoge-Normal", userStyle_doge_1line: "SingleRow", userStyle_doge_1line_enter: "SingleCenter", userStyle_doge_2line: "Two", userStyle_doge_3line: "Three", userStyle_doge_4line: "Four", backgroundImage_text: "background Image:", backgroundImage_text_hint: "only CORS Image is allowed", backgroundImageAutoFit_text: "Auto Fit:", backgroundImageAutoFit_text_hint: "page auto fit when Bg is not null", huyanMode_text: "Add4-EyeSave Color Setting-Need opened in Add3", huyanMode_title: "!Open EyeSave Mode in CustomStyle is Must", huyanColor_text: "Default EyeSave Color:", huyanColor_title: "The color of EyeSave:", huyanColorMore_text: "More Color", favicon_text: "Add5-Favicon.Func", favicon_title: "AC-AddFavicon", favicon_defaultIcon_text: "FaviconFailedImg::", searchOrigin_text: "AC-Remove Baidu AutoPredict in text search", searchOrigin_title: "Add6-Remove Baidu AutoPredict in text search", showRight_text: "Add7-Right Side Column", showCounter_text: "Add8-NumFunc", hintShowCounter_text: "May Cause image load problem", showALine_text: "Add9-TextUnderLine", showUserStyle_text: "Add10-Your own Style support Less.js", contactMe_text: "For contact the writter, suggests, ask for help then click me", contactMe_url: "https://github.com/langren1353/GM_script/", setting_panel_second: { backBtn_text: "<-Back", blockLabel_text: " Block List  Click Save Button if you want wo save the list", blockEditBtn_text: "Edit List", blockEditBtnEnd_text: "End Edit", addBlockLabel_text: "Add Block item:", addBtnLabel_text: "Add", }, cancelBtn_text: "Cancel", okBtn_text: "Save", resetBtn_text: "Reset", } } } } }; let vueVM = null; /**初始化所有的设置**/ Promise.all([GM.getValue("Config")]).then(function (data) { let res = data[0] if (res && (res !== 'undefined' && res !== 'null')) { try { ACConfig = JSON.parse(res); } catch (e) { ACConfig = res; } } else { ACConfig = DefaultConfig; } const localData = localStorage.ACConfig; // 小心隐私模式 if(localData && localData.length > 10) { // 避免重置为 '{}' 导致的误判 try{ ACConfig = JSON.parse(localData); }catch (e){} } for (let key in DefaultConfig) { if (typeof (ACConfig[key]) === "undefined") { ACConfig[key] = DefaultConfig[key]; } } if (ACConfig.isUserStyleEnable === false && (new Date().getTime() - ACConfig.lastSaveTime > 2592000000)) { // 大约30天时间 // 如果用户取消了设置,并且长时间(30天)没有进行过处理,那么直接将数据置空 -> 用于刷新数据 console.log("ac-baidu css reset for time"); ACConfig.lastSaveTime = new Date().getTime(); ACConfig.UserStyleText = DefaultConfig.UserStyleText; ACSetValue("Config", JSON.stringify(this.ACConfig)) } AllData.ACConfig = ACConfig; DBConfig = JSON.parse(JSON.stringify(ACConfig)); // 暂时作为一个原始保存 AllData.lan.use = ACConfig.isEnLang ? AllData.lan.en : AllData.lan.zh_cn; // 初始化完成之后才能调用正常函数 callback(); }).catch(function (except) { console.log(except); }); function Reg_Get(HTML, reg) { let RegE = new RegExp(reg); try { return RegE.exec(HTML)[1]; } catch (e) { return ""; } } function ACSetValue(key, value) { GM_setValue(key, value); if(key === 'Config'){ if (value) localStorage.ACConfig = value; } } function getElementByXpath(e, t, r) { r = r || document, t = t || r; try { return r.evaluate(e, t, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; } catch (t) { return void console.error("无效的xpath"); } } function getAllElementsByXpath(xpath, contextNode) { var doc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document; contextNode = contextNode || doc; var result = []; try { var query = doc.evaluate(xpath, contextNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (let i = 0; i < query.snapshotLength; i++) { var node = query.snapshotItem(i); //if node is an element node if (node.nodeType === 1) result.push(node); } } catch (err) { throw new Error(`Invalid xpath: ${xpath}`); } //@ts-ignore return result; } /** * Select multiple elements by css selector * @param {string} css css of dom * @param {ParentNode} contextNode dom contextNode * @returns {HTMLElement[]} an array of Nodes */ function getAllElementsByCSS(css) { var contextNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document; return [].slice.call(contextNode.querySelectorAll(css)); } /** * Get all elements matching the selector * @param {ISelectorFunction} selector css selector or xpath selector * @param {Element|Document|DocumentFragment} contextNode contextNode specifies the context node for the query (see the XPath specification). It's common to pass document as the context node. * @param {Document} doc the document to select from * @param {Window} win window of the browser * @param {string} _cplink current page link * @returns {HTMLElement[]} an array of nodes */ function getAllElements(selector) { var contextNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; var doc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document; var win = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : window; var _cplink = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; if (!selector) return []; //@ts-ignore contextNode = contextNode || doc; if (typeof selector === 'string') { if (selector.search(/^css;/i) === 0) { return getAllElementsByCSS(selector.slice(4), contextNode); } else { return getAllElementsByXpath(selector, contextNode, doc); } } else { var query = selector(doc, win, _cplink); if (!Array.isArray(query)) { throw new Error('Wrong type is returned by getAllElements'); } else { return query; } } } const throttle = (callback, wait = 100) => { let it = 0 let preT = 0 return function(...args) { const nowT = + new Date() if(nowT - preT > wait) { preT = nowT clearTimeout(it) it = setTimeout(() => { callback.apply(this, args) clearTimeout(it) }, wait) } } } function callback() { if (ACConfig.oldVersion === GM_info.script.version) { CONST.hasNewFuncNeedDisplay = false; } else { CONST.hasNewFuncNeedDisplay = needDisplayNewFun; } !function() { /** * 进行不重复插入,插入后执行回调函数 * @param data 待插入数据 * @param callback 回调函数 */ function acpush(data, callback) { // 如果是垃圾数据,那么可以丢弃的 if (!data) return; // 如果数据中有回车,那数据也是无效的正文而已 if (data.replace(/({|}|,|\+|:|。|\n)/) !== data) return; if (this.findIndex(m => m === data) < 0) { this.push(data); callback && callback(this); } } function acremove(data, callback) { let delId = this.findIndex(m => m === data); if (delId >= 0) { this.splice(delId, 1); callback && callback(this); } // 删除delId的数据,删除一个 } // 避免污染全局原型链 Object.defineProperty(ACConfig.UserBlockList, 'acpush', {value: acpush}) Object.defineProperty(ACConfig.UserBlockList, 'acremove', {value: acremove}) Object.defineProperty(otherData.other.curHosts, 'acpush', {value: acpush}) Object.defineProperty(otherData.other.curHosts, 'acremove', {value: acremove}) }(); !async function() { if (typeof GM_getResourceText === 'undefined') { GM.getResourceText = GM_getResourceText = async function(aResourceName) { let res = await (await fetch(await GM.getResourceUrl(aResourceName))).text(); let saveRes = await GM.getValue(aResourceName); if (typeof (saveRes) === 'undefined') { GM.setValue(aResourceName, res); } else { return saveRes; } return res; } } if (location.host.includes("xueshu.baidu.com")) { curSite = DBSite.baidu_xueshu; } else if (location.host.includes(".baidu.com")) { if (navigator.userAgent.replace(/(android|mobile|iphone)/igm, "") !== navigator.userAgent) { curSite = DBSite.mBaidu; } else { curSite = DBSite.baidu; } CONST.useItem = ACConfig.baidu; } else if (location.host.includes("zhihu.com")) { curSite = DBSite.zhihu; CONST.useItem = ACConfig.zhihu; } else if (location.host.includes("sogou")) { curSite = DBSite.sogou; CONST.useItem = ACConfig.sogou; } else if (location.host.includes("so.com")) { curSite = DBSite.haosou; CONST.useItem = ACConfig.other; } else if (location.host.includes("google")) { curSite = DBSite.google; CONST.useItem = ACConfig.google; // 针对谷歌学术,特殊处理 if(location.host.includes('scholar.google.com')) { curSite = DBSite.google_scholar; CONST.useItem = ACConfig.other } } else if (location.host.includes("bing")) { curSite = DBSite.bing; CONST.useItem = ACConfig.bing; } else if (location.host.includes("duckduckgo")) { curSite = DBSite.duck; CONST.useItem = ACConfig.duck; } else if (location.host.includes("dogedoge")) { curSite = DBSite.doge; CONST.useItem = ACConfig.doge; } else { curSite = DBSite.other; CONST.useItem = ACConfig.other; } curSite.pageNum = 1; // 当前页数 curSite.pageLoading = false; curSite.pageUrl = ""; curSite.GMStyleList = {} if ( (curSite.SiteTypeID === SiteType.GOOGLE && location.href.replace(/tbm=(isch|lcl|shop|flm)/, "") !== location.href) || (curSite.SiteTypeID === SiteType.BING && location.href.replace(/images\/search/, "") !== location.href) ) { // 图片站 、地图站、购物站 console.log("特殊站,不加载样式,不添加menu"); CONST.isGoogleImageUrl = true; } if (curSite.SiteTypeID === SiteType.BAIDU_XUESHU) { CONST.useItem.AdsStyleMode = 2; // 单列居中即可 } // 预加载GMResource的CSS等 preLoadGMStyle() CONST.fsBaidu = FSBaidu(); if (ACConfig.AdsStyleEnable) { CONST.fsBaidu.init() // 添加设置项-单双列显示 } if(+CONST.useItem.AdsStyleMode > 0) { // 非原始模式,那么可以加载图片 if(CONST.useItem.defaultBgUrl && CONST.useItem.defaultBgUrl.trim()) { changeSiteBackground(CONST.useItem.defaultBgUrl) } } console.log("%c[AC-Redirect] %cLet Me Introduce you a Very Good Search Engine:%c %s %cSearch Engine.", "font-weight:bold;color:cornflowerblue", "color:0", "font-weight:bold;color:darkorange", CONST.useItem.name.replace(CONST.useItem.name[0], CONST.useItem.name[0].toUpperCase()), "font-weight:normal;color:0"); let SiteBlock = { /** * 初始化Block样式 */ initStyle: async function() { CONST.flushNode.insert(await create_CSS_Node("button.ghhider.ghhb[ac-user-alter='1']::before{content:'取消 - ';}#sp-ac-container .ac-block-item{color:#AAA;margin-left:48px;}#sp-ac-container .ac-block-itemdel{float:right;margin-left:0;padding:0 20px;cursor:pointer;}#sp-ac-container .ac-block-itemdel:hover{color:red;}#sp-ac-container .ac-block-high{color:#000;}.ac-blockList li:hover{background-color:#a3caff;color:white !important;cursor:pointer;} *[ac-needhide] *{display:none} *[ac-needhide] .blockShow{display:unset;cursor:pointer;} *[ac-needhide] .blockShow:hover{border:1px solid #DDD}button.ghhider{color:#555;background-color:#fcfcfc;font-family:sans-serif;margin:auto 2px;border:1px solid #ccc;border-radius:4px;padding:2px 3px}button.ghhider{font-size:12px}button.ghhider:hover{color:#006aff;background:#fff}", "AC-BlockStyle")) }, /** * 初始化屏蔽按钮加载 */ init: function() { const needCheckClass = (curSite.MainType + ',').split(',').join(":not([bhandle]),") let checkNodes = document.querySelectorAll(needCheckClass.substring(0, needCheckClass.length - 1)); for (let i = 0; i < checkNodes.length; i++) { let curNode = checkNodes[i]; try { let faviconNode = curNode.querySelector(curSite.FaviconType); let host = getNodeHost(faviconNode).curHost; let faNode = curNode.querySelector(curSite.BlockType); let nodeStyle = "display:unset;"; if (ACConfig.isBlockBtnNotDisplay) { nodeStyle = "display:none;"; } if(faNode) { // 避免父节点出现两个block按钮 if (!faNode.hasAttribute('hasInsert')) { faNode.insertAdjacentHTML("afterend", ``); } faNode.setAttribute("hasInsert", "1"); } curNode.setAttribute("bhandle", "1"); } catch (e) { console.error(e) const failed_count = +(curNode.getAttribute('failed_count') || 1) curNode.setAttribute('failed_count', failed_count + 1) if (failed_count > 3) { curNode.setAttribute("bhandle", "1"); } } } this.initListener(); setCountFunction(this.renderDisplay.bind(this), 3) }, getBlockBtnTitle(host) { return `点击即可屏蔽 ${ host } 放开,需要在自定义中手动配置放开`; }, initListener: function() { let checkNodes = document.querySelectorAll("button.ghhider:not([acEnv])"); for (let i = 0; i < checkNodes.length; i++) { checkNodes[i].addEventListener("click", this.doHideEnv); checkNodes[i].setAttribute("acEnv", "0"); } }, doHideEnv: function(env) { // 先插入数据---记得还要写入存储 let node = env.sourceTarget || env.target; let host = node.dataset.host; if (+node.getAttribute("ac-user-alter") === 1) { // 已经屏蔽之后,再次点击block应该是取消状态 node.removeAttribute("ac-user-alter"); ACConfig.UserBlockList.acremove(host); } else { // 正常屏蔽操作 node.removeAttribute("ac-user-alter"); ACConfig.UserBlockList.acpush(host); } DBConfig.UserBlockList = ACConfig.UserBlockList; ACSetValue("Config", JSON.stringify(DBConfig)); // 点击一次,保存一次 env.stopPropagation(); }, // 刷新显示效果--耗时操作 renderDisplay: throttle(function() { // 增加checking中的检查,避免多次重复调用,减少cpu消耗 if (otherData.other.isBlockChecking) return otherData.other.isBlockChecking = true let checkNodes = document.querySelectorAll(curSite.MainType); let { md5: md5_tag = '', list: regList = [] } = (vueVM && vueVM.calc_block_data) || {}; // 使用Vue的computed属性计算的数据值,一般根本不更新 let flag = "ac-needhide"; for (let i = 0; i < checkNodes.length; i++) { try { let curNode = checkNodes[i]; let { curHost = "", curUrl = "" } = getNodeHost(curNode.querySelector(curSite.FaviconType)); if (!curHost) continue let BlockBtn = curNode.querySelector(".ghhider.ghhb"); BlockBtn.dataset.host = BlockBtn.dataset.meta = curHost; BlockBtn.title = this.getBlockBtnTitle(curHost); if (curNode.querySelector("button[ac-user-alter]") != null) continue; // 用户手动点过显示的,那么跳过check // 减少数据计算 if (curNode.dataset.md5 && curNode.dataset.md5 === md5_tag) continue if (curUrl && regList.findIndex(one => { try { return one.test(curHost) || one.test(curUrl); // 耗时操作 } catch (e) { return one === curHost; } }) >= 0) { // 只检查在屏蔽表中的数据 if (!curNode.hasAttribute(flag)) { if (ACConfig.isBlockDisplay) { // 对于不显示的数据可以进行移除操作 curNode.remove(); continue; } let curTitle = curNode.querySelector(curSite.BlockType); curTitle = curTitle.innerText || curTitle.textContent; if (curNode.hasAttribute(flag)) { console.log("冲突了!!!"); continue; } curNode.setAttribute(flag, "1"); curNode.insertAdjacentHTML("afterBegin", `${ curTitle }      -block by ${ curHost }`); (function(xcur) { // 已经屏蔽之后的内容,点击一下显示原始内容 xcur.querySelector(".blockShow").addEventListener("click", function(env) { this.parentNode.querySelector("button.ghhider").setAttribute("ac-user-alter", "1"); // 这个属性用于保持在DOM更新时,按钮不变 xcur.removeAttribute(flag); safeFunction(function() { xcur.querySelector(".blockShow").remove(); }); env.stopPropagation(); }); })(curNode); } } else { curNode.removeAttribute(flag); safeFunction(function() { curNode.querySelector(".blockShow").remove(); }); } curNode.dataset.md5 = md5_tag } catch (e) { } } otherData.other.isBlockChecking = false }, 50) }; function preLoadGMStyle() { function loadResource(resourceName) { const data = GM_getResourceText(resourceName) curSite.GMStyleList[resourceName] = data } loadResource(CONST.useItem.name + "CommonStyle") loadResource(CONST.useItem.name + "OnePageStyle") loadResource(CONST.useItem.name + "TwoPageStyle") } function addStyle(css) { //添加CSS的代码--copy的 let pi = document.createProcessingInstruction( 'xml-stylesheet', 'type="text/css" must="false" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"' ); return document.insertBefore(pi, document.documentElement); } if (ACConfig.isAdsEnable) { // display已经无法隐藏他们了,需要用绝对的隐藏 CONST.flushNode.insert(await create_CSS_Node("#bottomads{display:none;} #content_left>div:not([id])>div[cmatchid], #content_left>div[id*='300']:not([class*='result']),#content_right td>div:not([id]),#content_right>br{position:absolute;top:-6666px;}", 'AC-AdsStyle')) } if(ACConfig.isFaviconEnable) { CONST.flushNode.insert(await create_CSS_Node("h3::before, h2::before {content: ' ';display:inline-block}", "AC-Style-Favicon")) } if (ACConfig.isBlockEnable) { SiteBlock.initStyle() // 初始化拦截样式 } if (curSite.SiteTypeID === SiteType.GOOGLE && ACConfig.isGooleInBaiduModeEnable) { safeWaitFunc("#logo img, #logocont img", function(node) { let faNode = node.parentNode.parentNode; faNode.classList.add("baidu"); node.removeAttribute("src"); node.src = "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png"; node.width = "125"; node.removeAttribute("height"); }); safeWaitFunc("#main .logo img[alt='Google']", function(node) { node.removeAttribute("srcset"); node.src = "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png"; node.setAttribute("height", "40"); }, 300); safeWaitFunc("form[role='search'] .logo img", function(node) { node.removeAttribute("srcset"); node.src = "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png"; node.setAttribute("height", "40"); }, 300); document.title = document.title.replace(/^Google/, "百度一下,你就知道") .replace(/ - Google 搜索/, "_百度搜索") .replace(/ - Google Search/, "_百度搜索"); safeWaitFunc("head", function() { let linkTarget = document.querySelector("link[type='image/x-icon']") || document.createElement('link'); linkTarget.type = 'image/x-icon'; linkTarget.rel = 'shortcut icon'; linkTarget.href = 'https://www.baidu.com/favicon.ico'; document.head.appendChild(linkTarget); }) } if (curSite.SiteTypeID === SiteType.DUCK) { addStyle = AC_addStyle // 兼容Duck的CSP同源规则 if (ACConfig.normalizeDuck) { setTimeout(function() { try { DDG.settings.set("kn", 1, { // 新窗口打开页面 saveToCloud: true, forceTheme: true }); DDG.settings.set("kav", 1, { // 连续显示搜索结果 saveToCloud: true, forceTheme: true }); } catch (e) { } }, 5000); } } try { if (curSite.SiteTypeID !== SiteType.OTHERS) { document.addEventListener('DOMNodeInserted', MainCallback, false); document.addEventListener('keyup', MainCallback, false); safeWaitFunc("body", () => { !document.body.hasAttribute(CONST.useItem.name) && document.body.setAttribute(CONST.useItem.name, "1"); !document.body.classList.contains(CONST.useItem.name) && document.body.classList.add(CONST.useItem.name); if (ACConfig.AdsStyleEnable) { // 单独不需要定时器-頻繁触发-载入css CONST.fsBaidu.init(); AddCustomStyle(); } InsertSettingMenuCSS() rapidDeal() // 预先执行一次,保证该函数不延迟,避免样式插入有延迟 }) if (ACConfig.isAdsEnable) { // 先来移除多余的广告内容 removeAD_baidu_sogou(); } setSlowInterval(() => { CONST.flushNode.flush() }, 200) setSlowInterval(function() { if (document.body) { rapidDeal(); // 定期调用,避免有时候DOM插入没有执行导致的问题 } }, 800); setTimeout(() => { InsertSettingMenu(); // 等待menu样式加载,延迟插入menu ShowSetting(); }, 200) } } catch (e) { console.log(e); } safeWaitFunc("#sp-ac-content", function(checkNode) { var options = { el: checkNode, data: function() { return { ...AllData, LiveConfig: { css_has_error: false }, resetCSS_text: '重置CSS', calc_block_data: {} } }, methods: { changeBgToIndex(idx) { ACConfig.baidu.defaultBgUrl = this.CONST.BG_List[idx] ACConfig.baidu.BgFit = true }, async labelShowHideEnv(e) { let cur = e.srcElement || e.target; let className = cur.parentNode.className.replace("container-label ", ""); CONST.flushNode.insert(await create_CSS_Node(".XX>label,.XX>br{display:unset !important;}.XX>.label_hide{display:none !important;}".replace(/XX/gm, className), "AC-ShowHideItem-" + className), 'body') e.stopPropagation(); }, syncToBlockList(env) { this.ACConfig.UserBlockList = env.target.value.split("\n").filter(item => item !== ''); }, removeABlockListItem(e) { // 点击移除某个host数据时 let target = e.srcElement || e.target; if (target.tagName.toLowerCase() === "label") { let host = target.dataset.host; ACConfig.UserBlockList.acremove(host); } }, ckAddRule() { // 手动增加移除规则 ACConfig.UserBlockList.acpush(this.other.addBlockItem); this.other.addBlockItem = ""; }, loadCustomStyle() { less.render(ACConfig.UserStyleText, async (e, css) => { if (e) { this.LiveConfig.css_has_error = true } else { this.LiveConfig.css_has_error = false css = css.css || '' CONST.flushNode.insert(await create_CSS_Node(css, "AC-userStyle"), 'head', { isReload: true }) } }); }, saveConfig() { if (this.other.curTab === 1 && !this.ACConfig.acceptLicense) { this.other.curTab = 3 return } this.ACConfig.acceptLicense = true this.ACConfig.lastSaveTime = new Date().getTime(); ACSetValue("Config", JSON.stringify(this.ACConfig)); if (!this.ACConfig.doDisableSug) { acSetCookie("ORIGIN", 1, "www.baidu.com", new Date().getTime() - 86400000); acSetCookie("ISSW", 1, null, new Date().getTime() - 86400000); acSetCookie("ISSW", 1, "www.baidu.com", new Date().getTime() - 86400000); } setTimeout(function() { window.location.reload(); }, 200); }, changeResetText() { this.lan.zh_cn.fieldset_panel.setting_panel.resetBtn_text = '双击重置' this.lan.en.fieldset_panel.setting_panel.resetBtn_text = 'DBl click to Reset' }, resetConfig() { // 显示为双击重置 ACSetValue("Config", '{}'); setTimeout(function() { window.location.reload(); }, 200); }, closePanel() { document.querySelector("#sp-ac-content").style.display = 'none'; }, resetCSS() { if (this.resetCSS_text.includes('重置CSS')) { this.resetCSS_text = '确认重置' return } if (this.resetCSS_text.includes('确认重置')) { this.ACConfig.UserStyleText = DefaultConfig.UserStyleText this.resetCSS_text = '重置CSS' this.loadCustomStyle() } }, useThisHuyanColor(env) { this.ACConfig.defaultHuYanColor = env.target.value || env.target.dataset.value; console.log(this.ACConfig.defaultHuYanColor); CONST.fsBaidu.loadHuYanStyle(this.ACConfig.defaultHuYanColor); } }, computed: { getBlockList() { // 会自动的render到html上去,不用手动去渲染一遍 let insHTML = ""; let { list: UserBlockRegList } = this.cal_UserBlockListRegex; for (let i = 0; i < this.ACConfig.UserBlockList.length; i++) { let insClass = this.other.curHosts.findIndex(m => { try { let [curHost, curUrl] = m.split("###"); return UserBlockRegList[i].test(curHost) || UserBlockRegList[i].test(curUrl); } catch (e) { return (m || '').includes(this.ACConfig.UserBlockList[i]) } }) >= 0 ? " ac-block-high" : ""; // 如果当前页面存在,则高亮 insHTML += `
  • \n`; } return insHTML; }, cal_diyBlockListBtn() { if (this.other.showBlockListArea) { return this.lan.use.fieldset_panel.setting_panel.setting_panel_second.blockEditBtnEnd_text; } else { return this.lan.use.fieldset_panel.setting_panel.setting_panel_second.blockEditBtn_text; } }, async cal_UserBlockListRegex() { var list = []; this.ACConfig.UserBlockList.forEach(one => { safeFunction(() => { one !== null && list.push(new RegExp(one.replace("*", ".*"))); }, () => { list.push(one); }) }) if (typeof (this.other.addBlockItem) !== "undefined" && this.other.addBlockItem !== "") { safeFunction(() => { list.push(new RegExp(this.other.addBlockItem.replace("*", ".*"))); }, () => { list.push(this.other.addBlockItem); }) } this.calc_block_data = { md5: await md5WASM(new TextEncoder().encode(list.join('=='))), // 编码虽然有问题,但是计算md5足够用了 list } return this.calc_block_data }, AdsStyleModeChange() { return { v1: CONST.useItem.AdsStyleMode, v2: CONST.useItem.HuYanMode, v3: ACConfig.Style_BaiduLite, v4: ACConfig.isFaviconEnable, v5: CONST.isGoogleSpecial, v6: ACConfig.isRightDisplayEnable, v7: CONST.useItem.BgFit, v8: ACConfig.AdsStyleEnable, }; }, UserStyleEnableChange() { return { v1: ACConfig.isUserStyleEnable } }, lanChange() { return { v1: ACConfig.isEnLang }; }, isSaveButtonCanBeSee() { return isElementVisible(this.$refs.bottomSaveButton) } }, watch: { 'other.faviconListMap': { immediate: true, deep: true, async handler(val) { if(!ACConfig.isFaviconEnable) return // 遍历所有的数据,然后生成新的数据内容 const baseCSS = '*[data-favicon-t]:before{width: 16px; height: 16px; margin-right: 4px; background-size: 100% 100%; vertical-align: text-top;}' const css = Object.entries(val).reduce((preCSS, cur) => { const [, { tagName = '', url = '' }] = cur let nowCSS = '' if (url) { // https://www.xtwind.com/api/index.php?url=???? 挂了。。。 // https://statics.dnspod.cn/proxy_favicon/_/favicon?domain=sina.cn // www.google.com/s2/favicons?domain=764350177.lofter.com //如果地址不正确,那么丢弃 const imgUrl = "https://favicon.yandex.net/favicon/v2/" + url + "?size=32" nowCSS = tagName + `[data-favicon-t='${ url }']:before{background-image: url('${ imgUrl }');}` } return preCSS + nowCSS }, baseCSS) CONST.flushNode.insert(await create_CSS_Node(css, 'AC-faviconTStyle'), 'head', { isReload: true }) } }, 'ACConfig.isALineEnable': { immediate: true, async handler(isEnable) { // 动态下划线 if (!isEnable) { CONST.flushNode.insert(await create_CSS_Node("a,a em{text-decoration:none !important}", "AC-NoLine")) } else { safeRemove("style[class='AC-NoLine']") } } }, // 当前站点的护眼模式变更 'CONST.useItem.HuYanMode': { immediate: true, handler(val) { if (val) CONST.fsBaidu.loadHuYanStyle() } }, // 当前站点的背景图片地址更换 'CONST.useItem.defaultBgUrl': { handler(imageUrl) { changeSiteBackground(imageUrl) } }, calc_block_data: { handler() { SiteBlock.renderDisplay() } }, AdsStyleModeChange: { handler(curVal, preVal) { // 如果数据真的变了,那么调用后续更新,如果没变,那么跳过 try{ const curStr = JSON.stringify(curVal) const preStr = JSON.stringify(preVal) if(curStr === preStr) return }catch (e){} // 需要先删除原有的节点数据 while (true) { const { res, node } = checkDocmentHasNode("AC-") if (res) node.remove(); else break; } safeRemove("style[class='AC-Style-expand'],style[class='AC-TwoPageExStyle'],style[class='AC-ThreePageExStyle'],style[class='AC-FourPageExStyle'],style[class='AC-style-logo'],style[class='AC-baiduLiteStyle'],style[class*='HuYanStyle-File']"); acCssLoadFlag = false; if(ACConfig.AdsStyleEnable) { CONST.fsBaidu.init() } } }, UserStyleEnableChange() { if (ACConfig.isUserStyleEnable) { this.loadCustomStyle(); } else { safeRemove("style[class='AC-userStyle']") } }, lanChange() { AllData.lan.use = ACConfig.isEnLang ? AllData.lan.en : AllData.lan.zh_cn; document.querySelector("#myuser").remove(); } } }; if (typeof (Vue) != "undefined") { if (+Vue.version.charAt(0) === 2) { vueVM = new Vue(options); } else { vueVM = Vue.createApp(options).mount(checkNode); } } else { console.error("Vue 未完成初始化--程序无法有效执行"); } }, 250); function MainCallback(e) { if (e.target != null && typeof (e.target.className) === "string" && e.target.className.toUpperCase().indexOf("AC-") === 0) { return; } //屏蔽掉因为增加css导致的触发insert动作 } /*以下代码大部分来源于SuprePreloader 感谢 swdyh && ywzhaiqi && NLF 以及 mach6 大佬*/ /* Super_preloaderPlus_one_New: Preload and Autopager. Copyright (C) 2020 Mach6 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ function ac_spfunc(e) { console.error("这里有问题") e.stopPropagation(); var t, r = e.currentTarget; const Tween = { Linear: function Linear(e, t, r, n) { return r * e / n + t; }, Quad: { easeIn: function easeIn(e, t, r, n) { return r * (e /= n) * e + t; }, easeOut: function easeOut(e, t, r, n) { return -r * (e /= n) * (e - 2) + t; }, easeInOut: function easeInOut(e, t, r, n) { return (e /= n / 2) < 1 ? r / 2 * e * e + t : -r / 2 * (--e * (e - 2) - 1) + t; } }, Cubic: { easeIn: function easeIn(e, t, r, n) { return r * (e /= n) * e * e + t; }, easeOut: function easeOut(e, t, r, n) { return r * ((e = e / n - 1) * e * e + 1) + t; }, easeInOut: function easeInOut(e, t, r, n) { return (e /= n / 2) < 1 ? r / 2 * e * e * e + t : r / 2 * ((e -= 2) * e * e + 2) + t; } }, Quart: { easeIn: function easeIn(e, t, r, n) { return r * (e /= n) * e * e * e + t; }, easeOut: function easeOut(e, t, r, n) { return -r * ((e = e / n - 1) * e * e * e - 1) + t; }, easeInOut: function easeInOut(e, t, r, n) { return (e /= n / 2) < 1 ? r / 2 * e * e * e * e + t : -r / 2 * ((e -= 2) * e * e * e - 2) + t; } }, Quint: { easeIn: function easeIn(e, t, r, n) { return r * (e /= n) * e * e * e * e + t; }, easeOut: function easeOut(e, t, r, n) { return r * ((e = e / n - 1) * e * e * e * e + 1) + t; }, easeInOut: function easeInOut(e, t, r, n) { return (e /= n / 2) < 1 ? r / 2 * e * e * e * e * e + t : r / 2 * ((e -= 2) * e * e * e * e + 2) + t; } }, Sine: { easeIn: function easeIn(e, t, r, n) { return -r * Math.cos(e / n * (Math.PI / 2)) + r + t; }, easeOut: function easeOut(e, t, r, n) { return r * Math.sin(e / n * (Math.PI / 2)) + t; }, easeInOut: function easeInOut(e, t, r, n) { return -r / 2 * (Math.cos(Math.PI * e / n) - 1) + t; } }, Expo: { easeIn: function easeIn(e, t, r, n) { return 0 == e ? t : r * Math.pow(2, 10 * (e / n - 1)) + t; }, easeOut: function easeOut(e, t, r, n) { return e == n ? t + r : r * (1 - Math.pow(2, -10 * e / n)) + t; }, easeInOut: function easeInOut(e, t, r, n) { return 0 == e ? t : e == n ? t + r : (e /= n / 2) < 1 ? r / 2 * Math.pow(2, 10 * (e - 1)) + t : r / 2 * (2 - Math.pow(2, -10 * --e)) + t; } }, Circ: { easeIn: function easeIn(e, t, r, n) { return -r * (Math.sqrt(1 - (e /= n) * e) - 1) + t; }, easeOut: function easeOut(e, t, r, n) { return r * Math.sqrt(1 - (e = e / n - 1) * e) + t; }, easeInOut: function easeInOut(e, t, r, n) { return (e /= n / 2) < 1 ? -r / 2 * (Math.sqrt(1 - e * e) - 1) + t : r / 2 * (Math.sqrt(1 - (e -= 2) * e) + 1) + t; } }, Elastic: { easeIn: function easeIn(e, t, r, n, a, o) { return 0 == e ? t : 1 == (e /= n) ? t + r : (o || (o = .3 * n), !a || a < Math.abs(r) ? (a = r, i = o / 4) : i = o / (2 * Math.PI) * Math.asin(r / a), -a * Math.pow(2, 10 * (e -= 1)) * Math.sin((e * n - i) * (2 * Math.PI) / o) + t); var i; }, easeOut: function easeOut(e, t, r, n, a, o) { return 0 == e ? t : 1 == (e /= n) ? t + r : (o || (o = .3 * n), !a || a < Math.abs(r) ? (a = r, i = o / 4) : i = o / (2 * Math.PI) * Math.asin(r / a), a * Math.pow(2, -10 * e) * Math.sin((e * n - i) * (2 * Math.PI) / o) + r + t); var i; }, easeInOut: function easeInOut(e, t, r, n, a, o) { return 0 == e ? t : 2 == (e /= n / 2) ? t + r : (o || (o = n * (.3 * 1.5)), !a || a < Math.abs(r) ? (a = r, i = o / 4) : i = o / (2 * Math.PI) * Math.asin(r / a), e < 1 ? a * Math.pow(2, 10 * (e -= 1)) * Math.sin((e * n - i) * (2 * Math.PI) / o) * -.5 + t : a * Math.pow(2, -10 * (e -= 1)) * Math.sin((e * n - i) * (2 * Math.PI) / o) * .5 + r + t); var i; } }, Back: { easeIn: function easeIn(e, t, r, n, a) { return null == a && (a = 1.70158), r * (e /= n) * e * ((a + 1) * e - a) + t; }, easeOut: function easeOut(e, t, r, n, a) { return null == a && (a = 1.70158), r * ((e = e / n - 1) * e * ((a + 1) * e + a) + 1) + t; }, easeInOut: function easeInOut(e, t, r, n, a) { return null == a && (a = 1.70158), (e /= n / 2) < 1 ? r / 2 * (e * e * ((1 + (a *= 1.525)) * e - a)) + t : r / 2 * ((e -= 2) * e * ((1 + (a *= 1.525)) * e + a) + 2) + t; } }, Bounce: { easeIn: function easeIn(e, t, r, n) { return r - Tween.Bounce.easeOut(n - e, 0, r, n) + t; }, easeOut: function easeOut(e, t, r, n) { return (e /= n) < 1 / 2.75 ? r * (7.5625 * e * e) + t : e < 2 / 2.75 ? r * (7.5625 * (e -= 1.5 / 2.75) * e + .75) + t : e < 2.5 / 2.75 ? r * (7.5625 * (e -= 2.25 / 2.75) * e + .9375) + t : r * (7.5625 * (e -= 2.625 / 2.75) * e + .984375) + t; }, easeInOut: function easeInOut(e, t, r, n) { return e < n / 2 ? .5 * Tween.Bounce.easeIn(2 * e, 0, r, n) + t : .5 * Tween.Bounce.easeOut(2 * e - n, 0, r, n) + .5 * r + t; } } }; const TweenM = ["Linear", "Quad", "Cubic", "Quart", "Quint", "Sine", "Expo", "Circ", "Elastic", "Back", "Bounce"]; const TweenEase = ["easeIn", "easeOut", "easeInOut"]; var prefs = { s_method: 3, s_ease: 2, s_FPS: 60, s_duration: 333, }; function getRelativeDiv(e) { var t = r.id; return (t = t.replace(/(sp-separator-)(.+)/, (function(t, r, n) { return r + String(Number(n) + ("pre" == e ? -1 : 1)); }))) ? document.getElementById(t) : null; } function sp_transition(e, t) { var r = sp_transition.TweenF; r || (r = (r = Tween[TweenM[prefs.s_method]])[TweenEase[prefs.s_ease]] || r, sp_transition.TweenF = r); var n = 1e3 / prefs.s_FPS, a = 0, o = e, i = t - e, s = Math.ceil(prefs.s_duration / n), c = window.scrollX; !function transition() { var e = Math.ceil(r(a, o, i, s)); window.scroll(c, e), a < s && (a++, setTimeout(transition, n)); }(); } function scrollIt(e, t) { sp_transition(e, t); } switch (e.target.id) { case "sp-sp-gotop": scrollIt(window.scrollY, 0); break; case "sp-sp-gopre": var n = getRelativeDiv("pre"); if (!n) return; t = window.scrollY; var a = n.getBoundingClientRect().top; a = t - (r.getBoundingClientRect().top - a); scrollIt(t, a); break; case "sp-sp-gonext": var o = getRelativeDiv("next"); if (!o) return; t = window.scrollY; var i = o.getBoundingClientRect().top; i = t + (-r.getBoundingClientRect().top + i); scrollIt(t, i); break; case "sp-sp-gobottom": scrollIt(window.scrollY, Math.max(document.documentElement.scrollHeight, document.body.scrollHeight)); } } function windowscroll(fn = () => { }) { safeWaitFunc(() => document.documentElement, () => { var beforeScrollTop = document.documentElement.scrollTop window.addEventListener("scroll", function(e) { var afterScrollTop = document.documentElement.scrollTop, delta = afterScrollTop - beforeScrollTop; if (delta === 0) return false; fn(delta > 0 ? "down" : "up", e); beforeScrollTop = afterScrollTop; }, false); }) } // 2秒后才绑定滚动事件 safeWaitFunc('body', () => { setTimeout(() => { windowscroll(async function(direction, e) { if (direction === "down") { // 下滑才准备翻页 let spl = document.querySelector("#sp-fw-a_enable"); // 开启后,且在非(suprepreloader启用)时均可 if (ACConfig.isAutopage === true && !(spl && spl.checked === true)) { var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; let scrollDelta = 888; if (document.documentElement.scrollHeight <= document.documentElement.clientHeight + scrollTop + scrollDelta && curSite.pageLoading === false) { curSite.pageLoading = true; if (curSite.SiteTypeID === SiteType.DUCK) { // 可以用已有的方法来实现了 if (!ACConfig.normalizeDuck || +ACConfig.duck.AdsStyleMode >= 3) { // 如果没有开启,那么手动翻页 || 如果是双列的时候,似乎并不会自动触发翻页效果 document.querySelector("#links .result--more a").click(); setTimeout(function() { curSite.pageLoading = false; }, 5000); } } else { ShowPager.loadMorePage(); if (curSite.pager && curSite.pager.stylish) { CONST.flushNode.insert(await create_CSS_Node(curSite.pager.stylish, "AC-pager-stylish")) } else { curSite.pageLoading = false; console.info('当前站点没有配置pager') } } } } } }); }, 2000) }) var ShowPager = { getFullHref: function(e) { if (e === null) return ''; "string" != typeof e && (e = e.getAttribute("href")); var t = this.getFullHref.a; return t || (this.getFullHref.a = t = document.createElement("a")), t.href = e, t.href; }, createDocumentByString: function(str) { // string转为DOM if (!str) { console.error("[AC-Script]", 'No string found to be converted to DOM'); return; } if (document.documentElement.nodeName !== 'HTML') { return new DOMParser().parseFromString(str, 'application/xhtml+xml'); } /**@type {HTMLDocument} */ var doc; try { // firefox and chrome 30+,Opera 12 会报错 doc = new DOMParser().parseFromString(str, 'text/html'); } catch (ex) {} if (doc) { return doc; } if (document.implementation.createHTMLDocument) { doc = document.implementation.createHTMLDocument('superPreloader'); } else { try { //@ts-ignore doc = document.cloneNode(false); doc.appendChild(doc.importNode(document.documentElement, false)); doc.documentElement.appendChild(doc.createElement('head')); doc.documentElement.appendChild(doc.createElement('body')); } catch (e) {} } if (!doc) return; var range = document.createRange(); range.selectNodeContents(document.body); var fragment = range.createContextualFragment(str); doc.body.appendChild(fragment); var headChildNames = { TITLE: true, META: true, LINK: true, STYLE: true, BASE: true }; var child; var body = doc.body; var bchilds = body.childNodes; for (let i = bchilds.length - 1; i >= 0; i--) { // 移除head的子元素 child = bchilds[i]; if (headChildNames[child.nodeName]) body.removeChild(child); } return doc; }, loadMorePage: async function() { if (curSite.pager) { let curPageEle = getElementByXpath(curSite.pager.nextLink); var url = this.getFullHref(curPageEle); if (curSite.SiteTypeID === SiteType.GOOGLE) { if (navigator.userAgent.toLowerCase().includes('macintosh')) { // MARK 为了兼容百度在safari下的 url = url.replace('https://', 'http://'); } } if (url === '') return; var sepImgs = { top: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWtJREFUeNrclE0rRGEUx8c1GUpRJIVIZGdhZCVr38GGhaI0ZXwCkliglChZEcvJxhdgYWOjLEUpm/EyiLzze+o8dTzdO3PljoVTv7rPc8/5d+6555xYrEhWop6boda5+6l9wjWcWpF+WIbqCJJ9hFRcDr3QAIkIhKugz5PDfkSixkphz5aiAnqgE8rgWRxGoSOPyBkswQuUwyscw4HrmFCZL8Kt/JAg7mEFPEmo4FdPwk0BUcsdzIap0TQ8qMAPuICcEjLnd+VjSjcfJNgIc/DkZGSymYGsnK9EZMrxe4MFaNGiZjC2fT5zQ3p7QDK1dR2GSljziclAvRUe8nHYVA4jjvC43NfAuk/smB2QNqcsWxKcLbAKTFnS0hWD6n27Fd6FLqiDI5iQmQ9jpiVT0sNJ6aYd7dAE3QHBbinSAX5JWWaxuLo8F35jh/bBK9Y+/r/Cl6pLcnna8NvuDGMnslpbZRpXZYT/3r4EGACZL3ZL2afNFAAAAABJRU5ErkJggg==", bottom: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXFJREFUeNrM1c8rBGEcx/FdtCEkLqYtpdwkKSUHUhxwITdK+Z3yM2cOLnJ39Cc44SgHScmJwlFxsIdlCScO6/2t76Onp52dXTtbnno1M8+Pz84+zzMzkcg/KA3oRTzM0A4cI4VTdIUVPIM3pPGO5aABJTkGx1BqjYmFFZxW7nnBwXmXogWX6bEGc2jEIU7+kNWDUSSwZyqndSvJ3N1g2Bm0oLtB2j+w7rQP4MpqXzRT0YRaPW/BthMedYLs60HsoE2vq9BsPwAJa8XFLUa0fUrvROo/saT1Q9adGimdlt8yj6TT6Q6d2vaida9YRbtP6EqmBZC5fHA6X+AAz1bwEc6cfk9+oaZM4NoZJL70+J2hTaZtNpet041zK8yP/Mgl+rOF1emr0UM1xnAfEPyISd0Jno6vtx+QuM6PZ22lpO7dbEV2Siv6rPeIjNs1HdYC7ixfG+YBqdTVDqPIv6iIWvO7iXGUFxAqi72PraJ9IH8EGACQcYjYRd5GHwAAAABJRU5ErkJggg==", pre: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAASlJREFUeNpiYBjOoBiIrwJxFRAzUsvQViD+CMT/gfgTEPdRy9BPUENh+AsQ91JiaAuSS9HxZ3INb8Hi0v+UurwF6qL/ROBvQNxDrKFfkTT+A+JnQPwBKfJA/L9Ian7ic7kMEHcC8Q80F3UAcRsQv4by30INaUJT9weaWhSQDRUB4uVYvLkYiAWAOBopvEFBlArEPEA8G4ue9UAsATM4EYuCJUgKMtAMLoSKCwPxXCx6c1igClTQgmUZVPNrHMEGy3mgYCkCYiYgTkCSV4UZvA2IjYBYDIgvQbPvOyJTECid5wHxbyA2BuL3QLwRWYEsEJvg0IweFEU41IEMlgcxWJAEH0MxJeAsjMFEq6Jw+Br8BimVfMCTDEkG7EBcA8T3oWUJx4DVYwABBgCannnSzbgwIQAAAABJRU5ErkJggg==", next: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAT1JREFUeNrc1b1KA0EYheEl/iARFFEkKl6D0UK8CrEVrCwEexFCtBIlRWIjsfEiLL0FKzs7QUWxM2piFMUkvhPOwLAs2TGuCn7wkNll5jC7+w0Jgv9avdjAObbQn1TwCu7QwhWW4xakPIOHMKzxGCaSCm6ioXHLZ0Hqpz7KrwRPIvvNvBlM2zYyNY8cMjhDHo9fCBzErnIqKNjgRSxpvIABbOLes2MKWHfuXdhXcR2avKrJ4zGhI9gLhQbq9XaZgGO1kutIOzIHpKp7NawhjYOINSeY6lFwHacw17P6NTWHd4xqnNbcS83LObtsaCPbEW+gXUW8ODswC27xoOsn3ODDmfOGss9XLuE54jGjvPqGuuG1mFDzZIfdNHynnde7DbW1r5DwTstJHP2iE55YqD36ebXZDvr+7L/sU4ABAIpVZWnoA5GkAAAAAElFTkSuQmCC", next_gray: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtxJREFUeNrclc9L2mEcx7/6NbVZqRVj7pIOlIUuZ1HMgv0BDcqT7JrskH13ELPBF7eTvz10HznWQBlBRIfBXIfBLmqXscvYZWPKrMNIU9Apmrr34/w6i0ovMZjw+H0+z/N8Xt+Pn/fn80hR/+WHYRhBIpFwRKPRz/F4/KnD4RB28xH0Ah4cHHyoUCjsIpFIIZPJHkml0m9Yfn2ZD78XcL1eH6rValIMCmMUtqKbD7/HbNQxaq15oxcH/lXpcmXgtnh2u/2mXC6/DqE+sSxLlUqlniE0TVPBYJAqFot6+GV9Pt+PJthms80sLS2xEonkhlgs/jgwMOBcXV3N5fP5rlCcp9bX1yWLi4uecrk8U6lUshDY3wRbLJYFGKZsNksq4N78/LwY9hOn05k5Ojqi+PzTGePxeFwZUl6vd8hkMvkPDg6sZJ2M5eXlr1wqUu2kA5JOpy2IAO+oO9fW1n5mMpk2nDjmcjkKNU25XC652Wx2pVIp65mXJ2nyjUPpqakpNZxuA8Y5T87OzsobjcYHpVKpGhsbe1CtVkXYqxQKhTdqtfqL1Wr1JpPJxxyU5Lq/vz8aCoX8TTDatYiFhF6vxx5tAJwm8OPj48m5ubmKSqUaAWwSa9eQw6JGo/luNBoNh4eHbAe0JhAINsLh8LNAIJCiudhxB+Qh2ludTifDAQLvI3AIch+Rkl8jJlrhCbOqgfoLmDepOF/BfGNra2sFFZFtvqgzMbFYjAiyp9Vqh4VC4cTJyYmQ90epIQJtHRO1bA5aRhAvdnZ2GI/H87cEz5YPgeOS2RsfHx9B7u+gOi68yQAtYX9zd3eXgZCna/s8By5ypGUUzhOISHgO9BfWXwG6chZ6IbiVc6LwnsFgGIVAepLzjk4rYW1ze3ubcbvd53fjZV2FaqGQ63fT09PDMO9i9BEoon0J9Rm/339xm3dr2f39fVLX7wFvoMVvoYWfRyIRFndD/Z/8nf0WYAA8EC1Z/ZNm4gAAAABJRU5ErkJggg==", pre_gray: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAslJREFUeNrclTtMWmEUxz/uvTzlIUhpNMR0aGNjrNHSmHTqRJyadujQDbSGRwJUaYCmDizqUEw6ODVNGgbpYCfSpFINCQzFR9oyMXRsXFCsAXkIKNL/R7gGWxOsSdPEk5zc3O+e87vn+59zv0vIpbSJiQmyubn5LBKJpNbX11+4XC5Buxy2XYDNZiMOh2OW4ziPTCbTi8XikeHh4SsSieQTXnIxsN1uJ1ardVYgEDgPDw+V9Xqd1Go1Mcuyg7AuuVy+sra29ndgVEnGx8dnhEKhs1qtKgE/eXZ8fCzC+q3+/n6tSqVaSSQS5wM7nU5iMplmsF1XpVI5BeXt6OhIBFkGAe9SKpV/wNmzKjWbzRT6tFwuK86CUqPrkIVWPjQwMKBWKBSn4Ozv0LGxsRmRSDSFSjua0Do8TRWAS+B5+B68g/IhixCNvQPN1WjuieZsS/f1aNQ0wzBuaCqlUCQRtVr9Es1K4kVDWJNhrQjAIiqMlkqle804FnkjBoOhEzv4vrGxkW2ALRaLFrq+QoAV2nE8tLe3dzEYDE5vb2939vX1PcBkiKVSaQ1jForFYq+NRqMum83ebsYzmJq7sGu4xhkKxsDfB/AxnO860ev1oeXlZU8gEMgmk0kFqmw8o9dUKiWfn58vhMPh54h7S+OpQXNSLBYfejyeR1yzw9dbRon09PS8W11dnfL5fJl8Pk+0Wi3hk5vyCNBY4vV6f0Im9+joKJNOp818o8G70ah4aWnpIzSKYCa/dXd3B+PxuHNycjKzs7NzAms1+qFQy+VydDRz0WjUpdPp3tB8TFM0FAqFGxXPzc19plJrNJqraMoXt9tNt3Suc+Tg4ICeJfmFhQVLoVAwoKG7fr//B8cHAL6Fy9ZFDinaG/r5w77ya8y/OhEvKRhjtIup2YMTeBb3mXY53HnAmNkP+/v7NzHTTwAO4f79f/ud/RJgAOLcRNZqLojMAAAAAElFTkSuQmCC", }; CONST.flushNode.insert(await create_CSS_Node(".sp-separator{line-height:1.8 !important;opacity:1 !important;position:relative !important;float:none !important;top:0 !important;left:0 !important;min-width:366px;width:auto;text-align:center !important;font-size:14px !important;display:block !important;padding:3px 0 !important;margin:5px 10px 8px;clear:both !important;border-style:solid !important;border-color:#cccccc !important;border-width:1px !important;-moz-border-radius:30px !important;border-radius:30px !important;background-color:#ffffff !important;}.sp-separator:hover{box-shadow:0 0 11px rgba(33,33,33,0.2);}#sp-separator-hover{display:none;}.sp-separator:hover #sp-separator-hover{display:block;}.sp-separator .sp-someinfo{position:absolute !important;right:10px !important;font-size:12px !important;font-style:italic !important;background:none !important;}.sp-separator span{vertical-align: middle;cursor: pointer;padding: 0;margin: 0 5px;display: inline-block; width:22px;height:22px;}.sp-separator a{margin:0 20px 0 -6px !important;display:inline !important;text-shadow:#fff 0 1px 0 !important;background:none !important;color:#595959 !important;}.sp-separator input{padding:0 !important;line-height:23px !important;}.sp-separator .sp-md-span{font-weight:bold !important;margin:0 20px !important;}#sp-sp-md-number{width:6ch !important;vertical-align:middle !important;display:inline-block !important;text-align:left !important;}" + `.ac_sp_top{background-image:url('${ sepImgs.top }')}` + `.ac_sp_pre{background-image:url('${ sepImgs.pre }')}` + `.ac_sp_next{background-image:url('${ sepImgs.next }')}` + `.ac_sp_bottom{background-image:url('${ sepImgs.bottom }')}` + `.ac_sp_next_gray{background-image:url('${ sepImgs.next_gray }')}` + `.ac_sp_pre_gray{background-image:url('${ sepImgs.pre_gray }')}`, "AC-Preload")) if (curSite.pageUrl === url) { console.error("[AC-Script]", "翻页到达底部了 - 或者异常 - 出现异常请直接反馈作者修改"); return; }// 不会重复加载相同的页面 console.log("加载翻页地址:" + url) curSite.pageUrl = url; // 对url的数据进行读取 curSite.pager.startFilter && curSite.pager.startFilter(); GM_xmlhttpRequest({ url: url, method: "GET", timeout: 5000, onload: function(response) { try { var newBody = ShowPager.createDocumentByString(response.responseText); const [Rule_insertTo = '', Rule_insertMode = 1] = curSite.pager.HT_insert || [] let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody); const scriptElems = getAllElements('//script', newBody, newBody); let toElement; if (pageElems.length) { const curPageElems = getAllElements(curSite.pager.pageElement, document, document) const pELast = curPageElems[curPageElems.length - 1]; toElement = pELast.nextSibling ? pELast.nextSibling : pELast.parentNode.appendChild(document.createTextNode(' ')); } if (Rule_insertTo) { toElement = getAllElements(Rule_insertTo)[0]; } if (pageElems.length >= 0) { // 处理最后一个翻页按钮 let nextEs = document.querySelectorAll("#sp-sp-gonext"); if (nextEs.length > 0) { let lastE = nextEs[nextEs.length - 1]; lastE.classList.replace("ac_sp_next_gray", "ac_sp_next"); } // 插入翻页按钮元素 curSite.pageNum++; let addTo = "beforeend"; if (Rule_insertMode === 1) addTo = "beforebegin"; const insertPager = document.createElement('div') insertPager.id = "sp-separator-ACX".replace(/ACX/gm, curSite.pageNum) insertPager.className = "sp-separator AC" insertPager.innerHTML = ` ACX ` .replace(/ACX/gm, curSite.pageNum); if(Rule_insertMode === 1) { toElement.parentNode.insertBefore(insertPager, toElement) // 插入新页面元素 pageElems.forEach(function(one) { toElement.parentNode.insertBefore(one, toElement) }); } else { toElement.appendChild(insertPager) pageElems.forEach(function(one) { toElement.appendChild(one) }); } document.querySelectorAll(".sp-separator.AC:not([bind])").forEach(function(per) { per.setAttribute("bind", 1); per.addEventListener("click", ac_spfunc); }); // 插入scripts & style - 保证js加载 if (curSite.SiteTypeID === SiteType.GOOGLE) { var scriptText = ""; scriptElems.forEach((one) => { scriptText += one.innerHTML; }); const scriptNode = document.createElement("script"); scriptNode.innerHTML = scriptText; toElement.appendChild(scriptNode) } // 替换待替换元素 try { if (curSite.pager.replaceE) { let oriE = getAllElements(curSite.pager.replaceE); let repE = getAllElements(curSite.pager.replaceE, newBody, newBody); if (oriE.length === repE.length) { if (oriE.length === 0) { throw "翻页-替换翻页元素 无 'replaceE' 待替换的"; } for (let i = 0; i < oriE.length; i++) { oriE[i].outerHTML = repE[i].outerHTML; } } } } catch (e) { console.log(e); } } } catch (e) { console.log(e); } curSite.pageLoading = false; }, onerror: function() { curSite.pageLoading = false; } }); } }, }; async function AddCustomStyle() { if (ACConfig.isUserStyleEnable) { less.render(ACConfig.UserStyleText, async(e, css) => { if (!e) { css = css.css || '' CONST.flushNode.insert(await create_CSS_Node(css, "AC-userStyle"), 'head', { isReload: true }) } }); } else { // 为了方便调整样式和查看效果,暂时不移除 // safeRemove("style[class='AC-userStyle']") } CONST.flushNode.insert(await create_CSS_Node(".opr-recommends-merge-imgtext{display:none!important;}" + // 移除百度浏览器推广 ".res_top_banner{display:none!important;}" + // 移除可能的百度HTTPS劫持显示问题 ".headBlock, body>div.result-op{display:none;}" // 移除百度的搜索结果顶部一条的建议文字 & 移除可能出现的白屏现象 , "AC-special-BAIDU")) // 添加 自定义的动画 const aniStyle = `@keyframes ani_leftToright { 0% { transform: translateX(-32px); opacity: 0.2; } 20% { opacity: 0.5; } 30% { opacity: 0.8; } 100% { opacity: 1; } } /* ani */ @keyframes ani_bottomTotop { 0% { transform: translateY(32px); opacity: 0.2; } 20% { opacity: 0.5; } 30% { opacity: 0.8; } 100% { opacity: 1; } } @-webkit-keyframes ani_topTobuttom { 0% { transform: translateY(-32px); opacity: 0.2; } 20% { opacity: 0.5; } 30% { opacity: 0.8; } 100% { opacity: 1; } } @-webkit-keyframes ani_hideToShow { 0% { display: none; opacity: 0.2; } 20% { opacity: 0.5; } 30% { opacity: 0.8; } 100% { opacity: 1; } } @-webkit-keyframes ani_showToHide { 0% { display: none; opacity: 1; } 20% { opacity: 0.8; } 30% { opacity: 0.5; } 100% { opacity: 0.3; } } .aniDelete { transition: all 0.15s cubic-bezier(0.4, 0, 1, 1); opacity: 0.1 }`; CONST.flushNode.insert(await create_CSS_Node(aniStyle, "AC-AnimationStyle")) } /**这东西以后会用上**/ function getSearchValue() { let kvl = location.search.substr(1).split("&"); let searchV = ""; for (let i = 0; i < kvl.length; i++) { let value = kvl[i].replace(/^(wd|query|q)=/, ""); if (value !== kvl[i]) { searchV = value; } } // '+' 百度、搜狗、必应、谷歌、好搜 searchV = searchV.replace("+", " "); return searchV; } async function rapidDeal() { try { if (curSite.SiteTypeID !== SiteType.OTHERS) { try { if (ACConfig.isAdsEnable) { // 移除多余的广告内容 removeAD_baidu_sogou(); } RedirectHandle(); // 处理主重定向 if (ACConfig.isFaviconEnable && typeof (curSite.FaviconType) !== 'undefined') { // 显示favicon图标 // 延迟2秒加载,减少可能出现的问题 addFavicon(document.querySelectorAll(curSite.FaviconType)); // 添加Favicon显示 } else { safeRemove(".AC-faviconTStyle"); document.querySelectorAll(curSite.FaviconType).forEach((one) => { one.removeAttribute("ac_faviconstatus"); }) } if (ACConfig.isCounterEnable) { // 延迟加载,避免页面出现js问题 setTimeout(() => { addCounter(document.querySelectorAll(curSite.CounterType)); // 显示计数器 }, 800) } else { document.querySelectorAll(".AC-CounterT").forEach(one => { one.parentElement.removeAttribute('SortIndex'); one.remove() }) } if (ACConfig.doDisableSug) { // 不启用移动预测[默认] acSetCookie("ORIGIN", 2, "www.baidu.com"); acSetCookie("ISSW", 1); acSetCookie("ISSW", 1, "www.baidu.com"); } // if(CONST.useItem.HuYanMode === false && document.querySelector("style[class*='darkreader']") != null) { // CONST.useItem.HuYanMode = true; // } if (ACConfig.isBlockEnable && curSite.SiteTypeID !== SiteType.SOGOU) { // 启用屏蔽功能- 对每一个新增的地址都要处理 // 延迟执行,减少页面损耗 SiteBlock.init(); } if (document.body) { if (!ACConfig.isRightDisplayEnable) { // 右侧栏显示 document.body.classList.remove("showRight") } else if (!document.body.classList.contains('showRight')) { document.body.classList.add("showRight") } if (curSite.SiteTypeID === SiteType.BAIDU && location.href.includes("tn=news")) { if(!document.body.hasAttribute('news')) document.body.setAttribute("news", "1"); } else { document.body.removeAttribute("news"); } } } catch (e) { console.error(e) } } } catch (e) { console.log(e); } } function acSetCookie(cname, cvalue, domain, exdays) { try { exdays = exdays || 30; let d = new Date(); domain = (domain ? "domain=" + domain : "") + ";"; d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); let expires = "expires=" + d.toUTCString(); document.cookie = cname + "=" + cvalue + "; " + domain + expires + ";path=/;SameSite=None;Secure"; } catch (e) { } } /** * isBaiduLink = 是否为未处理之前的百度链接 * */ function getNodeHost(sitetpNode) { if (!sitetpNode) return {} if (curSite.SiteTypeID === SiteType.BAIDU) { const href = sitetpNode.getAttribute("href"); if (href != null && !href.includes("baidu.com/link")) { // 已经解析出来了 return { curHost: getTextHost(href), curUrl: href }; } else { const host = getTextHost(sitetpNode.innerText || sitetpNode.textContent) return { curHost: host, curUrl: host, isBaiduLink: true }; // 未被解密 } } else if (sitetpNode instanceof HTMLAnchorElement) { return { curHost: sitetpNode.host, curUrl: sitetpNode.href }; } else { const host = getTextHost(sitetpNode.innerText || sitetpNode.textContent) return { curHost: host, curUrl: host }; } } function RedirectHandle() { // 处理主重定向 if (curSite.SiteTypeID === SiteType.OTHERS || curSite.SiteTypeID === SiteType.SOGOU) return; if (ACConfig.isRedirectEnable) { if (curSite.Stype_Normal) { // 如果定义了,那么就去处理重定向 // 百度搜狗bing去重定向 resetURLNormal(); if (checkISBaiduMain()) { document.querySelectorAll(".s_form .index-logo-src[src*='gif'], .s_form .index-logo-srcnew[src*='gif']").forEach(function(per) { per.src = "https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png"; // 神奇的百度百家号 // https://imgsa.baidu.com/fex/pic/item/8718367adab44aedcc91ab2bbe1c8701a08bfb26.jpg // https://baidu.ntaow.com/newcss/baidu.png }); } } if (curSite.SiteTypeID === SiteType.GOOGLE) removeOnMouseDownFunc(); // 移除onMouseDown事件,谷歌去重定向 if (curSite.SiteTypeID === SiteType.MBAIDU) removeMobileBaiduDirectLink(); // 处理百度手机版本的重定向地址 removeRedirectLinkTarget(); // 只移除知乎的重定向问题 & 百度学术重定向问题 safeRemove(".res_top_banner"); // 移除百度可能显示的劫持 } try { // 放入异常捕获,防止由于html插入过慢导致的js终止 if (!ACConfig.AdsStyleEnable) { document.querySelectorAll("input[name*='sp-ac-a_force_style_']").forEach(per => { per.setAttribute("disabled", "disabled"); per.parentNode.setAttribute("title", "请开启自定义样式") }); } else { document.querySelectorAll("input[name*='sp-ac-a_force_style_']").forEach(per => { per.removeAttribute("disabled"); per.parentNode.setAttribute("title", "AC-自定义样式内容") }); } if (!ACConfig.isBlockEnable) { document.querySelectorAll("#sp-ac-removeBlock, #sp-ac-blockBtnDisplay").forEach(per => { per.setAttribute("disabled", "disabled"); per.parentNode.setAttribute("title", "请开启拦截功能") }); } else { document.querySelectorAll("#sp-ac-removeBlock, #sp-ac-blockBtnDisplay").forEach(per => { per.removeAttribute("disabled"); per.parentNode.setAttribute("title", "AC-自主拦截功能") }); } } catch (e) { } } function ACtoggleSettingDisplay(e) { e.stopPropagation(); // 显示?隐藏设置界面 if (document.querySelector(".iframe-father iframe") === null) { document.querySelector(".iframe-father").insertAdjacentHTML("beforeend", ""); } setTimeout(function() { if (document.querySelector("#sp-ac-content").style.display === 'block') { document.querySelector("#sp-ac-content").style.display = 'none'; } else { DBConfig.oldVersion = ACConfig.oldVersion = GM_info.script.version; // 只需要写出一部分的关键数据即可 ACSetValue("Config", JSON.stringify(DBConfig)); document.querySelector(".ac-newversionDisplay").style.display = 'none'; document.querySelector("#sp-ac-content").style.display = 'block'; } }, 100); return false; } function ShowSetting() { if (curSite.SiteTypeID === SiteType.OTHERS) return; // 如果不存在的话,那么自己创建一个-copy from superPreload if (document.body !== null && document.querySelector("#sp-ac-container") === null) { let Container = document.createElement('div'); Container.id = "sp-ac-container"; Container.innerHTML = `