// ==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);
}
})();