PixelDrain Bypass URLs Globally

Convert all Original Pixeldrain Links to pd for Bypassing in any Page even Linked Buttons.

目前为 2024-11-30 提交的版本。查看 最新版本

// ==UserScript==
// @name         PixelDrain Bypass URLs Globally
// @namespace    SWScripts
// @version      v1.5
// @description  Convert all Original Pixeldrain Links to pd for Bypassing in any Page even Linked Buttons.
// @grant        none
// @license      MIT
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @run-at       document-end
// @match        *://*/*
// ==/UserScript==

(function() {
    'use strict';

    const PIXELDRAIN_URL = /https?:\/\/(www\.)?pixeldrain\.com\/u\/(.*?)/g;
    const REPLACEMENT_URL = 'https://pd.cybar.xyz/';

    let enableRedirect = GM_getValue('enableRedirect', true);
    let enableTextReplacement = GM_getValue('enableTextReplacement', true);

    const replacedUrls = new Map();

    function replaceTextInNode(node) {
        if (node.nodeType === Node.TEXT_NODE && enableTextReplacement) {
            if (PIXELDRAIN_URL.test(node.textContent)) {
                node.textContent = node.textContent.replace(PIXELDRAIN_URL, (match, p1, p2) => {
                    const originalUrl = match;
                    replacedUrls.set(originalUrl, REPLACEMENT_URL + p2);
                    return REPLACEMENT_URL + p2;
                });
            }
        } else if (node.nodeType === Node.ELEMENT_NODE) {
            node.childNodes.forEach(replaceTextInNode);

            if (node.tagName === 'A' && node.href && enableTextReplacement && PIXELDRAIN_URL.test(node.href)) {
                const originalUrl = node.href;
                const newUrl = node.href.replace(PIXELDRAIN_URL, (match, p1, p2) => REPLACEMENT_URL + p2);
                replacedUrls.set(originalUrl, newUrl);
                node.href = newUrl;
            }
        }
    }

    function restoreReplacedLinks() {
        document.querySelectorAll('a').forEach(anchor => {
            if (replacedUrls.has(anchor.href)) {
                anchor.href = replacedUrls.get(anchor.href);
            }
        });

        document.body.innerText = document.body.innerText.replace(REPLACEMENT_URL, (match) => {
            for (let [key, value] of replacedUrls) {
                if (value === match) {
                    return key;
                }
            }
            return match;
        });
    }

    function checkAndReplaceText() {
        if (enableTextReplacement) {
            replaceTextInNode(document.body);
        } else {
            restoreReplacedLinks();
        }
    }

    function handleMutations(mutations) {
        mutations.forEach(mutation => {
            if (mutation.type === 'childList') {
                mutation.addedNodes.forEach(node => {
                    replaceTextInNode(node);
                });
            }
        });
    }

    function observeDOMChanges() {
        const observer = new MutationObserver(handleMutations);
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    }

    function checkIfPixeldrainRedirect() {
        if (enableRedirect) {
            const currentUrl = window.location.href;
            if (PIXELDRAIN_URL.test(currentUrl) && /\/u\//.test(currentUrl)) {
                window.location.href = currentUrl.replace(PIXELDRAIN_URL, (match, p1, p2) => REPLACEMENT_URL + p2);
            }
        }
    }

    GM_registerMenuCommand("Redirect PixelDrain Page (Currently " + (enableRedirect ? "Enabled" : "Disabled") + ")", () => {
        enableRedirect = !enableRedirect;
        GM_setValue('enableRedirect', enableRedirect);
        alert("Redirect is now " + (enableRedirect ? "Enabled" : "Disabled"));
    });

    GM_registerMenuCommand("Links Replacement (Currently " + (enableTextReplacement ? "Enabled" : "Disabled") + ")", () => {
        enableTextReplacement = !enableTextReplacement;
        GM_setValue('enableTextReplacement', enableTextReplacement);
        alert("Text Replacement is now " + (enableTextReplacement ? "Enabled" : "Disabled"));
    });

    document.addEventListener('DOMContentLoaded', function() {
        checkIfPixeldrainRedirect();
        checkAndReplaceText();
        observeDOMChanges();
    });

    setInterval(checkAndReplaceText, 1000);
})();