Canvas noise: identical noise pattern every session
Anti-bot systems that fingerprint across sessions can trivially identify go-extractor instances because every session looks identical. Real browsers show natural variation in hardware, plugins, and network conditions.
Proposed Solution
Create a hardware profile pool (5-10 realistic profiles):
typeHardwareProfilestruct{WebGLVendorstringWebGLRendererstringPlatformstringHWConcurrencyintDeviceMemoryintConnectionRTTintConnectionDownfloat64}varprofiles=[]HardwareProfile{{"Intel Inc.","Intel Iris OpenGL Engine","Win32",8,8,50,10.0},{"Google Inc. (NVIDIA)","ANGLE (NVIDIA GeForce GTX 1660 ...)","Win32",12,16,25,50.0},{"Google Inc. (AMD)","ANGLE (AMD Radeon RX 580 ...)","Win32",8,16,75,8.0},// ... more profiles}
Randomly select a profile per session and inject its values into the stealth scripts
Replace static script slices with a dynamic builder:
funcbuildStealthScripts(profileHardwareProfile,browserBrowserType)[]string{// Generate scripts with profile-specific values}
Add slight randomization within profiles for connection stats (RTT ±20ms, downlink ±2Mbps) to avoid even profile-level fingerprinting
Update browser_init.go to call builders instead of referencing static slices
Update tests to use builder functions
Branch: feature/71-randomize-fingerprints
Starting work on this issue. Plan:
1. Replace static `stealthChromiumScripts` and `stealthFirefoxScripts` vars with builder functions that accept a hardware profile struct
2. Add pools of 6 realistic profiles per engine, randomly sampled per session
3. Add connection jitter (±20ms RTT, ±2 Mbps downlink) for Chromium profiles
4. Update `browser_init.go` to call builders instead of referencing static slices
5. Update tests to use builder functions
Branch: `feature/71-randomize-fingerprints`
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Parent Epic: #68
Problem
Every browser session created by go-extractor has identical fingerprint values hardcoded in the stealth init scripts:
Intel Inc./Intel Iris OpenGL Engine{ effectiveType: '4g', rtt: 50, downlink: 10, saveData: false }Anti-bot systems that fingerprint across sessions can trivially identify go-extractor instances because every session looks identical. Real browsers show natural variation in hardware, plugins, and network conditions.
Proposed Solution
Create a hardware profile pool (5-10 realistic profiles):
Randomly select a profile per session and inject its values into the stealth scripts
Replace static script slices with a dynamic builder:
Add slight randomization within profiles for connection stats (RTT ±20ms, downlink ±2Mbps) to avoid even profile-level fingerprinting
Files to Modify
stealth.go— hardware profiles, dynamic script builderbrowser_init.go— select random profile at session creationstealth_test.go— test profile selection and script generationReferences
Starting work on this issue. Plan:
stealthChromiumScriptsandstealthFirefoxScriptsvars with builder functions that accept a hardware profile structbrowser_init.goto call builders instead of referencing static slicesBranch:
feature/71-randomize-fingerprintsWork finished. PR #74 implements fingerprint randomization:
stealthChromiumScripts/stealthFirefoxScriptswith builder functions accepting hardware profile structs#74