// ==UserScript==
// @name No Fingerprint
// @version 0.2
// @description Block browser fingerprinting attempts.
// @author Sam0230
// @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
window.Intl = undefined;
})();
(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);