Sora 指纹随机化器(Anti-Fingerprint Tracker)

[]

Sora 指纹随机化器(Anti-Fingerprint Tracker)- 油猴脚本说明文档

一、脚本概述

该脚本是一款针对 Sora 2 工具生态(如 Sora 2 一键去水印工具)设计的隐私保护油猴脚本,核心功能为随机化浏览器指纹,对抗 FingerprintJS 等追踪技术,每次页面请求或加载时自动变换指纹信息,避免用户被网站通过固定指纹唯一标识和追踪。

基础信息 详情
脚本名称 Sora 指纹随机化器 - Anti-Fingerprint Tracker
版本 2.0.0
作者 Claude 4.0 sonnet
核心目标 阻止 FingerprintJS 追踪,动态生成随机浏览器指纹
关联工具 Sora 2 一键去水印(对应地址:https://nosorawm.app/zh
依赖扩展 Tampermonkey(支持 Chrome、Firefox、Edge 等主流浏览器)

二、核心功能

脚本通过多维度拦截与劫持机制,实现全链路指纹保护,关键功能如下:

  1. 动态指纹生成

    • 支持两种指纹格式:50% 概率生成 UUID v4(优先调用浏览器 crypto.randomUUID),50% 概率生成“时间戳+随机字符串”格式(降级方案)。
    • 可配置“每次页面加载是否重新生成指纹”(默认开启),确保指纹无持续性。
  2. 存储层劫持

    • 重写 localStoragesetItemgetItemremoveItem 方法,拦截目标指纹键(默认 sorawm:fingerprint)的读写操作,强制替换为随机指纹,阻止指纹持久化存储。
  3. 全局变量保护

    • 劫持 window.__cachedFingerprintId 全局变量:读取时动态生成新指纹,写入时直接忽略,防止网站通过全局变量缓存指纹。
  4. 追踪库拦截

    • 自动识别并拦截 FingerprintJS 官方 CDN(openfpcdn.io/fingerprintjs)的加载请求:
      • 拦截 import 动态加载,返回模拟的 FingerprintJS 对象(包含虚假 visitorId 和置信度)。
      • 拦截 fetch 请求,直接拒绝 FingerprintJS 相关资源加载。
  5. 网络请求篡改

    • 拦截包含 /api/parse 路径的请求(两种请求方式全覆盖):
      • fetch 请求:解析请求体,替换 fingerprint 参数为随机值。
      • XMLHttpRequest 请求:重写 opensend 方法,篡改请求体中的指纹信息。
  6. 残留指纹清理

    • 脚本启动时自动清理本地存储的旧指纹(删除 localStorage 中的目标键、删除全局指纹变量),确保初始状态无指纹残留。

三、适用场景

  1. 默认生效网站:仅对 https://nosorawm.app/*(Sora 2 一键去水印工具)生效(通过脚本 @match 配置限定)。
  2. 扩展场景:可通过修改 CONFIG.TARGET_DOMAINS 配置,将功能扩展到其他需要对抗指纹追踪的网站(需确保网站在 @match 匹配范围内)。
  3. 关联工具:搭配 Sora 2 相关工具使用(如 Sora 2 文本转视频推荐页:https://prmbr.com/text-to-video/awesome-sora2/#_1),保护使用过程中的隐私。

四、安装步骤

  1. 安装油猴扩展
    浏览器访问 Tampermonkey 官网,根据浏览器类型(Chrome/Firefox/Edge 等)下载并安装扩展。
  2. 创建新脚本
    点击浏览器工具栏中的 Tampermonkey 图标,选择「新建脚本」,清空默认模板内容。
  3. 粘贴脚本代码
    将完整的“Sora 指纹随机化器”代码复制粘贴到编辑框中,点击「文件」→「保存」(或快捷键 Ctrl+S)。
  4. 验证激活
    访问 https://nosorawm.app/zh,打开浏览器控制台(F12),若看到 [🎭 Anti-Fingerprint] 🎭 反指纹追踪脚本已启动 日志,说明脚本已成功激活。

五、配置自定义

脚本顶部的 CONFIG 对象提供灵活的功能开关,可根据需求修改,核心配置项说明如下:

配置项 默认值 说明
DEBUG true 是否启用调试日志(开启后控制台会输出指纹生成、请求拦截等操作记录,方便排查问题)。
STORAGE_KEY sorawm:fingerprint 目标指纹在 localStorage 中的存储键名(需与目标网站的指纹存储键一致,默认适配 nosorawm.app)。
REGENERATE_ON_LOAD true 每次页面加载时是否重新生成指纹(关闭后同一页面会话内指纹保持不变)。
BLOCK_FINGERPRINT_CDN true 是否拦截 FingerprintJS 官方 CDN 加载(关闭后可能导致真实指纹被获取,不建议关闭)。
TARGET_DOMAINS [] 目标域名列表(留空则对 @match 范围内的所有域名生效;填写域名后,仅匹配包含该域名的网站)。

修改示例:若需让脚本同时对 prmbr.com 生效,可将 TARGET_DOMAINS 改为 ['prmbr.com', 'nosorawm.app']

六、工作原理

脚本执行流程分为 初始化→劫持→运行 三个阶段,具体如下:

  1. 初始化阶段
    • 调用 shouldActivate() 检查当前域名是否在生效范围。
    • 调用 clearExistingFingerprint() 清理本地残留的旧指纹。
  2. 劫持阶段
    • 启动 hijackLocalStorage():劫持本地存储操作。
    • 启动 hijackWindowCache():保护全局指纹变量。
    • 启动 blockFingerprintCDN():拦截追踪库加载。
    • 启动 hijackFetchRequests()hijackXHR():拦截网络请求中的指纹信息。
  3. 运行阶段
    • 每次触发指纹读取/请求发送时,动态生成随机指纹并替换原信息。
    • 若开启 DEBUG,实时在控制台输出操作日志(如“重新生成指纹:xxx”“拦截/api/parse请求,替换指纹:xxx→xxx”)。

七、注意事项

  1. 调试日志关闭:生产环境使用时建议将 DEBUG 改为 false,避免控制台日志泄露操作信息。
  2. 功能冲突处理:若目标网站出现功能异常(如无法提交表单、登录失效),可尝试关闭 BLOCK_FINGERPRINT_CDNREGENERATE_ON_LOAD 配置,排查是否为脚本拦截导致。
  3. 隐私与功能平衡:指纹随机化可能会影响网站的个性化功能(如“记住登录状态”“个性化推荐”),需根据实际需求权衡使用。
  4. 脚本更新:若目标网站修改了指纹存储键或请求路径,需同步更新脚本中的 STORAGE_KEY 或请求拦截规则(如 /api/parse 路径)。

八、相关资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
// Sora 2 一键去除水印,还有好玩提示语
// - 十月 09, 2025
// 址:https://nosorawm.app/zh

// https://prmbr.com/text-to-video/awesome-sora2/#_1

// ==UserScript==

// @name Sora 指纹随机化器 - Anti-Fingerprint Tracker

// @namespace http://tampermonkey.net/

// @version 2.0.0

// @description 随机化浏览器指纹,对抗 FingerprintJS 追踪,每次请求自动变换指纹

// @author Claude 4.0 sonnet

// @match https://nosorawm.app/*

// @grant unsafeWindow

// @run-at document-start

// @icon data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><text y="75" font-size="75">🎭</text></svg>

// ==/UserScript==



(function() {

'use strict';



// ========================================

// 配置区域

// ========================================

const CONFIG = {

// 是否启用调试日志

DEBUG: true,

// 指纹存储键名

STORAGE_KEY: 'sorawm:fingerprint',

// 是否每次页面加载都生成新指纹

REGENERATE_ON_LOAD: true,

// 是否拦截 FingerprintJS CDN

BLOCK_FINGERPRINT_CDN: true,

// 目标域名(留空则对所有域名生效)

TARGET_DOMAINS: []

};



// ========================================

// 工具函数

// ========================================



/**

* 生成随机 UUID v4

*/

function generateRandomUUID() {

if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {

return crypto.randomUUID();

}

// 降级方案:手动生成 UUID

return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {

const r = Math.random() * 16 | 0;

const v = c === 'x' ? r : (r & 0x3 | 0x8);

return v.toString(16);

});

}



/**

* 生成类似原始降级方案的指纹

*/

function generateFallbackFingerprint() {

const randomPart = Math.random().toString(36).slice(2);

const timePart = Date.now().toString(36);

return `${timePart}-${randomPart}`;

}



/**

* 生成随机指纹(混合策略)

*/

function generateRandomFingerprint() {

// 50% 概率使用 UUID,50% 使用降级方案

return Math.random() > 0.5 ? generateRandomUUID() : generateFallbackFingerprint();

}



/**

* 调试日志

*/

function log(...args) {

if (CONFIG.DEBUG) {

console.log('[🎭 Anti-Fingerprint]', ...args);

}

}



/**

* 检查是否应该在当前域名生效

*/

function shouldActivate() {

if (CONFIG.TARGET_DOMAINS.length === 0) {

return true;

}

const currentHost = window.location.hostname;

return CONFIG.TARGET_DOMAINS.some(domain => currentHost.includes(domain));

}



// ========================================

// 核心功能

// ========================================



/**

* 劫持 localStorage

*/

function hijackLocalStorage() {

const originalSetItem = Storage.prototype.setItem;

const originalGetItem = Storage.prototype.getItem;

const originalRemoveItem = Storage.prototype.removeItem;



// 存储随机指纹

let randomFingerprint = generateRandomFingerprint();

log('初始随机指纹:', randomFingerprint);



// 劫持 setItem

Storage.prototype.setItem = function(key, value) {

if (key === CONFIG.STORAGE_KEY) {

log('拦截指纹写入:', value, '→ 替换为:', randomFingerprint);

return originalSetItem.call(this, key, randomFingerprint);

}

return originalSetItem.call(this, key, value);

};



// 劫持 getItem

Storage.prototype.getItem = function(key) {

if (key === CONFIG.STORAGE_KEY) {

// 如果配置为每次重新生成

if (CONFIG.REGENERATE_ON_LOAD) {

randomFingerprint = generateRandomFingerprint();

log('重新生成指纹:', randomFingerprint);

}

log('拦截指纹读取,返回随机值:', randomFingerprint);

return randomFingerprint;

}

return originalGetItem.call(this, key);

};



// 劫持 removeItem

Storage.prototype.removeItem = function(key) {

if (key === CONFIG.STORAGE_KEY) {

log('拦截指纹删除操作');

return;

}

return originalRemoveItem.call(this, key);

};

}



/**

* 劫持 window 缓存变量

*/

function hijackWindowCache() {

let cachedFingerprint = generateRandomFingerprint();



Object.defineProperty(unsafeWindow, '__cachedFingerprintId', {

get: function() {

if (CONFIG.REGENERATE_ON_LOAD) {

cachedFingerprint = generateRandomFingerprint();

}

log('拦截 window.__cachedFingerprintId 读取:', cachedFingerprint);

return cachedFingerprint;

},

set: function(value) {

log('拦截 window.__cachedFingerprintId 写入:', value, '→ 忽略');

// 不实际设置,保持随机值

},

configurable: true

});

}



/**

* 拦截 FingerprintJS CDN 请求

*/

function blockFingerprintCDN() {

if (!CONFIG.BLOCK_FINGERPRINT_CDN) return;



// 劫持动态 import

const originalImport = unsafeWindow.import || window.import;

if (originalImport) {

unsafeWindow.import = window.import = function(url) {

if (typeof url === 'string' && url.includes('openfpcdn.io/fingerprintjs')) {

log('拦截 FingerprintJS CDN 加载:', url);

// 返回一个模拟的 FingerprintJS 对象

return Promise.resolve({

load: () => Promise.resolve({

get: () => Promise.resolve({

visitorId: generateRandomFingerprint(),

confidence: { score: 1 }

})

})

});

}

return originalImport.call(this, url);

};

}



// 拦截 fetch 请求

const originalFetch = unsafeWindow.fetch;

unsafeWindow.fetch = function(url, options) {

if (typeof url === 'string' && url.includes('openfpcdn.io')) {

log('拦截 FingerprintJS fetch 请求:', url);

return Promise.reject(new Error('Blocked by Anti-Fingerprint'));

}

return originalFetch.call(this, url, options);

};

}



/**

* 劫持 fetch 请求,替换指纹参数

*/

function hijackFetchRequests() {

const originalFetch = unsafeWindow.fetch;



unsafeWindow.fetch = function(url, options) {

// 检查是否是 /api/parse 请求

if (typeof url === 'string' && url.includes('/api/parse')) {

try {

if (options && options.body) {

const body = JSON.parse(options.body);

if (body.fingerprint) {

const newFingerprint = generateRandomFingerprint();

log('拦截 /api/parse 请求,替换指纹:', body.fingerprint, '→', newFingerprint);

body.fingerprint = newFingerprint;

options.body = JSON.stringify(body);

}

}

} catch (e) {

log('解析请求体失败:', e);

}

}

return originalFetch.call(this, url, options);

};

}



/**

* 劫持 XMLHttpRequest

*/

function hijackXHR() {

const originalOpen = XMLHttpRequest.prototype.open;

const originalSend = XMLHttpRequest.prototype.send;



XMLHttpRequest.prototype.open = function(method, url, ...args) {

this._url = url;

return originalOpen.call(this, method, url, ...args);

};



XMLHttpRequest.prototype.send = function(body) {

if (this._url && this._url.includes('/api/parse') && body) {

try {

const data = JSON.parse(body);

if (data.fingerprint) {

const newFingerprint = generateRandomFingerprint();

log('拦截 XHR /api/parse 请求,替换指纹:', data.fingerprint, '→', newFingerprint);

data.fingerprint = newFingerprint;

body = JSON.stringify(data);

}

} catch (e) {

log('解析 XHR 请求体失败:', e);

}

}

return originalSend.call(this, body);

};

}



/**

* 清理现有指纹

*/

function clearExistingFingerprint() {

try {

localStorage.removeItem(CONFIG.STORAGE_KEY);

delete unsafeWindow.__cachedFingerprintId;

log('已清理现有指纹缓存');

} catch (e) {

log('清理指纹失败:', e);

}

}



// ========================================

// 初始化

// ========================================



function init() {

if (!shouldActivate()) {

log('当前域名不在目标列表中,跳过激活');

return;

}



log('🎭 反指纹追踪脚本已启动');

log('配置:', CONFIG);



// 清理现有指纹

clearExistingFingerprint();



// 启动所有劫持

hijackLocalStorage();

hijackWindowCache();

blockFingerprintCDN();

hijackFetchRequests();

hijackXHR();



log('✅ 所有劫持已就位,指纹将被随机化');

}



// 立即执行

init();



// 页面加载完成后再次确认

if (document.readyState === 'loading') {

document.addEventListener('DOMContentLoaded', () => {

log('DOM 加载完成,重新检查劫持状态');

});

}



})();