cloakbrowser
Advanced tools
@@ -88,4 +88,2 @@ name: Publish | ||
| registry-url: 'https://registry.npmjs.org' | ||
| - name: Upgrade npm | ||
| run: npm install -g npm@latest | ||
| - name: Build | ||
@@ -92,0 +90,0 @@ run: cd js && npm ci && npm run build |
+9
-0
@@ -9,2 +9,11 @@ # Changelog | ||
| ## [0.3.21] — 2026-04-07 | ||
| - **[wrapper]** Remove dead `--disable-blink-features=AutomationControlled` flag -- binary patch 009 already handles `navigator.webdriver` at source level | ||
| - **[wrapper]** Remove hardcoded GPU vendor/renderer flags -- binary auto-generates diverse, realistic GPU profiles from the fingerprint seed. Each seed gets a unique GPU instead of every user sharing the same one | ||
| - **[wrapper]** Allow `viewport=None` to disable viewport emulation in both Python and JS wrappers (thanks [@kitiho](https://github.com/kitiho), #107) | ||
| - **[wrapper]** Enable `geoip=True` in stealth test example to fix FingerprintJS detection | ||
| - **[meta]** Remove npm self-upgrade step in CI -- Node 22 ships with compatible npm | ||
| - **[docker]** Install `geoip2` in Docker image for GeoIP auto-detection support | ||
| ## [0.3.20] — 2026-04-06 | ||
@@ -11,0 +20,0 @@ |
@@ -1,1 +0,1 @@ | ||
| __version__ = "0.3.20" | ||
| __version__ = "0.3.21" |
@@ -27,3 +27,6 @@ """Core browser launch functions for cloakbrowser. | ||
| # Sentinel to distinguish "viewport not provided" from "viewport=None" (disable emulation) | ||
| _VIEWPORT_UNSET = object() | ||
| def _resolve_timezone(timezone: str | None, kwargs: dict[str, Any]) -> str | None: | ||
@@ -241,3 +244,3 @@ """Accept both timezone and timezone_id — either works, no warning.""" | ||
| user_agent: str | None = None, | ||
| viewport: dict | None = None, | ||
| viewport: dict | None = _VIEWPORT_UNSET, | ||
| locale: str | None = None, | ||
@@ -269,2 +272,3 @@ timezone: str | None = None, | ||
| viewport: Viewport size dict, e.g. {"width": 1920, "height": 1080}. | ||
| Pass None to disable viewport emulation (use OS window size). | ||
| locale: Browser locale, e.g. "en-US". | ||
@@ -316,3 +320,8 @@ timezone: IANA timezone (e.g. 'America/New_York'). | ||
| context_kwargs["user_agent"] = user_agent | ||
| context_kwargs["viewport"] = viewport or DEFAULT_VIEWPORT | ||
| if viewport is _VIEWPORT_UNSET: | ||
| context_kwargs["viewport"] = DEFAULT_VIEWPORT | ||
| elif viewport is None: | ||
| context_kwargs["no_viewport"] = True | ||
| else: | ||
| context_kwargs["viewport"] = viewport | ||
| if color_scheme: | ||
@@ -361,3 +370,3 @@ context_kwargs["color_scheme"] = color_scheme | ||
| user_agent: str | None = None, | ||
| viewport: dict | None = None, | ||
| viewport: dict | None = _VIEWPORT_UNSET, | ||
| locale: str | None = None, | ||
@@ -388,2 +397,3 @@ timezone: str | None = None, | ||
| viewport: Viewport size dict, e.g. {"width": 1920, "height": 1080}. | ||
| Pass None to disable viewport emulation (use OS window size). | ||
| locale: Browser locale, e.g. "en-US". | ||
@@ -438,3 +448,8 @@ timezone: IANA timezone (e.g. 'America/New_York'). | ||
| context_kwargs["user_agent"] = user_agent | ||
| context_kwargs["viewport"] = viewport or DEFAULT_VIEWPORT | ||
| if viewport is _VIEWPORT_UNSET: | ||
| context_kwargs["viewport"] = DEFAULT_VIEWPORT | ||
| elif viewport is None: | ||
| context_kwargs["no_viewport"] = True | ||
| else: | ||
| context_kwargs["viewport"] = viewport | ||
| if color_scheme: | ||
@@ -482,3 +497,3 @@ context_kwargs["color_scheme"] = color_scheme | ||
| user_agent: str | None = None, | ||
| viewport: dict | None = None, | ||
| viewport: dict | None = _VIEWPORT_UNSET, | ||
| locale: str | None = None, | ||
@@ -506,2 +521,3 @@ timezone: str | None = None, | ||
| viewport: Viewport size dict, e.g. {"width": 1920, "height": 1080}. | ||
| Pass None to disable viewport emulation (use OS window size). | ||
| locale: Browser locale, e.g. "en-US". | ||
@@ -539,3 +555,8 @@ timezone: IANA timezone (e.g. 'America/New_York'). | ||
| context_kwargs["user_agent"] = user_agent | ||
| context_kwargs["viewport"] = viewport or DEFAULT_VIEWPORT | ||
| if viewport is _VIEWPORT_UNSET: | ||
| context_kwargs["viewport"] = DEFAULT_VIEWPORT | ||
| elif viewport is None: | ||
| context_kwargs["no_viewport"] = True | ||
| else: | ||
| context_kwargs["viewport"] = viewport | ||
| if color_scheme: | ||
@@ -542,0 +563,0 @@ context_kwargs["color_scheme"] = color_scheme |
@@ -51,3 +51,2 @@ """Stealth configuration and platform detection for cloakbrowser.""" | ||
| "--no-sandbox", | ||
| "--disable-blink-features=AutomationControlled", | ||
| f"--fingerprint={seed}", | ||
@@ -58,16 +57,8 @@ ] | ||
| # Tell the fingerprint patches we're on macOS so GPU/UA match natively | ||
| return base + [ | ||
| "--fingerprint-platform=macos", | ||
| "--fingerprint-gpu-vendor=Google Inc. (Apple)", | ||
| "--fingerprint-gpu-renderer=ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)", | ||
| ] | ||
| return base + ["--fingerprint-platform=macos"] | ||
| # Linux/Windows: Windows fingerprint profile | ||
| # Hardware concurrency, device memory, screen, and window size are | ||
| # Hardware concurrency, device memory, screen, window size, and GPU are | ||
| # auto-generated by the binary from the seed (v14+). | ||
| return base + [ | ||
| "--fingerprint-platform=windows", | ||
| "--fingerprint-gpu-vendor=Google Inc. (NVIDIA)", | ||
| "--fingerprint-gpu-renderer=ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 (0x00002484) Direct3D11 vs_5_0 ps_5_0, D3D11)", | ||
| ] | ||
| return base + ["--fingerprint-platform=windows"] | ||
@@ -74,0 +65,0 @@ |
+1
-1
@@ -23,3 +23,3 @@ FROM python:3.12-slim | ||
| COPY cloakbrowser/ cloakbrowser/ | ||
| RUN pip install --no-cache-dir ".[serve]" | ||
| RUN pip install --no-cache-dir ".[serve,geoip]" | ||
@@ -26,0 +26,0 @@ # JS wrapper |
@@ -231,3 +231,3 @@ """Run stealth tests against major bot detection services. | ||
| browser = launch(headless=not HEADED, proxy=PROXY) | ||
| browser = launch(headless=not HEADED, proxy=PROXY, geoip=True) | ||
| page = browser.new_page() | ||
@@ -234,0 +234,0 @@ |
+1
-1
| { | ||
| "name": "cloakbrowser", | ||
| "version": "0.3.20", | ||
| "version": "0.3.21", | ||
| "description": "Stealth Chromium that passes every bot detection test. Drop-in Playwright/Puppeteer replacement with source-level fingerprint patches.", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+3
-3
@@ -206,7 +206,7 @@ <p align="center"> | ||
| |---|---|---|---| | ||
| | Linux x86_64 | 145 | 33 | ✅ Latest | | ||
| | Linux arm64 (RPi, Graviton) | 145 | 33 | ✅ Latest | | ||
| | Linux x86_64 | 145 | 48 | ✅ Latest | | ||
| | Linux arm64 (RPi, Graviton) | 145 | 48 | ✅ Latest | | ||
| | macOS arm64 (Apple Silicon) | 145 | 26 | ✅ Latest | | ||
| | macOS x86_64 (Intel) | 145 | 26 | ✅ Latest | | ||
| | Windows x86_64 | 145 | 33 | ✅ Latest | | ||
| | Windows x86_64 | 145 | 48 | ✅ Latest | | ||
@@ -213,0 +213,0 @@ ## Requirements |
+3
-14
@@ -214,3 +214,2 @@ /** | ||
| "--no-sandbox", | ||
| "--disable-blink-features=AutomationControlled", | ||
| `--fingerprint=${seed}`, | ||
@@ -221,19 +220,9 @@ ]; | ||
| // macOS: run as native Mac browser — GPU/UA match natively | ||
| return [ | ||
| ...base, | ||
| "--fingerprint-platform=macos", | ||
| "--fingerprint-gpu-vendor=Google Inc. (Apple)", | ||
| "--fingerprint-gpu-renderer=ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)", | ||
| ]; | ||
| return [...base, "--fingerprint-platform=macos"]; | ||
| } | ||
| // Linux/Windows: spoof as Windows desktop | ||
| // Hardware concurrency, device memory, screen, and window size are | ||
| // Hardware concurrency, device memory, screen, window size, and GPU are | ||
| // auto-generated by the binary from the seed (v14+). | ||
| return [ | ||
| ...base, | ||
| "--fingerprint-platform=windows", | ||
| "--fingerprint-gpu-vendor=Google Inc. (NVIDIA)", | ||
| "--fingerprint-gpu-renderer=ANGLE (NVIDIA, NVIDIA GeForce RTX 3070 (0x00002484) Direct3D11 vs_5_0 ps_5_0, D3D11)", | ||
| ]; | ||
| return [...base, "--fingerprint-platform=windows"]; | ||
| } |
@@ -109,3 +109,3 @@ /** | ||
| ...(options.userAgent ? { userAgent: options.userAgent } : {}), | ||
| viewport: options.viewport ?? DEFAULT_VIEWPORT, | ||
| viewport: options.viewport === undefined ? DEFAULT_VIEWPORT : options.viewport, | ||
| ...(options.colorScheme ? { colorScheme: options.colorScheme } : {}), | ||
@@ -185,3 +185,3 @@ }); | ||
| ...(options.userAgent ? { userAgent: options.userAgent } : {}), | ||
| viewport: options.viewport ?? DEFAULT_VIEWPORT, | ||
| viewport: options.viewport === undefined ? DEFAULT_VIEWPORT : options.viewport, | ||
| ...(options.colorScheme ? { colorScheme: options.colorScheme } : {}), | ||
@@ -188,0 +188,0 @@ ...options.launchOptions, |
+1
-1
@@ -39,3 +39,3 @@ /** | ||
| /** Viewport size. */ | ||
| viewport?: { width: number; height: number }; | ||
| viewport?: { width: number; height: number } | null; | ||
| /** Browser locale, e.g. "en-US". */ | ||
@@ -42,0 +42,0 @@ locale?: string; |
@@ -24,8 +24,5 @@ import { describe, it, expect } from "vitest"; | ||
| expect(args).toContain("--no-sandbox"); | ||
| expect(args).toContain("--disable-blink-features=AutomationControlled"); | ||
| if (isMac) { | ||
| expect(args).toContain("--fingerprint-platform=macos"); | ||
| // macOS: no hardware-concurrency or GPU spoofing (uses native values) | ||
| expect(args.some((a) => a.includes("hardware-concurrency"))).toBe(false); | ||
| } else { | ||
@@ -35,2 +32,6 @@ expect(args).toContain("--fingerprint-platform=windows"); | ||
| // GPU flags removed — binary auto-generates from seed + platform | ||
| expect(args.some((a) => a.includes("fingerprint-gpu-vendor"))).toBe(false); | ||
| expect(args.some((a) => a.includes("fingerprint-gpu-renderer"))).toBe(false); | ||
| // Should have a random fingerprint seed | ||
@@ -37,0 +38,0 @@ const fingerprintArg = args.find((a) => a.startsWith("--fingerprint=")); |
+10
-13
| Metadata-Version: 2.4 | ||
| Name: cloakbrowser | ||
| Version: 0.3.20 | ||
| Version: 0.3.21 | ||
| Summary: Stealth Chromium that passes every bot detection test. Drop-in Playwright replacement with source-level fingerprint patches. | ||
@@ -596,11 +596,7 @@ Project-URL: Homepage, https://github.com/CloakHQ/CloakBrowser | ||
| | `--fingerprint-platform` | `windows` | `macos` | `navigator.platform`, User-Agent OS, GPU pool selection | | ||
| | `--fingerprint-gpu-vendor` | `NVIDIA Corporation` | `Google Inc. (Apple)` | WebGL `UNMASKED_VENDOR_WEBGL` | | ||
| | `--fingerprint-gpu-renderer` | `NVIDIA GeForce RTX 3070` | `ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)` | WebGL `UNMASKED_RENDERER_WEBGL` | | ||
| The binary auto-generates hardware concurrency (8), device memory (8), and screen dimensions (1920x1080 on Windows/Linux, 1440x900 on macOS) from the seed. Override with explicit flags if needed. | ||
| The binary auto-generates everything else from the seed: GPU, hardware concurrency, device memory, and screen dimensions. Each seed produces a unique, consistent fingerprint. Override with explicit flags if needed. | ||
| > **Using the binary directly?** It works out of the box with zero flags — the binary auto-spoofs everything. Pass `--fingerprint=seed` for a persistent identity, or use explicit flags like `--fingerprint-gpu-renderer` to override any auto-generated value. | ||
| > **Using the binary directly?** It works out of the box with zero flags -- the binary auto-spoofs everything. Pass `--fingerprint=seed` for a persistent identity, or use explicit flags like `--fingerprint-gpu-renderer` to override any auto-generated value. | ||
| > **Production tip:** For better stealth at scale, pass your own GPU, screen, and hardware values instead of relying on defaults. Custom parameters make your sessions harder to cluster by anti-bot systems that look for uniform fingerprint profiles. | ||
| ### Additional Flags | ||
@@ -612,2 +608,4 @@ | ||
| |------|----------| | ||
| | `--fingerprint-gpu-vendor` | WebGL `UNMASKED_VENDOR_WEBGL` (auto-generated from seed + platform) | | ||
| | `--fingerprint-gpu-renderer` | WebGL `UNMASKED_RENDERER_WEBGL` (auto-generated from seed + platform) | | ||
| | `--fingerprint-hardware-concurrency` | `navigator.hardwareConcurrency` (auto-generated: `8`) | | ||
@@ -642,7 +640,5 @@ | `--fingerprint-device-memory` | `navigator.deviceMemory` in GB (auto-generated: `8`) | | ||
| "--fingerprint-platform=windows", | ||
| "--fingerprint-gpu-vendor=NVIDIA Corporation", | ||
| "--fingerprint-gpu-renderer=NVIDIA GeForce RTX 3070", | ||
| ]) | ||
| # Override GPU to look like a different machine | ||
| # Override GPU to look like a specific machine | ||
| browser = launch(args=[ | ||
@@ -701,7 +697,7 @@ "--fingerprint-gpu-vendor=Intel Inc.", | ||
| |---|---|---|---| | ||
| | Linux x86_64 | 145 | 42 | ✅ Latest | | ||
| | Linux arm64 (RPi, Graviton) | 145 | 33 | ✅ | | ||
| | Linux x86_64 | 145 | 48 | ✅ Latest | | ||
| | Linux arm64 (RPi, Graviton) | 145 | 48 | ✅ | | ||
| | macOS arm64 (Apple Silicon) | 145 | 26 | ✅ | | ||
| | macOS x86_64 (Intel) | 145 | 26 | ✅ | | ||
| | Windows x86_64 | 145 | 33 | ✅ | | ||
| | Windows x86_64 | 145 | 48 | ✅ | | ||
@@ -1114,1 +1110,2 @@ The wrapper auto-downloads the correct binary for your platform. | ||
| - [@yahooguntu](https://github.com/yahooguntu) — persistent contexts | ||
| - [@kitiho](https://github.com/kitiho) — null viewport fix |
+9
-12
@@ -557,11 +557,7 @@ <p align="center"> | ||
| | `--fingerprint-platform` | `windows` | `macos` | `navigator.platform`, User-Agent OS, GPU pool selection | | ||
| | `--fingerprint-gpu-vendor` | `NVIDIA Corporation` | `Google Inc. (Apple)` | WebGL `UNMASKED_VENDOR_WEBGL` | | ||
| | `--fingerprint-gpu-renderer` | `NVIDIA GeForce RTX 3070` | `ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)` | WebGL `UNMASKED_RENDERER_WEBGL` | | ||
| The binary auto-generates hardware concurrency (8), device memory (8), and screen dimensions (1920x1080 on Windows/Linux, 1440x900 on macOS) from the seed. Override with explicit flags if needed. | ||
| The binary auto-generates everything else from the seed: GPU, hardware concurrency, device memory, and screen dimensions. Each seed produces a unique, consistent fingerprint. Override with explicit flags if needed. | ||
| > **Using the binary directly?** It works out of the box with zero flags — the binary auto-spoofs everything. Pass `--fingerprint=seed` for a persistent identity, or use explicit flags like `--fingerprint-gpu-renderer` to override any auto-generated value. | ||
| > **Using the binary directly?** It works out of the box with zero flags -- the binary auto-spoofs everything. Pass `--fingerprint=seed` for a persistent identity, or use explicit flags like `--fingerprint-gpu-renderer` to override any auto-generated value. | ||
| > **Production tip:** For better stealth at scale, pass your own GPU, screen, and hardware values instead of relying on defaults. Custom parameters make your sessions harder to cluster by anti-bot systems that look for uniform fingerprint profiles. | ||
| ### Additional Flags | ||
@@ -573,2 +569,4 @@ | ||
| |------|----------| | ||
| | `--fingerprint-gpu-vendor` | WebGL `UNMASKED_VENDOR_WEBGL` (auto-generated from seed + platform) | | ||
| | `--fingerprint-gpu-renderer` | WebGL `UNMASKED_RENDERER_WEBGL` (auto-generated from seed + platform) | | ||
| | `--fingerprint-hardware-concurrency` | `navigator.hardwareConcurrency` (auto-generated: `8`) | | ||
@@ -603,7 +601,5 @@ | `--fingerprint-device-memory` | `navigator.deviceMemory` in GB (auto-generated: `8`) | | ||
| "--fingerprint-platform=windows", | ||
| "--fingerprint-gpu-vendor=NVIDIA Corporation", | ||
| "--fingerprint-gpu-renderer=NVIDIA GeForce RTX 3070", | ||
| ]) | ||
| # Override GPU to look like a different machine | ||
| # Override GPU to look like a specific machine | ||
| browser = launch(args=[ | ||
@@ -662,7 +658,7 @@ "--fingerprint-gpu-vendor=Intel Inc.", | ||
| |---|---|---|---| | ||
| | Linux x86_64 | 145 | 42 | ✅ Latest | | ||
| | Linux arm64 (RPi, Graviton) | 145 | 33 | ✅ | | ||
| | Linux x86_64 | 145 | 48 | ✅ Latest | | ||
| | Linux arm64 (RPi, Graviton) | 145 | 48 | ✅ | | ||
| | macOS arm64 (Apple Silicon) | 145 | 26 | ✅ | | ||
| | macOS x86_64 (Intel) | 145 | 26 | ✅ | | ||
| | Windows x86_64 | 145 | 33 | ✅ | | ||
| | Windows x86_64 | 145 | 48 | ✅ | | ||
@@ -1075,1 +1071,2 @@ The wrapper auto-downloads the correct binary for your platform. | ||
| - [@yahooguntu](https://github.com/yahooguntu) — persistent contexts | ||
| - [@kitiho](https://github.com/kitiho) — null viewport fix |
@@ -136,3 +136,5 @@ """Unit tests for config.py — platform detection, paths, stealth args.""" | ||
| assert "--fingerprint-platform=macos" in args | ||
| assert any("Apple" in a for a in args) | ||
| # GPU flags removed — binary auto-generates from seed + platform | ||
| assert not any("fingerprint-gpu-vendor" in a for a in args) | ||
| assert not any("fingerprint-gpu-renderer" in a for a in args) | ||
@@ -143,2 +145,4 @@ def test_linux_windows_profile(self): | ||
| assert "--fingerprint-platform=windows" in args | ||
| assert any("NVIDIA" in a for a in args) | ||
| # GPU flags removed — binary auto-generates from seed + platform | ||
| assert not any("fingerprint-gpu-vendor" in a for a in args) | ||
| assert not any("fingerprint-gpu-renderer" in a for a in args) |
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
5978426
0.01%17604
0.02%