// ==UserScript==
// @name 浏览器功能包
// @namespace http://tampermonkey.net/
// @version 0.1.5
// @description 修改浏览器的一些配置,使脚本可以作弊
// @author Tenfond
// @match *://*/*
// @grant none
// @license MIT
// @run-at document-start
// ==/UserScript==
(function () {
// event 可信任事件
(function () {
function tamper(event) {
event = {
"isTrusted": true,
"altitudeAngle": event["altitudeAngle"],
"azimuthAngle": event["azimuthAngle"],
"getCoalescedEvents": function getCoalescedEvents() {
return event["getCoalescedEvents"].apply(event, arguments);
},
"getPredictedEvents": function getPredictedEvents() {
return event["getPredictedEvents"].apply(event, arguments);
},
"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;
}
try {
const addEventListener = EventTarget.prototype.addEventListener;
Object.defineProperty(EventTarget.prototype, "addEventListener", {
value: function (type, callback, options = false) {
return addEventListener.apply(this, [type, function (event) {
callback(event.constructor.name === "PointerEvent" ? tamper(event) : event);
}, options]);
},
writable: false,
enumerable: true,
configurable: false
});
} catch (e) {
console.error(e.message);
}
})();
// 定义 location.hashCode 获取 href的hash值
(function () {
try {
Object.defineProperty(location, "hashCode", {
enumerable: true,
configurable: false,
get: function () {
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);
}
let hashCode = location.hashCode, onchange = null;
try {
Object.defineProperty(location, "onchange", {
enumerable: true,
configurable: false,
get: function () {
return onchange;
},
set: function (handler) {
if (typeof handler === "function" || Boolean(handler) === false) {
onchange = handler;
} else {
console.error("Uncaught (in onchange) TypeError: " + handler + " is not a function.")
}
}
});
setInterval(function () {
if (hashCode !== location.hashCode) {
hashCode = location.hashCode;
if (typeof onchange === "function") onchange();
}
}, 500);
} catch (e) {
console.error(e.message);
}
})();
window.searchToJSON = function searchToJSON(search) {
if (search) {
return JSON.parse("{\"" + decodeURIComponent(search.substring(1)
.replace(new RegExp("\"", "g"), '\\"')
.replace(new RegExp("&", "g"), '","')
.replace(new RegExp("=", "g"), '":"')) + "\"}");
} else {
return null;
}
}
window.hrefToLocation = function hrefToLocation(href) {
let location = {href: href}, c = 0, start = 0, port, search;
for (let i = 0; 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, i);
location.origin = href.substring(0, i);
if (port) {
location.port = href.substring(port, i);
} else {
location.hostname = location.host;
location.port = "";
}
}
if (c <= 3) {
start = i + 1;
}
} else if (href[i] === ":" && c === 2) {
location.hostname = href.substring(start + 1, i);
port = i + 1;
} else if (href[i] === "?" && !search) {
location.pathname = href.substring(start - 1, i);
search = i;
} else if (href[i] === "#" && !location.hash) {
location.hash = href.substring(i);
if (search) {
location.search = href.substring(search, i);
} else {
location.search = "";
location.pathname = href.substring(start - 1, i);
}
break;
}
}
if (typeof location.host === "undefined") {
if (c < 2) {
location.host = location.hostname = location.port = location.origin = "";
} else if (c === 2) {
location.host = href.substring(start);
location.origin = href;
if (typeof location.hostname === "undefined") {
location.hostname = location.host;
location.port = "";
} else {
location.port = href.substring(port);
}
}
location.pathname = location.hash = "";
} else if (typeof location.pathname === "undefined") {
location.pathname = href.substring(start - 1);
location.search = location.hash = "";
} else if (typeof location.search === "undefined") {
if (search) {
location.search = href.substring(search);
} else {
location.search = "";
}
location.hash = "";
} else if (typeof location.hash === "undefined") {
location.hash = "";
}
return location;
}
window.xmlHttpRequest = function xmlHttpRequest(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"],
"abort": function () {
return xhr["abort"]();
},
"finalUrl": xhr["responseURL"],
"responseHeaders": (function () {
const headers = {};
xhr["getAllResponseHeaders"]().split("\r\n").forEach(function (header) {
header = header.split(": ");
headers[header[0]] = header[1];
});
return headers;
})(),
"getResponseHeader": function (name) {
return xhr["getResponseHeader"](name);
},
"overrideMimeType": function (mime) {
return xhr["overrideMimeType"](mime);
},
"responseType": xhr["responseType"],
"response": xhr["response"],
"responseText": (function () {
try {
return xhr["responseText"];
} catch (e) {
console.error(e.message);
return e;
}
})(),
"responseXML": (function () {
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;
}
if (typeof handler === "string") handler = {url: handler};
const request = new XMLHttpRequest();
if (handler.onreadystatechange) request.onreadystatechange = function (event) {
return handler.onreadystatechange(xhrToArgs(request), event);
};
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 = function (event) {
return handler.onabort(xhrToArgs(request), event);
};
if (handler.onerror) request.onerror = function (event) {
return handler.onerror(xhrToArgs(request), event);
};
if (handler.onload) request.onload = function (event) {
return handler.onload(xhrToArgs(request), event);
};
if (handler.onloadend) request.onloadend = function (event) {
return handler.onloadend(xhrToArgs(request), event);
};
if (handler.onloadstart) request.onloadstart = function (event) {
return handler.onloadstart(xhrToArgs(request), event);
};
if (handler.onprogress) request.onprogress = function (event) {
return handler.onprogress(xhrToArgs(request), event);
};
if (handler.ontimeout) request.ontimeout = function (event) {
return 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 ready(handler, readyState = "interactive") {
// "loading": 表示文档还在加载中,即处于“正在加载”状态。
// "interactive": 文档已经结束了“正在加载”状态,DOM 元素可以被访问。但是像图像,样式表和框架等资源依然还在加载。
// "complete": 页面所有内容都已被完全加载。
let intervalId = setInterval(function (states = ["loading", "interactive", "complete"]) {
if (states.indexOf(document.readyState.toLowerCase()) >= states.indexOf(readyState.toLowerCase())) {
clearInterval(intervalId);
if (typeof handler === "function") {
handler();
} else {
console.error("Uncaught (in ready) TypeError: " + handler + " is not a function.");
}
}
});
}
})();