// ==UserScript== // @name 浏览器功能包 // @namespace http://tampermonkey.net/ // @version 0.1.1 // @description 修改浏览器的一些配置,使脚本可以作弊 // @author Tenfond // @include * // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAA AAAABAAEAAAICTAEAOw== // @grant none // @license MIT // @run-at document-start // @downloadURL none // ==/UserScript== (function () { // 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 === 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 null; } 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); } })();