Greasy Fork is available in English.
替换重定向的链接
当前为
// ==UserScript==
// @name 自动重定向
// @namespace http://tampermonkey.net/
// @version 4.0.2
// @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) => {
[ele, ...ele.querySelectorAll("*")].forEach((ele) => {
changAttr(ele, "href");
changAttr(ele, "src");
});
});
}
});
}).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");
});
})();