No Fingerprint (Forked by: janandreiiii)

Block browser fingerprinting attempts. *Fixed some websites don't load.

当前为 2023-07-25 提交的版本,查看 最新版本

    // ==UserScript==
    // @name         No Fingerprint (Forked by: janandreiiii)
    // @version      0.3
    // @description  Block browser fingerprinting attempts. *Fixed some websites don't load.
    // @author       Sam0230, Forked by: @janandreiiii
    // @match        *://*/*
    // @grant        none
    // @run-at       document-start
    // @noframes     false
    // @license      The Unlicense
    // @namespace    https://github.com/Sam0230
    // ==/UserScript==
     
    let script = document.createElement("script");
    script.textContent = "(" + (function() {
    	"use strict";
    	let debug = function (topOnly) {
    		if (!topOnly || window === window.top) {
    			// debugger;
    		}
    	};
    	(function () {
    		document.documentElement.dataset.fbscriptallow = true;
    	})();
    	let randomChange = function (n, m) {
    		if (!m) {
    			m = 0.1;
    		}
    		return Math.round(n + ((Math.random() - 0.5) * 2 * n * 0.3));
    	};
    	let setValue = function (object, propertyName, value, writable) {
    		if (!writable) {
    			writable = false;
    		}
    		Object.defineProperty(object, propertyName, {
    			value: value,
    			writable: writable,
    			enumerable: true
    		});
    	};
    	(function () { // Date
    		window.Date.prototype.getDate					=	window.Date.prototype.getUTCDate					;
    		window.Date.prototype.getDay					=	window.Date.prototype.getUTCDay						;
    		window.Date.prototype.getFullYear				=	window.Date.prototype.getUTCFullYear				;
    		window.Date.prototype.getHours					=	window.Date.prototype.getUTCHours					;
    		window.Date.prototype.getMilliseconds			=	window.Date.prototype.getUTCMilliseconds			;
    		window.Date.prototype.getMinutes				=	window.Date.prototype.getUTCMinutes					;
    		window.Date.prototype.getMonth					=	window.Date.prototype.getUTCMonth					;
    		window.Date.prototype.getSeconds				=	window.Date.prototype.getUTCSeconds					;
    		window.Date.prototype.getTimezoneOffset			=	function () { return 0; }							;
    		window.Date.prototype.getYear					=	function () { return this.getFullYear - 1900; }		;
    		window.Date.prototype.setDate					=	window.Date.prototype.setUTCDate					;
    		window.Date.prototype.setFullYear				=	window.Date.prototype.setUTCFullYear				;
    		window.Date.prototype.setHours					=	window.Date.prototype.setUTCHours					;
    		window.Date.prototype.setMilliseconds			=	window.Date.prototype.setUTCMilliseconds			;
    		window.Date.prototype.setMinutes				=	window.Date.prototype.setUTCMinutes					;
    		window.Date.prototype.setMonth					=	window.Date.prototype.setUTCMonth					;
    		window.Date.prototype.setSeconds				=	window.Date.prototype.setUTCSeconds					;
    		window.Date.prototype.setYear					=	function (n) { return this.setFullYear(n + 1900); }	;
    		window.Date.prototype.toLocaleDateString		=	function () { return ""; }							;
    		window.Date.prototype.toLocaleString			=	function () { return ""; }							;
    		window.Date.prototype.toLocaleTimeString		=	function () { return ""; }							;
    		window.Date.prototype.toString					=	function () { return ""; }							;
    		window.Date.prototype.toTimeString				=	function () { return ""; }							;
    	})();
    	(function () { // navigator
    		let a;
    		let fakeNavigator = {};
    	//	fakeNavigator.appCodeName						=
    	//	fakeNavigator.appName							=
    	//	fakeNavigator.appVersion						=
    	//	fakeNavigator.platform							=
    		fakeNavigator.product							=
    		fakeNavigator.productSub						=
    	//	fakeNavigator.userAgent							=
    		fakeNavigator.vendor							=
    		fakeNavigator.vendorSub							=
    		a = "";
    		fakeNavigator.deviceMemory						=
    		fakeNavigator.hardwareConcurrency				=
    		fakeNavigator.maxTouchPoints					=
    		a = 0;
    		fakeNavigator.bluetooth							=
    		fakeNavigator.clipboard							=
    		fakeNavigator.connection						=
    	//	fakeNavigator.cookieEnabled						=
    		fakeNavigator.credentials						=
    		fakeNavigator.doNotTrack						=
    		fakeNavigator.geolocation						=
    		fakeNavigator.keyboard							=
    		fakeNavigator.language							=
    		fakeNavigator.languages							=
    		fakeNavigator.locks								=
    		fakeNavigator.mediaCapabilities					=
    		fakeNavigator.mediaDevices						=
    		fakeNavigator.mediaSession						=
    	//	fakeNavigator.mimeTypes							=
    		fakeNavigator.onLine							=
    		fakeNavigator.permissions						=
    		fakeNavigator.presentation						=
    		fakeNavigator.scheduling						=
    		fakeNavigator.serviceWorker						=
    	//	fakeNavigator.storage							=
    		fakeNavigator.usb								=
    		fakeNavigator.userActivation					=
    		fakeNavigator.userAgentData						=
    		fakeNavigator.wakeLock							=
    		fakeNavigator.webkitPersistentStorage			=
    		fakeNavigator.webkitTemporaryStorage			=
    		fakeNavigator.xr								=
    		a = {};
    		fakeNavigator.hardwareConcurrency				= 4;
    		fakeNavigator.deviceMemory						= "undefined";
    	//	fakeNavigator.platform 							= "Win32";
    		fakeNavigator.plugins							= [];
    		setValue(fakeNavigator.plugins, "item",			function item() { return null; },		false);
    		setValue(fakeNavigator.plugins, "namedItem",	function namedItem() { return null; },	false);
    		setValue(fakeNavigator.plugins, "refresh",		function refresh() { return null; },	false);
    		for (let i in window.navigator) {
    			if (fakeNavigator[i] !== undefined) {
    				try {
    					Object.defineProperty(window.navigator, i, {
    						get: function () {
    							if (fakeNavigator[i] === "undefined") {
    								return undefined;
    							}
    							return fakeNavigator[i];
    						}
    					});
    				} catch (e) {}
    			}
    		}
    	})();
    	(function () { // Screen size
    		let screenSize = [1920, 1080];
    		screen.availWidth && setValue(screen, "availWidth", screenSize[0]);
    		screen.availHeight && setValue(screen, "availHeight", screenSize[1] - 40);
    		screen.availLeft && setValue(screen, "availLeft", undefined, true);
    		screen.availTop && setValue(screen, "availTop", undefined, true);
    		screen.width && setValue(screen, "width", screenSize[0]);
    		screen.height && setValue(screen, "height", screenSize[1]);
    		screen.Brightness && setValue(screen, "Brightness", randomChange(screen.Brightness));
    		screen.mozBrightness && setValue(screen, "mozBrightness", randomChange(screen.mozBrightness));
    		screen.left && setValue(screen, "left", undefined, true);
    		screen.top && setValue(screen, "top", undefined, true);
    		screen.enabled && setValue(screen, "enabled", undefined);
    		screen.mozEnabled && setValue(screen, "mozEnabled", undefined);
    		screen.pixelDepth && setValue(screen, "pixelDepth", 32);
    		screen.colorDepth && setValue(screen, "colorDepth", 32);
    	})();
    	(function () { // Debugger panel size
    		let n = Math.round(71.5 + (Math.random() * 15)), wChanged = false, wValue, hChanged = false, hValue;
    		Object.defineProperty(window, "outerWidth", {
    			get: function () {
    				if (!wChanged) {
    					return window.innerWidth;
    				}
    				return wValue;
    			},
    			set: function (value) {
    				wChanged = true;
    				wValue = value;
    			}
    		});
    		Object.defineProperty(window, "outerHeight", {
    			get: function () {
    				if (!hChanged) {
    					return window.innerHeight + n;
    				}
    				return hValue;
    			},
    			set: function (value) {
    				hChanged = true;
    				hValue = value;
    			}
    		});
    	})();
    	(function () { // AudioContext
    		let origGetFloatFrequencyData = window.AnalyserNode.prototype.getFloatFrequencyData;
    		window.AnalyserNode.prototype.getFloatFrequencyData = function getFloatFrequencyData(array) {
    			let ret = origGetFloatFrequencyData.apply(this, arguments);
    			for (let i = 0; i < array.length; i++) {
    				array[i] = array[i] + Math.random() * 0.2;
    			}
    			return ret;
    		};
    		window.AnalyserNode.prototype.getFloatFrequencyData.toString = origGetFloatFrequencyData.toString.bind(origGetFloatFrequencyData);
    		let origGetChannelData = window.AudioBuffer.prototype.getChannelData;
    		window.AudioBuffer.prototype.getChannelData = function getChannelData() {
    			let ret = origGetChannelData.apply(this, arguments);
    			for (let i = 0; i < ret.length; i++) {
    				ret[i] = ret[i] + Math.random() * 0.0001;
    			}
    			return ret;
    		};
    		window.AudioBuffer.prototype.getChannelData.toString = origGetChannelData.toString.bind(origGetChannelData);
    	})();
    	(function () { // Canvas
    		let origGetContext		= HTMLCanvasElement.prototype.getContext;
    		let origGetImageData	= CanvasRenderingContext2D.prototype.getImageData;
    		let origReadPixels1		= WebGLRenderingContext.prototype.readPixels;
    		let origReadPixels2		= WebGL2RenderingContext.prototype.readPixels;
    		let origToDataURL		= HTMLCanvasElement.prototype.toDataURL;
    		let origToBlob			= HTMLCanvasElement.prototype.toBlob;
    		let getImageData = function getImageData() {
    			let imageData = origGetImageData.apply(this, arguments);
    			for (let i = 0; i < imageData.data.length; i++) {
    				imageData.data[i] += Math.round((Math.random() - 0.5) * 4.9);
    			}
    			return imageData;
    		};
    		CanvasRenderingContext2D.prototype.getImageData = getImageData;
    		CanvasRenderingContext2D.prototype.getImageData.toString = origGetImageData.toString.bind(origGetImageData);
    		let origIsPointInPath = CanvasRenderingContext2D.prototype.isPointInPath;
    		CanvasRenderingContext2D.prototype.isPointInPath = function isPointInPath() {
    			return false;
    		};
    		CanvasRenderingContext2D.prototype.isPointInPath.toString = origIsPointInPath.toString.bind(origIsPointInPath);
    		let readPixels1 = function readPixels() {
    			origReadPixels1.apply(this, arguments);
    			let pixels = arguments[6];
    			for (let i = 0; i < pixels.length; i++) {
    				pixels[i] += Math.round((Math.random() - 0.5) * 4.9);
    			}
    		};
    		WebGLRenderingContext.prototype.readPixels = readPixels1;
    		WebGLRenderingContext.prototype.readPixels.toString = origReadPixels1.toString.bind(origReadPixels1);
    		let readPixels2 = function readPixels() {
    			origReadPixels2.apply(this, arguments);
    			let pixels = arguments[6];
    			for (let i = 0; i < pixels.length; i++) {
    				pixels[i] += Math.round((Math.random() - 0.5) * 4.9);
    			}
    		};
    		WebGL2RenderingContext.prototype.readPixels = readPixels2;
    		WebGL2RenderingContext.prototype.readPixels.toString = origReadPixels2.toString.bind(origReadPixels2);
    		let toDataURL = function toDataURL() {
    			let context = origGetContext.apply(this, ["2d"]);
    			let imageData = origGetImageData.apply(context, [0, 0, this.height, this.width]), origImageData = origGetImageData.apply(context, [0, 0, this.height, this.width]), ret;
    			for (let i = 0; i < imageData.data.length; i++) {
    				imageData.data[i] += Math.round((Math.random() - 0.5) * 4.9);
    			}
    			context.putImageData(imageData, 0, 0);
    			ret = origToDataURL.apply(this, arguments);
    			context.putImageData(origImageData, 0, 0);
    			return ret;
    		};
    		let hookWebGLGetParameter = function (target) {
    			let random = {
    				"item": function (e) {
    					let rand = e.length * Math.random();
    					return e[Math.floor(rand)];
    				},
    				"number": function (power) {
    					let tmp = [];
    					for (let i = 0; i < power.length; i++) {
    						tmp.push(Math.pow(2, power[i]));
    					}
    					return random.item(tmp);
    				},
    				"int": function (power) {
    					let tmp = [];
    					for (let i = 0; i < power.length; i++) {
    						let n = Math.pow(2, power[i]);
    						tmp.push(new Int32Array([n, n]));
    					}
    					return random.item(tmp);
    				},
    				"float": function (power) {
    					let tmp = [];
    					for (let i = 0; i < power.length; i++) {
    						let n = Math.pow(2, power[i]);
    						tmp.push(new Float32Array([1, n]));
    					}
    					return random.item(tmp);
    				}
    			};
    			let origGetParameter = target.getParameter;
    			target.getParameter = function (a1) {
    				if (a1 === this.STENCIL_BITS							) { return 0;																						}
    				if (a1 === this.DEPTH_BITS								) { return 24;																						}
    				if (a1 === this.MAX_VARYING_VECTORS						) { return 30;																						}
    				if (a1 === this.VENDOR									) { return "WebKit";																				}
    				if (a1 === 37445										) { return "Google Inc.";																			}
    				if (a1 === this.RENDERER								) { return "WebKit WebGL";																			}
    				if (a1 === this.MAX_TEXTURE_SIZE						) { return random.number([14, 15]);																	}
    				if (a1 === this.MAX_VERTEX_UNIFORM_VECTORS				) { return random.number([12, 13]);																	}
    				if (a1 === this.MAX_CUBE_MAP_TEXTURE_SIZE				) { return random.number([14, 15]);																	}
    				if (a1 === this.MAX_RENDERBUFFER_SIZE					) { return random.number([14, 15]);																	}
    				if (a1 === this.MAX_VIEWPORT_DIMS						) { return random.int([13, 14, 15]);																}
    				if (a1 === this.ALPHA_BITS								) { return random.number([1, 2, 3, 4]);																}
    				if (a1 === this.BLUE_BITS								) { return random.number([1, 2, 3, 4]);																}
    				if (a1 === this.GREEN_BITS								) { return random.number([1, 2, 3, 4]);																}
    				if (a1 === this.RED_BITS								) { return random.number([1, 2, 3, 4]);																}
    				if (a1 === 34047										) { return random.number([1, 2, 3, 4]);																}
    				if (a1 === this.MAX_TEXTURE_IMAGE_UNITS					) { return random.number([1, 2, 3, 4]);																}
    				if (a1 === this.MAX_VERTEX_ATTRIBS						) { return random.number([1, 2, 3, 4]);																}
    				if (a1 === this.MAX_VERTEX_TEXTURE_IMAGE_UNITS			) { return random.number([1, 2, 3, 4]);																}
    				if (a1 === this.MAX_COMBINED_TEXTURE_IMAGE_UNITS		) { return random.number([4, 5, 6, 7, 8]);															}
    				if (a1 === this.MAX_FRAGMENT_UNIFORM_VECTORS			) { return random.number([10, 11, 12, 13]);															}
    				if (a1 === this.ALIASED_LINE_WIDTH_RANGE				) { return random.float([0, 10, 11, 12, 13]);														}
    				if (a1 === this.ALIASED_POINT_SIZE_RANGE				) { return random.float([0, 10, 11, 12, 13]);														}
    				if (a1 === 37446										) { return random.item(["Graphics", "HD Graphics", "Intel(R) HD Graphics"]);						}
    				if (a1 === this.VERSION									) { return random.item(["WebGL 1.0", "WebGL 1.0 (OpenGL)", "WebGL 1.0 (OpenGL Chromium)"]);			}
    				if (a1 === this.SHADING_LANGUAGE_VERSION				) { return random.item(["WebGL", "WebGL GLSL", "WebGL GLSL ES", "WebGL GLSL ES (OpenGL Chromium"]);	}					
    				return origGetParameter.apply(this, arguments);
    			};
    			target.getParameter.toString = origGetParameter.toString.bind(origGetParameter);
    		};
    		hookWebGLGetParameter(WebGLRenderingContext.prototype);
    		hookWebGLGetParameter(WebGL2RenderingContext.prototype);
    		HTMLCanvasElement.prototype.toDataURL = toDataURL;
    		HTMLCanvasElement.prototype.toDataURL.toString = origToDataURL.toString.bind(origToDataURL);
    		let toBlob = function toBlob(callback, type, encoderOptions) {
    			let context = origGetContext.apply(this, ["2d"]);
    			let imageData = origGetImageData.apply(context, [0, 0, this.height, this.width]), imageDataOrig = origGetImageData.apply(context, [0, 0, this.height, this.width]);
    			for (let i = 0; i < imageData.data.length; i++) {
    				imageData.data[i] += Math.round((Math.random() - 0.5) * 4.9);
    			}
    			context.putImageData(imageData, 0, 0);
    			return origToBlob.apply(this, [function (blob) {
    				context.putImageData(imageDataOrig, 0, 0);
    				callback(blob);
    			}, type, encoderOptions]);
    		};
    		HTMLCanvasElement.prototype.toBlob = toBlob;
    		HTMLCanvasElement.prototype.toBlob.toString = origToBlob.toString.bind(origToBlob);
    	})();
    	(function () { // Intl
    	
    	})();
    	(function () { // Fonts
    		let offsetWidth = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "offsetWidth");
    		let origOffsetWidthGetter = offsetWidth.get;
    		offsetWidth.get = function offsetWidth() {
    			let ret = origOffsetWidthGetter.apply(this, arguments);
    			if (ret != 0) {
    				if (Math.random() >= 0.9) {
    					ret += Math.floor((Math.random() >= 0.5 ? -1 : 1) * Math.random() + Math.random());
    				}
    			}
    			return ret;
    		};
    		offsetWidth.get.toString = origOffsetWidthGetter.toString.bind(origOffsetWidthGetter);
    		Object.defineProperty(HTMLElement.prototype, "offsetWidth", offsetWidth);
    		let offsetHeight = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "offsetHeight");
    		let origOffsetHeightGetter = offsetHeight.get;
    		offsetHeight.get = function offsetHeight() {
    			let ret = origOffsetWidthGetter.apply(this, arguments);
    			if (ret != 0) {
    				if (Math.random() >= 0.9) {
    					ret += Math.floor((Math.random() >= 0.5 ? -1 : 1) * Math.random() + Math.random());
    				}
    			}
    			return ret;
    		};
    		offsetHeight.get.toString = origOffsetHeightGetter.toString.bind(origOffsetHeightGetter);
    		Object.defineProperty(HTMLElement.prototype, "offsetHeight", offsetHeight);
    	})();
    	let debuggerHook = function (n, m) {
    		try {
    			let orig = window[n].prototype[m];
    			let hook = function () {
    				debug();
    				try {
    					return orig.apply(this, arguments);
    				} catch (e) {}
    			};
    			Object.defineProperty(hook, "name", { value: orig.name, writable: false, enumerable: false, configurable: true });
    			window[n].prototype[m] = hook;
    			window[n].prototype[m].toString = orig.toString.bind(orig);
    		} catch (e) {}
    	};
    	let debuggerHookAll = function (n) {
    		try {
    			for (let i in window[n].prototype) {
    				try {
    					if (window[n].prototype[i] instanceof Function) {
    						debuggerHook(n, i);
    					}
    				} catch (e) {}
    			}
    		} catch (e) {}
    	};
    	debug(1);
    	try {
    		debuggerHookAll("AudioContext");
    		debuggerHookAll("BaseAudioContext");
    		debuggerHookAll("OfflineAudioCompletionEvent");
    		debuggerHookAll("OfflineAudioContext");
    		debuggerHookAll("AudioBuffer");
    		debuggerHookAll("AnalyserNode");
    		debuggerHookAll("HTMLCanvasElement");
    		debuggerHookAll("CanvasRenderingContext2D");
    		debuggerHookAll("WebGLRenderingContext");
    		debuggerHookAll("WebGL2RenderingContext");
    	} catch (e) {}
    }) + ")()";
    document.documentElement.prepend(script);

QingJ © 2025

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