jumpy-lion 0.0.33 → 0.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-controller.d.ts +2 -2
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +34 -5
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +21 -0
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +10 -4
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/browser.d.ts +15 -0
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +6 -3
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/crawler.d.ts +15 -0
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/anti-webgpu/background.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/background.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/background.js +4 -0
- package/dist/fingerprinting/anti-webgpu/background.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js +50 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/inject.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js +172 -0
- package/dist/fingerprinting/anti-webgpu/data/content_script/page_context/inject.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/128.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/16.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/32.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/48.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/icons/64.png +0 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.css +88 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.html +58 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.js +96 -0
- package/dist/fingerprinting/anti-webgpu/data/popup/popup.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.js +249 -0
- package/dist/fingerprinting/anti-webgpu/lib/chrome.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.js +86 -0
- package/dist/fingerprinting/anti-webgpu/lib/common.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.js +14 -0
- package/dist/fingerprinting/anti-webgpu/lib/config.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts +2 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.d.ts.map +1 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.js +107 -0
- package/dist/fingerprinting/anti-webgpu/lib/runtime.js.map +1 -0
- package/dist/fingerprinting/anti-webgpu/manifest.json +58 -0
- package/dist/fingerprinting/fingerprint-injector.d.ts +85 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +188 -90
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js +87 -0
- package/dist/fingerprinting/fingerprint-overrides/audio-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js +95 -0
- package/dist/fingerprinting/fingerprint-overrides/canvas-protection.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js +96 -0
- package/dist/fingerprinting/fingerprint-overrides/client-rect-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts +7 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js +219 -0
- package/dist/fingerprinting/fingerprint-overrides/font-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +19 -0
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/index.js +19 -0
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +262 -0
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts +7 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js +103 -0
- package/dist/fingerprinting/fingerprint-overrides/mouse-humanization.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js +228 -0
- package/dist/fingerprinting/fingerprint-overrides/performance-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts +20 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +227 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js +84 -0
- package/dist/fingerprinting/fingerprint-overrides/runtime-enable-bypass.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +440 -0
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +95 -0
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts +12 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +167 -0
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js +205 -0
- package/dist/fingerprinting/fingerprint-overrides/webgpu-spoofing.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts +6 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +96 -0
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/page.d.ts +1 -0
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +42 -1
- package/dist/page.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/fingerprinting/anti-webgpu/lib/config.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
var config = {};
|
|
2
|
+
|
|
3
|
+
config.test = {"page": "https://webbrowsertools.com/webgpu-fingerprint/"};
|
|
4
|
+
|
|
5
|
+
config.welcome = {
|
|
6
|
+
set lastupdate (val) {app.storage.write("lastupdate", val)},
|
|
7
|
+
get lastupdate () {return app.storage.read("lastupdate") !== undefined ? app.storage.read("lastupdate") : 0}
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
config.notification = {
|
|
11
|
+
"timeout": null,
|
|
12
|
+
set show (val) {app.storage.write("notification", val)},
|
|
13
|
+
get show () {return app.storage.read("notification") !== undefined ? app.storage.read("notification") : false}
|
|
14
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/fingerprinting/anti-webgpu/lib/config.js"],"names":[],"mappings":"AAAA,IAAI,MAAM,GAAG,EAAE,CAAC;AAEhB,MAAM,CAAC,IAAI,GAAG,EAAC,MAAM,EAAE,iDAAiD,EAAC,CAAC;AAE1E,MAAM,CAAC,OAAO,GAAG;IACf,IAAI,UAAU,CAAE,GAAG,IAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA,CAAA,CAAC;IAC3D,IAAI,UAAU,KAAK,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAC;CAC7G,CAAC;AAEF,MAAM,CAAC,YAAY,GAAG;IACpB,SAAS,EAAE,IAAI;IACf,IAAI,IAAI,CAAE,GAAG,IAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA,CAAA,CAAC;IACvD,IAAI,IAAI,KAAK,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA,CAAA,CAAC;CAC/G,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/fingerprinting/anti-webgpu/lib/runtime.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
app.version = function () {return chrome.runtime.getManifest().version};
|
|
2
|
+
app.homepage = function () {return chrome.runtime.getManifest().homepage_url};
|
|
3
|
+
|
|
4
|
+
if (!navigator.webdriver) {
|
|
5
|
+
app.on.uninstalled(app.homepage() + "?v=" + app.version() + "&type=uninstall");
|
|
6
|
+
app.on.installed(function (e) {
|
|
7
|
+
app.on.management(function (result) {
|
|
8
|
+
if (result.installType === "normal") {
|
|
9
|
+
app.tab.query.index(function (index) {
|
|
10
|
+
let previous = e.previousVersion !== undefined && e.previousVersion !== app.version();
|
|
11
|
+
let doupdate = previous && parseInt((Date.now() - config.welcome.lastupdate) / (24 * 3600 * 1000)) > 45;
|
|
12
|
+
if (e.reason === "install" || (e.reason === "update" && doupdate)) {
|
|
13
|
+
let parameter = (e.previousVersion ? "&p=" + e.previousVersion : '') + "&type=" + e.reason;
|
|
14
|
+
let url = app.homepage() + "?v=" + app.version() + parameter;
|
|
15
|
+
app.tab.open(url, index, e.reason === "install");
|
|
16
|
+
config.welcome.lastupdate = Date.now();
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
app.on.message(function (request, sender) {
|
|
25
|
+
if (request) {
|
|
26
|
+
if (request.path === "popup-to-background") {
|
|
27
|
+
for (let id in app.popup.message) {
|
|
28
|
+
if (app.popup.message[id]) {
|
|
29
|
+
if ((typeof app.popup.message[id]) === "function") {
|
|
30
|
+
if (id === request.method) {
|
|
31
|
+
app.popup.message[id](request.data);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/* */
|
|
38
|
+
if (request.path === "page-to-background") {
|
|
39
|
+
for (let id in app.page.message) {
|
|
40
|
+
if (app.page.message[id]) {
|
|
41
|
+
if ((typeof app.page.message[id]) === "function") {
|
|
42
|
+
if (id === request.method) {
|
|
43
|
+
let a = request.data || {};
|
|
44
|
+
if (sender) {
|
|
45
|
+
a.frameId = sender.frameId;
|
|
46
|
+
/* */
|
|
47
|
+
if (sender.tab) {
|
|
48
|
+
if (a.tabId === undefined) a.tabId = sender.tab.id;
|
|
49
|
+
if (a.title === undefined) a.title = sender.tab.title ? sender.tab.title : '';
|
|
50
|
+
if (a.top === undefined) a.top = sender.tab.url ? sender.tab.url : (sender.url ? sender.url : '');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/* */
|
|
54
|
+
app.page.message[id](a);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
app.on.connect(function (port) {
|
|
64
|
+
if (port) {
|
|
65
|
+
if (port.name) {
|
|
66
|
+
if (port.name in app) {
|
|
67
|
+
app[port.name].port = port;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/* */
|
|
71
|
+
port.onDisconnect.addListener(function (e) {
|
|
72
|
+
app.storage.load(function () {
|
|
73
|
+
if (e) {
|
|
74
|
+
if (e.name) {
|
|
75
|
+
if (e.name in app) {
|
|
76
|
+
app[e.name].port = null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
/* */
|
|
83
|
+
port.onMessage.addListener(function (e) {
|
|
84
|
+
app.storage.load(function () {
|
|
85
|
+
if (e) {
|
|
86
|
+
if (e.path) {
|
|
87
|
+
if (e.port) {
|
|
88
|
+
if (e.port in app) {
|
|
89
|
+
if (e.path === (e.port + "-to-background")) {
|
|
90
|
+
for (let id in app[e.port].message) {
|
|
91
|
+
if (app[e.port].message[id]) {
|
|
92
|
+
if ((typeof app[e.port].message[id]) === "function") {
|
|
93
|
+
if (id === e.method) {
|
|
94
|
+
app[e.port].message[id](e.data);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../src/fingerprinting/anti-webgpu/lib/runtime.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"update_url": "https://clients2.google.com/service/update2/crx",
|
|
3
|
+
|
|
4
|
+
"version": "0.1.1",
|
|
5
|
+
"manifest_version": 3,
|
|
6
|
+
"offline_enabled": true,
|
|
7
|
+
"name": "WebGPU Fingerprint Defender",
|
|
8
|
+
"homepage_url": "https://mybrowseraddon.com/webgpu-defender.html",
|
|
9
|
+
"description": "Defending against WebGPU fingerprinting by reporting a fake value.",
|
|
10
|
+
"commands": {
|
|
11
|
+
"_execute_action": {}
|
|
12
|
+
},
|
|
13
|
+
"background": {
|
|
14
|
+
"service_worker": "background.js"
|
|
15
|
+
},
|
|
16
|
+
"permissions": [
|
|
17
|
+
"storage",
|
|
18
|
+
"contextMenus",
|
|
19
|
+
"notifications"
|
|
20
|
+
],
|
|
21
|
+
"action": {
|
|
22
|
+
"default_popup": "data/popup/popup.html",
|
|
23
|
+
"default_title": "WebGPU Fingerprint Defender",
|
|
24
|
+
"default_icon": {
|
|
25
|
+
"16": "data/icons/16.png",
|
|
26
|
+
"32": "data/icons/32.png",
|
|
27
|
+
"48": "data/icons/48.png",
|
|
28
|
+
"64": "data/icons/64.png"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"content_scripts": [
|
|
32
|
+
{
|
|
33
|
+
"world": "MAIN",
|
|
34
|
+
"all_frames": true,
|
|
35
|
+
"matches": ["*://*/*"],
|
|
36
|
+
"match_about_blank": true,
|
|
37
|
+
"run_at": "document_start",
|
|
38
|
+
"match_origin_as_fallback": true,
|
|
39
|
+
"js": ["data/content_script/page_context/inject.js"]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"world": "ISOLATED",
|
|
43
|
+
"all_frames": true,
|
|
44
|
+
"matches": ["*://*/*"],
|
|
45
|
+
"match_about_blank": true,
|
|
46
|
+
"run_at": "document_start",
|
|
47
|
+
"match_origin_as_fallback": true,
|
|
48
|
+
"js": ["data/content_script/inject.js"]
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"icons": {
|
|
52
|
+
"16": "data/icons/16.png",
|
|
53
|
+
"32": "data/icons/32.png",
|
|
54
|
+
"48": "data/icons/48.png",
|
|
55
|
+
"64": "data/icons/64.png",
|
|
56
|
+
"128": "data/icons/128.png"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -1,3 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced CDP Fingerprint Injector for 2025
|
|
3
|
+
*
|
|
4
|
+
* This module provides advanced fingerprint spoofing and anti-detection capabilities
|
|
5
|
+
* specifically designed to bypass hardcore fingerprinting techniques used in 2025.
|
|
6
|
+
*
|
|
7
|
+
* Key Features:
|
|
8
|
+
*
|
|
9
|
+
* 1. **WebGPU Fingerprinting Protection**:
|
|
10
|
+
* - Spoofs GPU adapter information and capabilities
|
|
11
|
+
* - Fakes GPU uptime to appear as if the GPU has been running for 24-72 hours
|
|
12
|
+
* - Intercepts timestamp queries to prevent timing-based detection
|
|
13
|
+
*
|
|
14
|
+
* 2. **Platform Consistency (1:1 Fingerprinting)**:
|
|
15
|
+
* - Ensures all browser properties match the specified platform (Win32, MacIntel, Linux)
|
|
16
|
+
* - Synchronizes navigator properties, screen metrics, and WebGL/WebGPU values
|
|
17
|
+
* - Platform-specific GPU configurations for realistic fingerprints
|
|
18
|
+
*
|
|
19
|
+
* 3. **Runtime.enable Bypass**:
|
|
20
|
+
* - Prevents CDP detection through console.log(Error) technique
|
|
21
|
+
* - Intercepts and blocks Runtime.enable calls
|
|
22
|
+
* - Modifies Error stack traces to hide automation
|
|
23
|
+
*
|
|
24
|
+
* 4. **Advanced Canvas Protection**:
|
|
25
|
+
* - Adds controlled noise to canvas operations
|
|
26
|
+
* - Protects against both 2D and WebGL canvas fingerprinting
|
|
27
|
+
* - Includes font measurement variations
|
|
28
|
+
*
|
|
29
|
+
* 5. **WebRTC IP Leak Prevention**:
|
|
30
|
+
* - Filters STUN servers to prevent IP leaks
|
|
31
|
+
* - Provides fake but consistent device IDs
|
|
32
|
+
* - Modifies ICE candidates and statistics
|
|
33
|
+
*
|
|
34
|
+
* 6. **Audio Context Spoofing**:
|
|
35
|
+
* - Adds noise to audio processing to prevent fingerprinting
|
|
36
|
+
* - Works with both AudioContext and OfflineAudioContext
|
|
37
|
+
*
|
|
38
|
+
* 7. **Client Rect Variations**:
|
|
39
|
+
* - Adds small variations to getBoundingClientRect results
|
|
40
|
+
* - Makes automation harder to detect through DOM measurements
|
|
41
|
+
*
|
|
42
|
+
* 8. **Mouse Movement Humanization**:
|
|
43
|
+
* - Generates bezier curve movements instead of straight lines
|
|
44
|
+
* - Adds random variations to mouse paths
|
|
45
|
+
*
|
|
46
|
+
* Usage:
|
|
47
|
+
* ```typescript
|
|
48
|
+
* await CdpFingerprintInjector.injectFingerprint(page, fingerprint, {
|
|
49
|
+
* enableAdvancedStealth: true,
|
|
50
|
+
* bypassRuntimeEnable: true,
|
|
51
|
+
* platform: 'Win32', // Spoof as Windows for better evasion on Apify Linux
|
|
52
|
+
* spoofWebGL: true,
|
|
53
|
+
* spoofAudioContext: true,
|
|
54
|
+
* spoofClientRects: true,
|
|
55
|
+
* humanizeInteractions: true,
|
|
56
|
+
* spoofFonts: true, // New: Hide Linux-specific fonts
|
|
57
|
+
* spoofPerformance: true, // New: Windows-like timing characteristics
|
|
58
|
+
* spoofLocale: true, // New: Consistent Windows locale formatting
|
|
59
|
+
* useFingerprintDefaults: true // Use fingerprint-generator Windows values
|
|
60
|
+
* });
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
1
63
|
import type { BrowserFingerprintWithHeaders } from 'fingerprint-generator';
|
|
2
64
|
import type CdpPage from "../page.js";
|
|
3
65
|
interface Viewport {
|
|
@@ -12,18 +74,40 @@ interface AttachOptions {
|
|
|
12
74
|
proxyUrl?: string;
|
|
13
75
|
detectTimezone?: boolean;
|
|
14
76
|
viewport?: Viewport;
|
|
77
|
+
enableAdvancedStealth?: boolean;
|
|
78
|
+
bypassRuntimeEnable?: boolean;
|
|
79
|
+
humanizeInteractions?: boolean;
|
|
80
|
+
spoofWebGL?: boolean;
|
|
81
|
+
spoofAudioContext?: boolean;
|
|
82
|
+
spoofClientRects?: boolean;
|
|
83
|
+
maskAutomationFlags?: boolean;
|
|
84
|
+
platform?: 'Win32' | 'MacIntel' | 'Linux x86_64';
|
|
85
|
+
spoofFonts?: boolean;
|
|
86
|
+
spoofPerformance?: boolean;
|
|
87
|
+
spoofLocale?: boolean;
|
|
88
|
+
useExperimentalFingerprints?: boolean;
|
|
89
|
+
useFingerprintDefaults?: boolean;
|
|
15
90
|
}
|
|
16
91
|
export declare class CdpFingerprintInjector {
|
|
17
92
|
private injector;
|
|
18
93
|
private page;
|
|
19
94
|
constructor(page: CdpPage);
|
|
95
|
+
/**
|
|
96
|
+
* Get recommended settings for Apify platform
|
|
97
|
+
* These settings are optimized for running headful Chrome on Apify (Linux)
|
|
98
|
+
* but spoofed to appear as Windows for better anti-bot evasion
|
|
99
|
+
*/
|
|
100
|
+
static getApifyRecommendedSettings(): AttachOptions;
|
|
20
101
|
static injectFingerprint(page: CdpPage, fingerprint: BrowserFingerprintWithHeaders, options?: AttachOptions): Promise<void>;
|
|
21
102
|
private setViewport;
|
|
22
103
|
private setExtraHTTPHeaders;
|
|
23
104
|
private getTimezoneFromIp;
|
|
24
105
|
private setTimezoneOverride;
|
|
25
|
-
private createStealthScript;
|
|
26
106
|
private injectStealthProtections;
|
|
107
|
+
/**
|
|
108
|
+
* Extract relevant data from fingerprint for overrides
|
|
109
|
+
*/
|
|
110
|
+
private extractFingerprintData;
|
|
27
111
|
attachToPage(browserFingerprintWithHeaders: BrowserFingerprintWithHeaders, options?: AttachOptions): Promise<void>;
|
|
28
112
|
}
|
|
29
113
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint-injector.d.ts","sourceRoot":"","sources":["../../src/fingerprinting/fingerprint-injector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fingerprint-injector.d.ts","sourceRoot":"","sources":["../../src/fingerprinting/fingerprint-injector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAGH,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC;AAoBtC,UAAU,QAAQ;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,aAAa;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAEjD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CACpC;AAMD,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,IAAI,CAAU;gBAEV,IAAI,EAAE,OAAO;IAKzB;;;;OAIG;IACH,MAAM,CAAC,2BAA2B,IAAI,aAAa;WAwBtC,iBAAiB,CAC1B,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,6BAA6B,EAC1C,OAAO,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC,IAAI,CAAC;YAKF,WAAW;YAaX,mBAAmB;YAInB,iBAAiB;YAcjB,mBAAmB;YAMnB,wBAAwB;IAKtC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqCjB,YAAY,CACrB,6BAA6B,EAAE,6BAA6B,EAC5D,OAAO,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC,IAAI,CAAC;CAyHnB"}
|
|
@@ -1,6 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced CDP Fingerprint Injector for 2025
|
|
3
|
+
*
|
|
4
|
+
* This module provides advanced fingerprint spoofing and anti-detection capabilities
|
|
5
|
+
* specifically designed to bypass hardcore fingerprinting techniques used in 2025.
|
|
6
|
+
*
|
|
7
|
+
* Key Features:
|
|
8
|
+
*
|
|
9
|
+
* 1. **WebGPU Fingerprinting Protection**:
|
|
10
|
+
* - Spoofs GPU adapter information and capabilities
|
|
11
|
+
* - Fakes GPU uptime to appear as if the GPU has been running for 24-72 hours
|
|
12
|
+
* - Intercepts timestamp queries to prevent timing-based detection
|
|
13
|
+
*
|
|
14
|
+
* 2. **Platform Consistency (1:1 Fingerprinting)**:
|
|
15
|
+
* - Ensures all browser properties match the specified platform (Win32, MacIntel, Linux)
|
|
16
|
+
* - Synchronizes navigator properties, screen metrics, and WebGL/WebGPU values
|
|
17
|
+
* - Platform-specific GPU configurations for realistic fingerprints
|
|
18
|
+
*
|
|
19
|
+
* 3. **Runtime.enable Bypass**:
|
|
20
|
+
* - Prevents CDP detection through console.log(Error) technique
|
|
21
|
+
* - Intercepts and blocks Runtime.enable calls
|
|
22
|
+
* - Modifies Error stack traces to hide automation
|
|
23
|
+
*
|
|
24
|
+
* 4. **Advanced Canvas Protection**:
|
|
25
|
+
* - Adds controlled noise to canvas operations
|
|
26
|
+
* - Protects against both 2D and WebGL canvas fingerprinting
|
|
27
|
+
* - Includes font measurement variations
|
|
28
|
+
*
|
|
29
|
+
* 5. **WebRTC IP Leak Prevention**:
|
|
30
|
+
* - Filters STUN servers to prevent IP leaks
|
|
31
|
+
* - Provides fake but consistent device IDs
|
|
32
|
+
* - Modifies ICE candidates and statistics
|
|
33
|
+
*
|
|
34
|
+
* 6. **Audio Context Spoofing**:
|
|
35
|
+
* - Adds noise to audio processing to prevent fingerprinting
|
|
36
|
+
* - Works with both AudioContext and OfflineAudioContext
|
|
37
|
+
*
|
|
38
|
+
* 7. **Client Rect Variations**:
|
|
39
|
+
* - Adds small variations to getBoundingClientRect results
|
|
40
|
+
* - Makes automation harder to detect through DOM measurements
|
|
41
|
+
*
|
|
42
|
+
* 8. **Mouse Movement Humanization**:
|
|
43
|
+
* - Generates bezier curve movements instead of straight lines
|
|
44
|
+
* - Adds random variations to mouse paths
|
|
45
|
+
*
|
|
46
|
+
* Usage:
|
|
47
|
+
* ```typescript
|
|
48
|
+
* await CdpFingerprintInjector.injectFingerprint(page, fingerprint, {
|
|
49
|
+
* enableAdvancedStealth: true,
|
|
50
|
+
* bypassRuntimeEnable: true,
|
|
51
|
+
* platform: 'Win32', // Spoof as Windows for better evasion on Apify Linux
|
|
52
|
+
* spoofWebGL: true,
|
|
53
|
+
* spoofAudioContext: true,
|
|
54
|
+
* spoofClientRects: true,
|
|
55
|
+
* humanizeInteractions: true,
|
|
56
|
+
* spoofFonts: true, // New: Hide Linux-specific fonts
|
|
57
|
+
* spoofPerformance: true, // New: Windows-like timing characteristics
|
|
58
|
+
* spoofLocale: true, // New: Consistent Windows locale formatting
|
|
59
|
+
* useFingerprintDefaults: true // Use fingerprint-generator Windows values
|
|
60
|
+
* });
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
1
63
|
import { log } from 'crawlee';
|
|
2
64
|
import { FingerprintInjector } from 'fingerprint-injector';
|
|
3
65
|
import { gotScraping } from 'got-scraping';
|
|
66
|
+
import { createStealthScript, createWebGLSpoofingScript, createAudioFingerprintSpoofingScript, createAdvancedCanvasProtectionScript, createClientRectSpoofingScript, createWebRTCSpoofingScript, createWebGPUSpoofingScript, createPlatformConsistencyScript, setupMouseMovementHumanization, setupRuntimeEnableBypass, createFontSpoofingScript, createPerformanceSpoofingScript, createLocaleSpoofingScript, createUAClientHintsSpoofingScript, } from './fingerprint-overrides/index.js';
|
|
4
67
|
export class CdpFingerprintInjector {
|
|
5
68
|
constructor(page) {
|
|
6
69
|
Object.defineProperty(this, "injector", {
|
|
@@ -18,6 +81,34 @@ export class CdpFingerprintInjector {
|
|
|
18
81
|
this.injector = new FingerprintInjector();
|
|
19
82
|
this.page = page;
|
|
20
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Get recommended settings for Apify platform
|
|
86
|
+
* These settings are optimized for running headful Chrome on Apify (Linux)
|
|
87
|
+
* but spoofed to appear as Windows for better anti-bot evasion
|
|
88
|
+
*/
|
|
89
|
+
static getApifyRecommendedSettings() {
|
|
90
|
+
return {
|
|
91
|
+
enableAdvancedStealth: true,
|
|
92
|
+
bypassRuntimeEnable: true,
|
|
93
|
+
platform: 'Win32', // Spoof as Windows instead of Linux for better evasion
|
|
94
|
+
spoofWebGL: true,
|
|
95
|
+
spoofAudioContext: true,
|
|
96
|
+
spoofClientRects: true,
|
|
97
|
+
humanizeInteractions: true,
|
|
98
|
+
detectTimezone: true, // Auto-detect timezone from proxy
|
|
99
|
+
// New advanced spoofing options for 2025
|
|
100
|
+
spoofFonts: true,
|
|
101
|
+
spoofPerformance: true,
|
|
102
|
+
spoofLocale: true,
|
|
103
|
+
useFingerprintDefaults: true, // Use fingerprint-generator Windows values
|
|
104
|
+
viewport: {
|
|
105
|
+
width: 1920,
|
|
106
|
+
height: 1080,
|
|
107
|
+
deviceScaleFactor: 1,
|
|
108
|
+
mobile: false,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
21
112
|
static async injectFingerprint(page, fingerprint, options) {
|
|
22
113
|
const handler = new CdpFingerprintInjector(page);
|
|
23
114
|
return handler.attachToPage(fingerprint, options);
|
|
@@ -55,96 +146,42 @@ export class CdpFingerprintInjector {
|
|
|
55
146
|
timezoneId: timezone,
|
|
56
147
|
});
|
|
57
148
|
}
|
|
58
|
-
createStealthScript() {
|
|
59
|
-
return `
|
|
60
|
-
(() => {
|
|
61
|
-
'use strict';
|
|
62
|
-
|
|
63
|
-
// Helper functions
|
|
64
|
-
const wrapNative = (fnName) => {
|
|
65
|
-
return function() {
|
|
66
|
-
return \`function \${fnName}() { [native code] }\`;
|
|
67
|
-
};
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
const hideErrorStack = () => {
|
|
71
|
-
const originalStackDescriptor = Object.getOwnPropertyDescriptor(Error.prototype, 'stack');
|
|
72
|
-
if (originalStackDescriptor?.configurable) {
|
|
73
|
-
Object.defineProperty(Error.prototype, 'stack', {
|
|
74
|
-
get() {
|
|
75
|
-
return 'Error\\n <anonymous>:1:1';
|
|
76
|
-
},
|
|
77
|
-
set() {},
|
|
78
|
-
configurable: false,
|
|
79
|
-
enumerable: false
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
const maskedStackGetter = Object.getOwnPropertyDescriptor(Error.prototype, 'stack').get;
|
|
83
|
-
if (maskedStackGetter) {
|
|
84
|
-
maskedStackGetter.toString = wrapNative('get stack');
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
const patchConsole = () => {
|
|
90
|
-
const _console = window.console;
|
|
91
|
-
if (!_console || typeof _console !== 'object') return;
|
|
92
|
-
|
|
93
|
-
const transformArg = (arg) => {
|
|
94
|
-
try {
|
|
95
|
-
return arg && typeof arg === 'object' ? JSON.stringify(arg) : String(arg);
|
|
96
|
-
} catch {
|
|
97
|
-
return String(arg);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
const createPatchedMethod = (originalFn, methodName) => {
|
|
102
|
-
const newFn = function(...args) {
|
|
103
|
-
const transformedArgs = args.map(transformArg);
|
|
104
|
-
return Function.prototype.apply.call(originalFn, _console, transformedArgs);
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
Object.defineProperty(newFn, 'toString', {
|
|
108
|
-
value: wrapNative(methodName),
|
|
109
|
-
writable: false,
|
|
110
|
-
enumerable: false,
|
|
111
|
-
configurable: true
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
return newFn;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
['log', 'warn', 'error', 'info', 'debug'].forEach(method => {
|
|
118
|
-
try {
|
|
119
|
-
const originalFn = _console[method];
|
|
120
|
-
if (originalFn && typeof originalFn === 'function') {
|
|
121
|
-
Object.defineProperty(_console, method, {
|
|
122
|
-
value: createPatchedMethod(originalFn, method),
|
|
123
|
-
writable: true,
|
|
124
|
-
enumerable: false,
|
|
125
|
-
configurable: true
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
} catch {}
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
Object.defineProperty(window, 'console', {
|
|
132
|
-
value: _console,
|
|
133
|
-
configurable: true,
|
|
134
|
-
writable: false,
|
|
135
|
-
enumerable: false
|
|
136
|
-
});
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
// Initialize protections
|
|
140
|
-
hideErrorStack();
|
|
141
|
-
patchConsole();
|
|
142
|
-
})();`;
|
|
143
|
-
}
|
|
144
149
|
async injectStealthProtections() {
|
|
145
|
-
const stealthScript =
|
|
150
|
+
const stealthScript = createStealthScript();
|
|
146
151
|
await this.page.client.Page.addScriptToEvaluateOnNewDocument({ source: stealthScript });
|
|
147
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Extract relevant data from fingerprint for overrides
|
|
155
|
+
*/
|
|
156
|
+
extractFingerprintData(fingerprint) {
|
|
157
|
+
const webglConfig = {};
|
|
158
|
+
const platformConfig = {};
|
|
159
|
+
// Extract WebGL data if available
|
|
160
|
+
if (fingerprint.webgl) {
|
|
161
|
+
webglConfig.vendor = fingerprint.webgl.vendor;
|
|
162
|
+
webglConfig.renderer = fingerprint.webgl.renderer;
|
|
163
|
+
webglConfig.vendorUnmasked = fingerprint.webgl.vendorUnmasked;
|
|
164
|
+
webglConfig.rendererUnmasked = fingerprint.webgl.rendererUnmasked;
|
|
165
|
+
}
|
|
166
|
+
// Extract platform data if available
|
|
167
|
+
if (fingerprint.navigator) {
|
|
168
|
+
platformConfig.platform = fingerprint.navigator.platform;
|
|
169
|
+
platformConfig.vendor = fingerprint.navigator.vendor;
|
|
170
|
+
platformConfig.vendorSub = fingerprint.navigator.vendorSub;
|
|
171
|
+
platformConfig.productSub = fingerprint.navigator.productSub;
|
|
172
|
+
platformConfig.hardwareConcurrency = fingerprint.navigator.hardwareConcurrency;
|
|
173
|
+
platformConfig.maxTouchPoints = fingerprint.navigator.maxTouchPoints;
|
|
174
|
+
platformConfig.language = fingerprint.navigator.language;
|
|
175
|
+
platformConfig.languages = fingerprint.navigator.languages;
|
|
176
|
+
platformConfig.oscpu = fingerprint.navigator.oscpu;
|
|
177
|
+
}
|
|
178
|
+
if (fingerprint.screen) {
|
|
179
|
+
platformConfig.devicePixelRatio = fingerprint.screen.devicePixelRatio;
|
|
180
|
+
platformConfig.screenDepth = fingerprint.screen.pixelDepth;
|
|
181
|
+
platformConfig.colorDepth = fingerprint.screen.colorDepth;
|
|
182
|
+
}
|
|
183
|
+
return { webglConfig, platformConfig };
|
|
184
|
+
}
|
|
148
185
|
async attachToPage(browserFingerprintWithHeaders, options) {
|
|
149
186
|
const { fingerprint, headers } = browserFingerprintWithHeaders;
|
|
150
187
|
const shouldFetchTimezone = options?.timezone || options?.detectTimezone;
|
|
@@ -163,15 +200,76 @@ export class CdpFingerprintInjector {
|
|
|
163
200
|
// Main script from fingerprint-injector
|
|
164
201
|
// @ts-expect-error Using private
|
|
165
202
|
const fingerprintScript = this.injector.getInjectableFingerprintFunction(enhancedFingerprint);
|
|
203
|
+
// Prepare all scripts to inject
|
|
204
|
+
const scriptsToInject = [fingerprintScript];
|
|
205
|
+
// Always inject base stealth protections
|
|
206
|
+
await this.injectStealthProtections();
|
|
207
|
+
// Extract fingerprint data if we should use it
|
|
208
|
+
const shouldUseFingerprintData = options?.useFingerprintDefaults !== false;
|
|
209
|
+
const { webglConfig, platformConfig } = shouldUseFingerprintData
|
|
210
|
+
? this.extractFingerprintData(fingerprint)
|
|
211
|
+
: { webglConfig: undefined, platformConfig: undefined };
|
|
212
|
+
// Add advanced features based on options
|
|
213
|
+
if (options?.enableAdvancedStealth !== false) {
|
|
214
|
+
// UA Client Hints spoofing (NEW - 2025)
|
|
215
|
+
scriptsToInject.push(createUAClientHintsSpoofingScript(options?.platform));
|
|
216
|
+
// WebGL spoofing
|
|
217
|
+
if (options?.spoofWebGL !== false) {
|
|
218
|
+
scriptsToInject.push(createWebGLSpoofingScript(shouldUseFingerprintData ? webglConfig : undefined));
|
|
219
|
+
}
|
|
220
|
+
// Audio fingerprint spoofing
|
|
221
|
+
if (options?.spoofAudioContext !== false) {
|
|
222
|
+
scriptsToInject.push(createAudioFingerprintSpoofingScript());
|
|
223
|
+
}
|
|
224
|
+
// Canvas protection
|
|
225
|
+
scriptsToInject.push(createAdvancedCanvasProtectionScript());
|
|
226
|
+
// Client rect spoofing
|
|
227
|
+
if (options?.spoofClientRects !== false) {
|
|
228
|
+
scriptsToInject.push(createClientRectSpoofingScript());
|
|
229
|
+
}
|
|
230
|
+
// WebRTC spoofing
|
|
231
|
+
scriptsToInject.push(createWebRTCSpoofingScript());
|
|
232
|
+
// WebGPU spoofing (more aggressive when experimental fingerprints enabled)
|
|
233
|
+
scriptsToInject.push(createWebGPUSpoofingScript(options?.useExperimentalFingerprints));
|
|
234
|
+
// Font spoofing (2025)
|
|
235
|
+
if (options?.spoofFonts !== false) {
|
|
236
|
+
scriptsToInject.push(createFontSpoofingScript());
|
|
237
|
+
}
|
|
238
|
+
// Performance spoofing (2025)
|
|
239
|
+
if (options?.spoofPerformance !== false) {
|
|
240
|
+
scriptsToInject.push(createPerformanceSpoofingScript());
|
|
241
|
+
}
|
|
242
|
+
// Locale spoofing (2025)
|
|
243
|
+
if (options?.spoofLocale !== false) {
|
|
244
|
+
scriptsToInject.push(createLocaleSpoofingScript());
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Apply platform consistency script
|
|
248
|
+
if (options?.platform) {
|
|
249
|
+
scriptsToInject.push(createPlatformConsistencyScript(options.platform, shouldUseFingerprintData ? platformConfig : undefined));
|
|
250
|
+
}
|
|
251
|
+
// Inject all scripts
|
|
166
252
|
await Promise.all([
|
|
167
253
|
this.setViewport(options?.viewport),
|
|
168
254
|
this.setExtraHTTPHeaders(filteredHeaders),
|
|
169
|
-
this.page.client.Page.addScriptToEvaluateOnNewDocument({ source:
|
|
170
|
-
this.injectStealthProtections(),
|
|
255
|
+
...scriptsToInject.map(async (script) => this.page.client.Page.addScriptToEvaluateOnNewDocument({ source: script })),
|
|
171
256
|
]);
|
|
172
|
-
|
|
257
|
+
// Setup mouse movement humanization if requested
|
|
258
|
+
if (options?.humanizeInteractions) {
|
|
259
|
+
await setupMouseMovementHumanization(this.page.client);
|
|
260
|
+
}
|
|
261
|
+
// Additional CDP-level protections
|
|
262
|
+
if (options?.bypassRuntimeEnable) {
|
|
263
|
+
await setupRuntimeEnableBypass(this.page.client);
|
|
264
|
+
}
|
|
265
|
+
log.info('Enhanced fingerprint attached with settings:', {
|
|
173
266
|
proxy: options?.proxyUrl,
|
|
174
267
|
timezone,
|
|
268
|
+
advancedStealth: options?.enableAdvancedStealth !== false,
|
|
269
|
+
humanizeInteractions: options?.humanizeInteractions,
|
|
270
|
+
bypassRuntimeEnable: options?.bypassRuntimeEnable,
|
|
271
|
+
platform: options?.platform,
|
|
272
|
+
useFingerprintDefaults: options?.useFingerprintDefaults,
|
|
175
273
|
});
|
|
176
274
|
}
|
|
177
275
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint-injector.js","sourceRoot":"","sources":["../../src/fingerprinting/fingerprint-injector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"fingerprint-injector.js","sourceRoot":"","sources":["../../src/fingerprinting/fingerprint-injector.ts"],"names":[],"mappings":"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"}
|