clearcote 0.6.0 → 0.7.0
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/README.md +30 -0
- package/dist/fingerprint.d.ts +15 -0
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +54 -2
- package/dist/fingerprint.js.map +1 -1
- package/dist/release.js +4 -4
- package/package.json +62 -58
package/README.md
CHANGED
|
@@ -81,6 +81,35 @@ const context = await launchPersistentContext("./profile-7423", {
|
|
|
81
81
|
});
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
+
### Capture or import a profile
|
|
85
|
+
|
|
86
|
+
Make Clearcote present a **real machine's** identity instead of the synthetic seed-derived one. Pass
|
|
87
|
+
a captured fingerprint as `fingerprintProfile` — a file path, a plain object, or a JSON string (the
|
|
88
|
+
SDK gzip+base64-encodes it for the engine):
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
const browser = await launch({
|
|
92
|
+
fingerprint: "seed-1", // still the farbling root / fallback for absent fields
|
|
93
|
+
fingerprintProfile: "profile.json", // a real machine's captured identity
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Get a profile two ways:
|
|
98
|
+
|
|
99
|
+
- **Capture** from a donor Chrome — open
|
|
100
|
+
[`tools/fingerprint-collect/collect.html`](../../tools/fingerprint-collect/README.md) and click
|
|
101
|
+
Capture, or paste `collect.js` + `snippet.js` in DevTools. Either downloads the JSON.
|
|
102
|
+
- **Convert** the open-source [chrome-fingerprints](https://github.com/Vinyzu/chrome-fingerprints)
|
|
103
|
+
dataset: `pip install chrome-fingerprints && python tools/fingerprint-collect/convert_dataset.py
|
|
104
|
+
--out ./profiles --count 100`.
|
|
105
|
+
|
|
106
|
+
**Override / fallback semantics:** fields present in the profile **override** the `fingerprint`
|
|
107
|
+
seed-derived persona; **absent** fields **fall back** to the seed, so partial profiles stay
|
|
108
|
+
coherent. The SDK also derives `acceptLanguage` from the profile's `navigator.languages` when you
|
|
109
|
+
don't set `acceptLanguage` explicitly. See the
|
|
110
|
+
[collector README](../../tools/fingerprint-collect/README.md) for the full schema and what each
|
|
111
|
+
field drives.
|
|
112
|
+
|
|
84
113
|
## Fingerprint options
|
|
85
114
|
|
|
86
115
|
All optional. Anything not listed here is passed straight through to Playwright
|
|
@@ -102,6 +131,7 @@ All optional. Anything not listed here is passed straight through to Playwright
|
|
|
102
131
|
| `webrtcIp` | `--webrtc-ip` | WebRTC IP to report. The engine **fabricates** the `srflx` candidate at this IP and sends **no real STUN** from the host, so the real IP never leaks (not merely relabeled). |
|
|
103
132
|
| `disableGpuFingerprint` | `--disable-gpu-fingerprint` | Turn off GPU/WebGL spoofing. |
|
|
104
133
|
| `geoip` | _(directive)_ | `true` → resolve the proxy's exit-IP geo and auto-fill timezone/acceptLanguage/location/**webrtcIp**. |
|
|
134
|
+
| `fingerprintProfile` | `--fingerprint-profile` | A real machine's captured fingerprint (file path / object / JSON string; the SDK gzip+base64-encodes it). Fields present override the seed-derived persona; absent fields fall back to `fingerprint`. |
|
|
105
135
|
|
|
106
136
|
## API
|
|
107
137
|
|
package/dist/fingerprint.d.ts
CHANGED
|
@@ -40,6 +40,14 @@ export interface FingerprintOptions {
|
|
|
40
40
|
* stay on. Default (unset/`true`) keeps the noise.
|
|
41
41
|
*/
|
|
42
42
|
fingerprintNoise?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Import a real captured fingerprint so the browser presents *that machine's* identity instead
|
|
45
|
+
* of the synthetic seed-derived one. Accepts a path to a `.json` profile, a profile object, or a
|
|
46
|
+
* JSON string (capture one with `tools/fingerprint-collect`). Fields present in the profile
|
|
47
|
+
* override the seed-derived persona; absent fields fall back to the seed, so partial profiles
|
|
48
|
+
* stay coherent.
|
|
49
|
+
*/
|
|
50
|
+
fingerprintProfile?: string | Record<string, unknown>;
|
|
43
51
|
}
|
|
44
52
|
/** Split an options object into its fingerprint half and the remaining (Playwright) half. */
|
|
45
53
|
export declare function splitFingerprintOptions<T extends FingerprintOptions>(options: T): {
|
|
@@ -50,6 +58,13 @@ export declare function splitFingerprintOptions<T extends FingerprintOptions>(op
|
|
|
50
58
|
* tag list with NO `;q=` weights or spaces (Chromium adds the q-weights to the header itself; a
|
|
51
59
|
* `;` in the switch value trips a DCHECK and crashes the renderer). */
|
|
52
60
|
export declare function cleanAcceptLanguage(v: string): string;
|
|
61
|
+
/** Encode a captured clearcote-profile for the `--fingerprint-profile` switch. `value` may be a
|
|
62
|
+
* path to a `.json` file, a profile object, or a JSON string. gzip+base64 keeps the full capture
|
|
63
|
+
* (~40 KB) within Chromium's command-line length limit (gzip ~6x); the engine gunzips + parses it. */
|
|
64
|
+
export declare function encodeProfile(value: string | Record<string, unknown>): string;
|
|
65
|
+
/** Best-effort: derive an Accept-Language from an imported profile's navigator.languages
|
|
66
|
+
* (path / object / JSON string), so an imported identity keeps the donor's language order. */
|
|
67
|
+
export declare function profileAcceptLanguage(value: string | Record<string, unknown>): string | undefined;
|
|
53
68
|
/** Build the Chromium switches for a set of fingerprint options. */
|
|
54
69
|
export declare function fingerprintArgs(o: FingerprintOptions): string[];
|
|
55
70
|
//# sourceMappingURL=fingerprint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IACzC,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAChE,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvD;AAoBD,6FAA6F;AAC7F,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,kBAAkB,EAClE,OAAO,EAAE,CAAC,GACT;IAAE,WAAW,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,kBAAkB,CAAC,CAAA;CAAE,CAW9E;AAED;;uEAEuE;AACvE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED;;sGAEsG;AACtG,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAU7E;AAED;8FAC8F;AAC9F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAajG;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAyC/D"}
|
package/dist/fingerprint.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Maps the SDK's fingerprint options to the Clearcote Chromium command-line switches.
|
|
2
2
|
// Switch names mirror components/ungoogled/ungoogled_switches.cc (see patches/000-fingerprint-switches.patch).
|
|
3
|
+
import { gzipSync } from "node:zlib";
|
|
4
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
5
|
const FINGERPRINT_KEYS = [
|
|
4
6
|
"fingerprint",
|
|
5
7
|
"platform",
|
|
@@ -15,6 +17,7 @@ const FINGERPRINT_KEYS = [
|
|
|
15
17
|
"webrtcIp",
|
|
16
18
|
"disableGpuFingerprint",
|
|
17
19
|
"fingerprintNoise",
|
|
20
|
+
"fingerprintProfile",
|
|
18
21
|
];
|
|
19
22
|
/** Split an options object into its fingerprint half and the remaining (Playwright) half. */
|
|
20
23
|
export function splitFingerprintOptions(options) {
|
|
@@ -40,6 +43,43 @@ export function cleanAcceptLanguage(v) {
|
|
|
40
43
|
.filter(Boolean)
|
|
41
44
|
.join(",");
|
|
42
45
|
}
|
|
46
|
+
/** Encode a captured clearcote-profile for the `--fingerprint-profile` switch. `value` may be a
|
|
47
|
+
* path to a `.json` file, a profile object, or a JSON string. gzip+base64 keeps the full capture
|
|
48
|
+
* (~40 KB) within Chromium's command-line length limit (gzip ~6x); the engine gunzips + parses it. */
|
|
49
|
+
export function encodeProfile(value) {
|
|
50
|
+
let raw;
|
|
51
|
+
if (typeof value === "object") {
|
|
52
|
+
raw = Buffer.from(JSON.stringify(value));
|
|
53
|
+
}
|
|
54
|
+
else if (existsSync(value)) {
|
|
55
|
+
raw = readFileSync(value);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
raw = Buffer.from(value); // assume a JSON string
|
|
59
|
+
}
|
|
60
|
+
return gzipSync(raw, { level: 9 }).toString("base64");
|
|
61
|
+
}
|
|
62
|
+
/** Best-effort: derive an Accept-Language from an imported profile's navigator.languages
|
|
63
|
+
* (path / object / JSON string), so an imported identity keeps the donor's language order. */
|
|
64
|
+
export function profileAcceptLanguage(value) {
|
|
65
|
+
let obj;
|
|
66
|
+
try {
|
|
67
|
+
if (typeof value === "object")
|
|
68
|
+
obj = value;
|
|
69
|
+
else if (existsSync(value))
|
|
70
|
+
obj = JSON.parse(readFileSync(value, "utf8"));
|
|
71
|
+
else
|
|
72
|
+
obj = JSON.parse(value);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
const nav = obj?.navigator;
|
|
78
|
+
const langs = nav?.languages;
|
|
79
|
+
if (Array.isArray(langs) && langs.length)
|
|
80
|
+
return langs.map(String).join(",");
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
43
83
|
/** Build the Chromium switches for a set of fingerprint options. */
|
|
44
84
|
export function fingerprintArgs(o) {
|
|
45
85
|
const args = [];
|
|
@@ -61,8 +101,15 @@ export function fingerprintArgs(o) {
|
|
|
61
101
|
set("fingerprint-hardware-concurrency", o.hardwareConcurrency);
|
|
62
102
|
set("fingerprint-location", o.location);
|
|
63
103
|
set("timezone", o.timezone);
|
|
64
|
-
|
|
65
|
-
|
|
104
|
+
// Always send a coherent Accept-Language. Without --accept-lang Chromium falls back to the
|
|
105
|
+
// build/OS locale, which can leak a language that mismatches the proxy's country/timezone
|
|
106
|
+
// (e.g. en-GB on a US IP) — a geo-inconsistency tell. Prefer an explicit value, then an imported
|
|
107
|
+
// profile's languages, then en-US,en (the common Chrome default; set acceptLanguage or geoip to
|
|
108
|
+
// match the proxy region).
|
|
109
|
+
const acceptLanguage = o.acceptLanguage ||
|
|
110
|
+
(o.fingerprintProfile ? profileAcceptLanguage(o.fingerprintProfile) : undefined) ||
|
|
111
|
+
"en-US,en";
|
|
112
|
+
args.push(`--accept-lang=${cleanAcceptLanguage(String(acceptLanguage))}`);
|
|
66
113
|
set("webrtc-ip", o.webrtcIp);
|
|
67
114
|
if (o.disableGpuFingerprint)
|
|
68
115
|
args.push("--disable-gpu-fingerprint");
|
|
@@ -71,6 +118,11 @@ export function fingerprintArgs(o) {
|
|
|
71
118
|
// Identity spoofs (UA/screen/GPU/persona) stay on. Default keeps the noise.
|
|
72
119
|
if (o.fingerprintNoise === false)
|
|
73
120
|
args.push("--disable-fingerprint-noise");
|
|
121
|
+
// fingerprintProfile imports a real captured fingerprint (path/object/JSON) — see
|
|
122
|
+
// tools/fingerprint-collect. Its fields override the seed-derived persona; absent fields fall
|
|
123
|
+
// back to the seed, so partial profiles stay coherent.
|
|
124
|
+
if (o.fingerprintProfile)
|
|
125
|
+
args.push(`--fingerprint-profile=${encodeProfile(o.fingerprintProfile)}`);
|
|
74
126
|
return args;
|
|
75
127
|
}
|
|
76
128
|
//# sourceMappingURL=fingerprint.js.map
|
package/dist/fingerprint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,+GAA+G;
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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"}
|
package/dist/release.js
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
// this package, the hash check guarantees you run exactly the published, signed binary.
|
|
5
5
|
// Published checksums + GPG signatures live on the release page.
|
|
6
6
|
export const RELEASE = {
|
|
7
|
-
tag: "v0.1.0-pre.
|
|
7
|
+
tag: "v0.1.0-pre.8",
|
|
8
8
|
version: "149.0.7827.114",
|
|
9
9
|
asset: "clearcote-149.0.7827.114-windows-x64.zip",
|
|
10
|
-
url: "https://github.com/clearcotelabs/clearcote-browser/releases/download/v0.1.0-pre.
|
|
11
|
-
sha256: "
|
|
10
|
+
url: "https://github.com/clearcotelabs/clearcote-browser/releases/download/v0.1.0-pre.8/clearcote-149.0.7827.114-windows-x64.zip",
|
|
11
|
+
sha256: "3a232583dee201ac3a2a2cf6f49351bd444bebc205cc6112d01fef75be9b66f4",
|
|
12
12
|
exeSha256: "5743595256c89c6874804bf3315acce592fc7f1883760c8d380c010151a73b23",
|
|
13
|
-
size:
|
|
13
|
+
size: 242559694,
|
|
14
14
|
os: "win32",
|
|
15
15
|
};
|
|
16
16
|
/** GitHub repo (owner/name) the releases come from — used by the opt-in auto-update resolver. */
|
package/package.json
CHANGED
|
@@ -1,58 +1,62 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "clearcote",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Playwright drop-in for the Clearcote anti-fingerprint Chromium build. launch() returns a standard Playwright Browser backed by the verified Clearcote binary, which is auto-downloaded and SHA-256 checked.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"types": "./dist/index.d.ts",
|
|
11
|
-
"import": "./dist/index.js"
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
"files": [
|
|
15
|
-
"dist",
|
|
16
|
-
"README.md"
|
|
17
|
-
],
|
|
18
|
-
"engines": {
|
|
19
|
-
"node": ">=18"
|
|
20
|
-
},
|
|
21
|
-
"scripts": {
|
|
22
|
-
"build": "tsc -p tsconfig.json",
|
|
23
|
-
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
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
|
-
"url": "https://github.com/clearcotelabs/clearcote-browser
|
|
57
|
-
|
|
58
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "clearcote",
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "Playwright drop-in for the Clearcote anti-fingerprint Chromium build. launch() returns a standard Playwright Browser backed by the verified Clearcote binary, which is auto-downloaded and SHA-256 checked.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=18"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -p tsconfig.json",
|
|
23
|
+
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
24
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"extract-zip": "^2.0.1",
|
|
31
|
+
"maxmind": "^4.3.0",
|
|
32
|
+
"playwright-core": "^1.49.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^22.0.0",
|
|
36
|
+
"typescript": "^5.6.0",
|
|
37
|
+
"vitest": "^2.1.9"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"clearcote",
|
|
41
|
+
"playwright",
|
|
42
|
+
"puppeteer",
|
|
43
|
+
"chromium",
|
|
44
|
+
"anti-detect",
|
|
45
|
+
"anti-fingerprint",
|
|
46
|
+
"fingerprint",
|
|
47
|
+
"farbling",
|
|
48
|
+
"automation",
|
|
49
|
+
"stealth",
|
|
50
|
+
"ungoogled"
|
|
51
|
+
],
|
|
52
|
+
"license": "BSD-3-Clause",
|
|
53
|
+
"homepage": "https://github.com/clearcotelabs/clearcote-browser",
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "git+https://github.com/clearcotelabs/clearcote-browser.git",
|
|
57
|
+
"directory": "sdk/node"
|
|
58
|
+
},
|
|
59
|
+
"bugs": {
|
|
60
|
+
"url": "https://github.com/clearcotelabs/clearcote-browser/issues"
|
|
61
|
+
}
|
|
62
|
+
}
|