X.com to XCancel.com Redirector

Replaces xcancel.com links with xcancel.com

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         X.com to XCancel.com Redirector
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Replaces xcancel.com links with xcancel.com
// @author       Cucco
// @match        *://*/*
// @grant        none
// @run-at       document-start
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Function to replace all xcancel.com links in DOM elements
    function replaceXLinks() {
        // Replace href attributes in anchor tags
        const links = document.querySelectorAll('a[href*="xcancel.com"]');
        links.forEach(link => {
            link.href = link.href.replace(/x\.com/g, 'xcancel.com');
        });

        // Replace xcancel.com in text content (optional)
        const textNodes = [];
        const walker = document.createTreeWalker(
            document.body,
            NodeFilter.SHOW_TEXT,
            null,
            false
        );

        let node;
        while (node = walker.nextNode()) {
            if (node.nodeValue.includes('xcancel.com')) {
                textNodes.push(node);
            }
        }

        textNodes.forEach(node => {
            node.nodeValue = node.nodeValue.replace(/x\.com/g, 'xcancel.com');
        });
    }

    // Run when DOM is loaded
    document.addEventListener('DOMContentLoaded', replaceXLinks);

    // Also run periodically to catch dynamically added content
    setInterval(replaceXLinks, 2000);

    // Intercept and modify URL before navigation
    const originalOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function() {
        if (arguments[1] && typeof arguments[1] === 'string') {
            arguments[1] = arguments[1].replace(/x\.com/g, 'xcancel.com');
        }
        return originalOpen.apply(this, arguments);
    };

    // Intercept fetch requests
    const originalFetch = window.fetch;
    window.fetch = function() {
        if (arguments[0] && typeof arguments[0] === 'string') {
            arguments[0] = arguments[0].replace(/x\.com/g, 'xcancel.com');
        } else if (arguments[0] && arguments[0] instanceof Request) {
            arguments[0] = new Request(
                arguments[0].url.replace(/x\.com/g, 'xcancel.com'),
                arguments[0]
            );
        }
        return originalFetch.apply(this, arguments);
    };
})();