您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
替换重定向的链接
// ==UserScript== // @name 自动重定向 // @namespace http://tampermonkey.net/ // @version 4.0.3 // @description 替换重定向的链接 // @author share121 // @match *://*/* // @run-at document-start // @license MIT // @connect * // @grant GM_xmlhttpRequest // ==/UserScript== (() => { let changAttr = (() => { let finalUrls = new Set(), fetchUrls = []; return (ele, attr) => { try { let attrOldVal = ele.getAttribute(attr); if (attrOldVal) { if ( !finalUrls.has(attrOldVal) && !fetchUrls.includes(attrOldVal) ) { fetchUrls.push(attrOldVal); GM_xmlhttpRequest({ method: "HEAD", url: new URL(attrOldVal, location.href).toString(), onload(response) { if (attrOldVal === ele.getAttribute(attr)) { if ( new URL(response.finalUrl).host !== new URL(attrOldVal, location.href).host ) { finalUrls.add(response.finalUrl); ele.setAttribute( attr, response.finalUrl ); } else { finalUrls.add(attrOldVal); } } fetchUrls = fetchUrls.filter( (e) => e !== attrOldVal ); }, onerror() { fetchUrls = fetchUrls.filter( (e) => e !== attrOldVal ); }, onabort() { fetchUrls = fetchUrls.filter( (e) => e !== attrOldVal ); }, }); } } } catch { } }; })(); new MutationObserver((mutationList) => { mutationList.forEach((e) => { if (e.type === "attributes") { changAttr(e.target, e.attributeName); } else { e.addedNodes.forEach((ele) => { try { [ele, ...ele.querySelectorAll("*")].forEach((ele) => { changAttr(ele, "href"); changAttr(ele, "src"); }); } catch { } }); } }); }).observe(document, { subtree: true, childList: true, attributeFilter: ["href", "src"], }); window.addEventListener("mouseover", (e) => { let ele = e.target; while (ele !== document) { changAttr(e.target, "href"); changAttr(e.target, "src"); ele = ele.parentNode; } }); window.addEventListener("touchstart", (e) => { let ele = e.target; while (ele !== document) { changAttr(e.target, "href"); changAttr(e.target, "src"); ele = ele.parentNode; } }); document.querySelectorAll("*").forEach((e) => { changAttr(e, "href"); changAttr(e, "src"); }); })();