自动重定向

替换重定向的链接

目前為 2023-01-31 提交的版本,檢視 最新版本

// ==UserScript==
// @name         自动重定向
// @namespace    http://tampermonkey.net/
// @version      0.3.0
// @description  替换重定向的链接
// @author       share121
// @match        *://*/*
// @run-at       document-start
// @license      MIT
// @connect      *
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(() => {
    /*
    function changHref(ele) {
        try {
            if (ele.href) {
                fetch(new URL(ele.href, location.href).toString(), {
                    method: "HEAD",
                })
                    .then((e) => {
                        if (e.url && e.url !== ele.href) {
                            ele.href = e.url;
                        }
                    })
                    .catch((e) => console.error(e));
            }
        } catch (e) {
            console.error(e);
        }
    }
    */
    function changHref(ele) {
        try {
            if (ele.href) {
                GM.xmlHttpRequest({
                    method: "HEAD",
                    url: new URL(ele.href, location.href).toString(),
                    onload: function (response) {
                        if (
                            response.finalUrl &&
                            response.finalUrl !== ele.href
                        ) {
                            ele.href = response.finalUrl;
                        }
                    },
                    onerror: function (response) {
                        console.error(response);
                    },
                });
            }
        } catch (e) {
            console.error(e);
        }
    }
    function isA(ele) {
        while (ele) {
            if (ele instanceof HTMLAnchorElement) {
                return ele;
            }
            ele = ele.parentNode;
        }
        return false;
    }
    new MutationObserver((mutationList) => {
        mutationList.forEach((e) => {
            if (e.type === "attributes") {
                if (e.target instanceof HTMLAnchorElement) {
                    changHref(e.target);
                }
            } else {
                e.addedNodes.forEach((ele) => {
                    if (ele instanceof HTMLAnchorElement) {
                        changHref(ele);
                    }
                });
            }
        });
    }).observe(document, {
        subtree: true,
        childList: true,
        attributeFilter: ["href"],
    });
    window.addEventListener("mouseover", (e) => {
        let a = isA(e.target);
        if (a) {
            changHref(a);
        }
    });
})();