@@ -74,7 +74,6 @@ author: BlazeFTL
7474 window.addEventListener('load', () => { observer.disconnect(); Document.prototype.createElement = _origCreate; }, { once: true });
7575})();
7676
77-
7877/// blaze-set-useragent.js
7978/// alias blaze-sua.js
8079(function() {
@@ -113,113 +112,40 @@ author: BlazeFTL
113112 } catch(e) {}
114113
115114 // Spoof navigator.userAgentData (Chrome-only modern UA hints API)
116- const uadBrands = [
117- { brand: 'Google Chrome', version: '137' },
118- { brand: 'Chromium', version: '137' },
119- { brand: 'Not/A)Brand', version: '24' },
120- ];
121- const uadBrandsFull = [
122- { brand: 'Google Chrome', version: '137.0.0.0' },
123- { brand: 'Chromium', version: '137.0.0.0' },
124- { brand: 'Not/A)Brand', version: '24.0.0.0' },
125- ];
126- const uadObj = {
127- brands: uadBrands,
128- mobile: isMobile,
129- platform: isMobile ? 'Android' : 'Windows',
130- getHighEntropyValues: (hints) => Promise.resolve({
131- brands: uadBrands,
132- mobile: isMobile,
133- platform: isMobile ? 'Android' : 'Windows',
134- platformVersion: isMobile ? '10.0.0' : '15.0.0',
135- architecture: isMobile ? 'arm' : 'x86',
136- bitness: '64',
137- model: '',
138- uaFullVersion: '137.0.0.0',
139- fullVersionList: uadBrandsFull,
140- }),
141- toJSON: () => ({}),
142- };
143-
144- try {
145- Object.defineProperty(navigator, 'userAgentData', {
146- get: () => uadObj,
147- configurable: true,
148- });
149- } catch(e) {}
150-
151- // Sec-CH-UA header values
152- const secUA = '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"';
153- const secUAMobile = isMobile ? '?1' : '?0';
154- const secUAPlatform = isMobile ? '"Android"' : '"Windows"';
155- const secUAFullVer = '"137.0.0.0"';
156- const secUAPlatformVer = isMobile ? '"10.0.0"' : '"15.0.0"';
157- const secUAArch = isMobile ? '"arm"' : '"x86"';
158- const secUABitness = '"64"';
159- const secUAModel = '""';
160- const secUAFullVerList = '"Google Chrome";v="137.0.0.0", "Chromium";v="137.0.0.0", "Not/A)Brand";v="24.0.0.0"';
161-
162- function injectSecHeaders(headers) {
163- const set = (k, v) => {
164- try { headers.set(k, v); } catch(e) {}
165- };
166- set('sec-ch-ua', secUA);
167- set('sec-ch-ua-mobile', secUAMobile);
168- set('sec-ch-ua-platform', secUAPlatform);
169- set('sec-ch-ua-full-version', secUAFullVer);
170- set('sec-ch-ua-platform-version', secUAPlatformVer);
171- set('sec-ch-ua-arch', secUAArch);
172- set('sec-ch-ua-bitness', secUABitness);
173- set('sec-ch-ua-model', secUAModel);
174- set('sec-ch-ua-full-version-list', secUAFullVerList);
175- set('user-agent', spoofUA);
115+ if (navigator.userAgentData !== undefined) {
116+ try {
117+ Object.defineProperty(navigator, 'userAgentData', {
118+ get: () => ({
119+ brands: [
120+ { brand: 'Google Chrome', version: '137' },
121+ { brand: 'Chromium', version: '137' },
122+ { brand: 'Not/A)Brand', version: '24' },
123+ ],
124+ mobile: isMobile,
125+ platform: isMobile ? 'Android' : 'Windows',
126+ getHighEntropyValues: (hints) => Promise.resolve({
127+ brands: [
128+ { brand: 'Google Chrome', version: '137' },
129+ { brand: 'Chromium', version: '137' },
130+ { brand: 'Not/A)Brand', version: '24' },
131+ ],
132+ mobile: isMobile,
133+ platform: isMobile ? 'Android' : 'Windows',
134+ platformVersion: isMobile ? '10.0.0' : '15.0.0',
135+ architecture: isMobile ? 'arm' : 'x86',
136+ bitness: '64',
137+ model: isMobile ? '' : '',
138+ uaFullVersion: '137.0.0.0',
139+ fullVersionList: [
140+ { brand: 'Google Chrome', version: '137.0.0.0' },
141+ { brand: 'Chromium', version: '137.0.0.0' },
142+ { brand: 'Not/A)Brand', version: '24.0.0.0' },
143+ ],
144+ }),
145+ toJSON: () => ({}),
146+ }),
147+ configurable: true,
148+ });
149+ } catch(e) {}
176150 }
177-
178- // Proxy fetch to inject Sec-CH-UA headers
179- const _fetch = window.fetch;
180- window.fetch = new Proxy(_fetch, {
181- apply(target, thisArg, args) {
182- try {
183- let [input, init] = args;
184- init = init ? Object.assign({}, init) : {};
185- const headers = new Headers(init.headers || {});
186- injectSecHeaders(headers);
187- init.headers = headers;
188- args = [input, init];
189- } catch(e) {}
190- return Reflect.apply(target, thisArg, args);
191- }
192- });
193-
194- // Proxy XMLHttpRequest.setRequestHeader to inject Sec-CH-UA headers on send
195- const _open = XMLHttpRequest.prototype.open;
196- const _send = XMLHttpRequest.prototype.send;
197- const _setHeader = XMLHttpRequest.prototype.setRequestHeader;
198-
199- XMLHttpRequest.prototype.open = new Proxy(_open, {
200- apply(target, thisArg, args) {
201- thisArg._blazeInjectUA = true;
202- return Reflect.apply(target, thisArg, args);
203- }
204- });
205-
206- XMLHttpRequest.prototype.send = new Proxy(_send, {
207- apply(target, thisArg, args) {
208- if (thisArg._blazeInjectUA) {
209- const setH = (k, v) => {
210- try { _setHeader.call(thisArg, k, v); } catch(e) {}
211- };
212- setH('sec-ch-ua', secUA);
213- setH('sec-ch-ua-mobile', secUAMobile);
214- setH('sec-ch-ua-platform', secUAPlatform);
215- setH('sec-ch-ua-full-version', secUAFullVer);
216- setH('sec-ch-ua-platform-version', secUAPlatformVer);
217- setH('sec-ch-ua-arch', secUAArch);
218- setH('sec-ch-ua-bitness', secUABitness);
219- setH('sec-ch-ua-model', secUAModel);
220- setH('sec-ch-ua-full-version-list', secUAFullVerList);
221- }
222- return Reflect.apply(target, thisArg, args);
223- }
224- });
225151})();
0 commit comments