浏览器功能包

修改浏览器的一些配置,使脚本可以作弊

目前為 2022-10-02 提交的版本,檢視 最新版本

// ==UserScript==
// @name         浏览器功能包
// @namespace    http://tampermonkey.net/
// @version      0.1.2
// @description  修改浏览器的一些配置,使脚本可以作弊
// @author       Tenfond
// @include      *
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAA  AAAABAAEAAAICTAEAOw==
// @grant        none
// @license      MIT
// @run-at       document-start
// ==/UserScript==

(function () {
    try {
        let timers = {
            "Timeout": {},
            "Interval": {}
        }, setTimeout, setInterval, clearTimeout, clearInterval;
        window.setTimeout = (() => {
            setTimeout = window.setTimeout;
            return ((handler, timeout, ...arguments) => {
                timers["Timeout"][setTimeout(handler, timeout, arguments)] = {
                    "handler": handler,
                    "timeout": timeout,
                    "arguments": arguments
                }
            })
        })();
        window.setInterval = (() => {
            setInterval = window.setInterval;
            return ((handler, timeout, ...arguments) => {
                const ID = setInterval(handler, timeout, arguments);
                timers["Interval"][ID] = {
                    "handler": handler,
                    "timeout": timeout,
                    "arguments": arguments
                };
                return ID;
            })
        })();
        window.getTimeout = () => {
            return timers["Timeout"];
        }
        window.getInterval = () => {
            return timers["Interval"];
        }
        window.clearTimeout = (() => {
            clearTimeout = window.clearTimeout;
            return ID => {
                clearTimeout(ID);
                delete timers["Timeout"][ID];
            }
        })();
        window.clearInterval = (() => {
            clearInterval = window.clearInterval;
            return ID => {
                clearInterval(ID);
                delete timers["Interval"][ID];
            }
        })();
    } catch (e) {
        console.error(e.message);
    }


    // event 可信任事件
    // function tamper(event) {
    //     event = {
    //         "isTrusted": true,
    //         "altitudeAngle": event["altitudeAngle"],
    //         "azimuthAngle": event["azimuthAngle"],
    //         "getCoalescedEvents": event["getCoalescedEvents"],
    //         "getPredictedEvents": event["getPredictedEvents"],
    //         "height": event["height"],
    //         "isPrimary": event["isPrimary"],
    //         "pointerId": event["pointerId"],
    //         "pointerType": event["pointerType"],
    //         "pressure": event["pressure"],
    //         "tangentialPressure": event["tangentialPressure"],
    //         "tiltX": event["tiltX"],
    //         "tiltY": event["tiltY"],
    //         "twist": event["twist"],
    //         "width": event["width"],
    //         "constructor": event["constructor"],
    //         "__proto__": event["__proto__"],
    //         "altKey": event["altKey"],
    //         "bubbles": event["bubbles"],
    //         "button": event["button"],
    //         "buttons": event["buttons"],
    //         "cancelBubble": event["cancelBubble"],
    //         "cancelable": event["cancelable"],
    //         "clientX": event["clientX"],
    //         "clientY": event["clientY"],
    //         "composed": event["composed"],
    //         "ctrlKey": event["ctrlKey"],
    //         "currentTarget": event["currentTarget"],
    //         "defaultPrevented": event["defaultPrevented"],
    //         "detail": event["detail"],
    //         "eventPhase": event["eventPhase"],
    //         "fromElement": event["fromElement"],
    //         "layerX": event["layerX"],
    //         "layerY": event["layerY"],
    //         "metaKey": event["metaKey"],
    //         "movementX": event["movementX"],
    //         "movementY": event["movementY"],
    //         "offsetX": event["offsetX"],
    //         "offsetY": event["offsetY"],
    //         "pageX": event["pageX"],
    //         "pageY": event["pageY"],
    //         "path": event["path"],
    //         "relatedTarget": event["relatedTarget"],
    //         "returnValue": event["returnValue"],
    //         "screenX": event["screenX"],
    //         "screenY": event["screenY"],
    //         "shiftKey": event["shiftKey"],
    //         "sourceCapabilities": event["sourceCapabilities"],
    //         "srcElement": event["srcElement"],
    //         "target": event["target"],
    //         "timeStamp": event["timeStamp"],
    //         "toElement": event["toElement"],
    //         "type": event["type"],
    //         "view": event["view"],
    //         "which": event["which"],
    //         "x": event["x"],
    //         "y": event["y"]
    //     }
    //     return event;
    // }

    // EventTarget.prototype.addEventListener = (() => {
    //     this["#addEventListener"] = this.addEventListener !== undefined ? this.addEventListener : EventTarget.prototype.addEventListener;
    //     return (type, callback, options) => {
    //         return this["#addEventListener"](type, function (event) {
    //             callback(tamper(event));
    //         }, options);
    //     };
    // })();
    // try {
    //     Object.defineProperty(EventTarget.prototype, "addEventListener", {
    //         enumerable: true,
    //         configurable: false,
    //         get() {
    //             return EventTarget.prototype.addEventListener;
    //         }
    //     });
    // } catch (e) {
    //     console.error(e.message);
    // }


    // location.hashCode
    try {
        Object.defineProperty(location, "hashCode", {
            enumerable: true,
            configurable: false,
            get() {
                let code = 0;
                for (const v of location.href) {
                    code += (code << 7) + v.charCodeAt(0);
                }
                // 返回值在 JavaScript 中的取值范围 [-2147483648,4294967294]
                return code;
            }
        });
    } catch (e) {
        console.error(e.message);
    }

    // location.onchange
    (hashCode => {
        try {
            let onchange = null;
            Object.defineProperty(location, "onchange", {
                enumerable: true,
                configurable: false,
                get() {
                    return onchange;
                },
                set(callback) {
                    if (typeof callback === "function") {
                        onchange = callback;
                    } else {
                        console.error("Uncaught (in onchange) TypeError: " + callback + " is not a function.")
                    }
                }
            });
            console.log(setInterval(() => {
                if (hashCode !== location.hashCode) {
                    hashCode = location.hashCode;
                    if (onchange !== null) onchange();
                }
            }, 500));
        } catch (e) {
            console.error(e.message);
        }
    })(location.hashCode);

    window.searchToJSON = function (search) {
        if (search) {
            return JSON.parse("{\"" + decodeURIComponent(search.substring(1)
                .replace(/"/g, '\\"')
                .replace(/&/g, '","')
                .replace(/=/g, '":"')) + "\"}");
        } else {
            return null;
        }
    }

    window.hrefToLocation = function (href) {
        let location = {href: href}, c = 0, start = 0, search;
        for (let i = 0, port; i < href.length; i++) {
            if (href[i] === "/") {
                if (++c === 1) {
                    location.protocol = href.substring(start, i);
                } else if (c === 3) {
                    location.host = href.substring(start + 1, i);
                    if (port) {
                        location.port = href.substring(port + 1, i);
                    } else {
                        location.hostname = location.host;
                        location.port = "";
                    }
                }
                if (c <= 3) {
                    start = i;
                }
            } else if (href[i] === ":" && c === 2) {
                location.hostname = href.substring(start + 1, i);
                port = i;
            } else if (href[i] === "?" && !search) {
                location.pathname = href.substring(start, i);
                search = i;
            } else if (href[i] === "#" && !location.hash) {
                location.hash = href.substr(i);
                if (location.pathname === undefined) {
                    location.pathname = href.substring(c, i);
                } else if (search) {
                    location.search = href.substring(search, i);
                }
                break;
            }
        }
        if (location.pathname === undefined) {
            location.pathname = c === 3 ? href.substring(start) : "";
            location.search = location.hash = "";
        }
        if (location.search === undefined) {
            if (search) {
                location.search = href.substring(search);
            } else {
                location.search = "";
            }
        }
        if (location.hash === undefined) {
            location.hash = "";
        }
        return location;
    }

    window.xmlHttpRequest = function (handler) {
        function xhrToArgs(xhr) {
            if (xhr.constructor.name === "XMLHttpRequest") return {
                // "onabort": xhr["onabort"],
                // "onerror": xhr["onerror"],
                // "onload": xhr["onload"],
                // "onloadend": xhr["onloadend"],
                // "onloadstart": xhr["onloadstart"],
                // "onprogress": xhr["onprogress"],
                // "onreadystatechange": xhr["onreadystatechange"],
                // "ontimeout": xhr["ontimeout"],
                "finalUrl": xhr["responseURL"],
                "responseHeaders": (() => {
                    const headers = {};
                    xhr["getAllResponseHeaders"]().split("\r\n").forEach(header => {
                        header = header.split(": ");
                        headers[header[0]] = header[1];
                    });
                    return headers;
                })(),
                "getResponseHeader": xhr["getResponseHeader"],
                "overrideMimeType": xhr["overrideMimeType"],
                "responseType": xhr["responseType"],
                "response": xhr["response"],
                "responseText": (() => {
                    try {
                        return xhr["responseText"];
                    } catch (e) {
                        console.error(e.message);
                        return e;
                    }
                })(),
                "responseXML": (() => {
                    try {
                        return xhr["responseXML"];
                    } catch (e) {
                        console.error(e.message);
                        return e;
                    }
                })(),
                "readyState": xhr["readyState"],
                "status": xhr["status"],
                "statusText": xhr["statusText"],
                "timeout": xhr["timeout"],
                // "upload": xhr["upload"],
                // "withCredentials": xhr["withCredentials"]
            }; else return xhr.constructor.name;
        }

        let request = new XMLHttpRequest();
        request.open(handler.method ? handler.method.toUpperCase() : "GET", handler.url ? handler.url : location.href, handler.async ? handler.async : true, handler.user ? handler.user : null, handler.password ? handler.password : null);
        if (handler.headers) for (let header in handler.headers) request.setRequestHeader(header, handler.headers[header]);
        if (handler.onabort) request.onabort = event => handler.onabort(xhrToArgs(request), event);
        if (handler.onerror) request.onerror = event => handler.onerror(xhrToArgs(request), event);
        if (handler.onload) request.onload = event => handler.onload(xhrToArgs(request), event);
        if (handler.onloadend) request.onloadend = event => handler.onloadend(xhrToArgs(request), event);
        if (handler.onloadstart) request.onloadstart = event => handler.onloadstart(xhrToArgs(request), event);
        if (handler.onprogress) request.onprogress = event => handler.onprogress(xhrToArgs(request), event);
        if (handler.onreadystatechange) request.onreadystatechange = event => handler.onreadystatechange(xhrToArgs(request), event);
        if (handler.ontimeout) request.ontimeout = event => handler.ontimeout(xhrToArgs(request), event);
        if (handler.responseType) request.responseType = handler.responseType;
        if (handler.overrideMimeType) request.setRequestHeader("Content-Type", handler.overrideMimeType);
        if (handler.data) {
            request.send(JSON.stringify(handler.data));
        } else {
            request.send();
        }
        return request;
    }

    window.ready = function (callback) {
        let intervalId = setInterval(() => {
            if (document.readyState === "complete") {
                clearInterval(intervalId);
                if (typeof callback === "function") {
                    callback();
                } else {
                    console.error("Uncaught (in ready) TypeError: " + callback + " is not a function.");
                }
            }
        }, 100);
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址