Greasy Fork

拦截非当前域名请求

拦截请求,过滤非当前域名请求。同域名不同端口号不会过滤。

// ==UserScript==
// @name         拦截非当前域名请求
// @namespace    https://github.com/guoshiqiufeng
// @version      1.0.1
// @description  拦截请求,过滤非当前域名请求。同域名不同端口号不会过滤。
// @author       yanghq
// @license MIT
// @match        http://*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 保存当前域名
    var currentDomain = window.location.hostname;

    // 重写XMLHttpRequest的open方法
    var originalOpen = XMLHttpRequest.prototype.open;

    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
        // 检查请求的目标域名
        var targetDomain = (new URL(url)).hostname;

        // 如果目标域名与当前域名不匹配,则拦截请求
        if (targetDomain !== currentDomain) {
            console.log('拦截请求:', url);
            return;
        }

        // 调用原始的open方法
        originalOpen.apply(this, arguments);
    };

    var originalCreateElement = document.createElement;

    document.createElement = function(tagName) {
         var element = originalCreateElement.apply(this, arguments);

        // 拦截创建 script 元素的情况
        if (tagName.toLowerCase() === 'script') {
            interceptScriptElement(element);
        }

        return element;
    };

    function interceptScriptElement(scriptElement) {
        // 监听 src 属性的设置
        var originalSetAttribute = scriptElement.setAttribute;
        scriptElement.setAttribute = function(name, value) {
            // 拦截设置 src 属性的情况
            if (name.toLowerCase() === 'src') {
                interceptScriptSrc(value);
            }

            // 调用原始的 setAttribute 方法
            originalSetAttribute.apply(this, arguments);
        };
    }

    function interceptScriptSrc(srcValue) {
        // 检查目标域名,可以根据需要修改条件
        var targetDomain = (new URL(srcValue)).hostname;

        // 如果目标域名不是当前域名,拦截请求
        if (targetDomain !== window.location.hostname) {
            console.log('拦截外链脚本请求:', srcValue);
            // 可以根据需要执行其他操作,比如取消加载
        }
    }
})();