| package browserfp |
|
|
| import ( |
| "math/rand" |
| "strings" |
| "time" |
| ) |
|
|
| |
|
|
| |
| type Language struct { |
| Code string |
| JoinList string |
| } |
|
|
| |
| func (l Language) Slice() []string { return strings.Split(l.JoinList, ",") } |
|
|
| |
| func LanguageJoin(code string) string { |
| for _, l := range Languages { |
| if l.Code == code { |
| return l.JoinList |
| } |
| } |
| return code + ",en" |
| } |
|
|
| |
| func LanguageSlices() [][]string { |
| out := make([][]string, len(Languages)) |
| for i, l := range Languages { |
| out[i] = l.Slice() |
| } |
| return out |
| } |
|
|
| |
|
|
| |
| var UserAgents = []string{ |
| "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36", |
| "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36", |
| "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36", |
| "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36", |
| "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36", |
| } |
|
|
| |
| var Languages = []Language{ |
| {"en-US", "en-US,en"}, |
| {"zh-CN", "zh-CN,zh"}, |
| {"en-GB", "en-GB,en"}, |
| {"ja", "ja,en"}, |
| {"de", "de,en"}, |
| {"fr", "fr,en"}, |
| {"es", "es,en"}, |
| {"ko", "ko,en"}, |
| } |
|
|
| |
| var Platforms = []string{"Win32", "Win32", "MacIntel", "Linux x86_64", "Linux armv8l", "Linux i686"} |
|
|
| |
| var DocumentKeys = []string{ |
| "_reactListening8in7sfyhjvp", "_reactListeningo743lnnpvdg", |
| "_reactContainer$5pyziap1brc", "__reactContainer$b63yiita51i", |
| "location", "cookie", "referrer", "currentScript", "body", "head", "documentElement", |
| } |
|
|
| |
| var WindowKeys = []string{ |
| "onchange", "onclick", "onload", "onerror", "onresize", |
| "onmouseover", "onmouseout", "onfocus", "onblur", "onscroll", |
| "onkeydown", "onkeyup", "onkeypress", |
| "requestIdleCallback", "requestAnimationFrame", "setTimeout", |
| "fetch", "console", "Promise", "Map", "Set", "WeakMap", "WeakSet", |
| "crypto", "performance", "navigator", "document", "location", "history", |
| "localStorage", "sessionStorage", "indexedDB", |
| "Image", "XMLHttpRequest", "FormData", "Headers", "Request", "Response", |
| "alert", "confirm", "prompt", "close", "focus", "blur", |
| "addEventListener", "removeEventListener", "dispatchEvent", |
| "scrollTo", "scrollBy", "scroll", "matchMedia", "getComputedStyle", |
| "getSelection", "find", "stop", "open", "print", "captureEvents", |
| "releaseEvents", "queueMicrotask", "reportError", "structuredClone", |
| "isSecureContext", "crossOriginIsolated", "originAgentCluster", |
| "speechSynthesis", "MediaSource", "Blob", "File", "FileReader", |
| "Atomics", "SharedArrayBuffer", "WebAssembly", "BigInt", "Symbol", "Proxy", |
| } |
|
|
| |
| var NavigatorProbes = []string{ |
| "windowControlsOverlayโ[object WindowControlsOverlay]", |
| "geolocationโ[object Geolocation]", |
| "clipboardโ[object Clipboard]", |
| "mediaDevicesโ[object MediaDevices]", |
| "permissionsโ[object Permissions]", |
| "bluetoothโ[object Bluetooth]", |
| "usbโ[object USB]", |
| "serialโ[object Serial]", |
| "hidโ[object HID]", |
| "presentationโ[object Presentation]", |
| "credentialsโ[object CredentialsContainer]", |
| } |
|
|
| |
| |
| |
| var ScriptURLs = []string{ |
| "https://chatgpt.com/backend-api/sentinel/sdk.js", |
| "https://chatgpt.com/sentinel/20260423af3c/sdk.js", |
| } |
|
|
| |
| const DefaultBuildID = "prod-dbbd612ddb47498515c3eecf8579bcafa0066e07" |
|
|
| |
| func VendorForPlatform(platform string) string { |
| if platform == "MacIntel" { |
| return "Apple Computer, Inc." |
| } |
| return "Google Inc." |
| } |
|
|
| |
|
|
| |
| type Profile struct { |
| WebGLUnmaskedRenderer string |
| WebGLUnmaskedVendor string |
| Language string |
| BuildID string |
| Platform string |
| ScreenWidth int |
| ScreenHeight int |
| ScreenAvailHeight int |
| ScreenColorDepth int |
| HardwareConcurrency int |
| DeviceMemory int |
| JSHeapSizeLimit int64 |
| NetworkDownlink float64 |
| NetworkRTT int |
| TimezoneOffset int |
| DevicePixelRatio float64 |
| } |
|
|
| |
|
|
| var current *Profile |
|
|
| |
| func Init() { current = Generate(nil) } |
|
|
| |
| func Get() *Profile { return current } |
|
|
| |
| func Generate(rng *rand.Rand) *Profile { |
| if rng == nil { |
| rng = rand.New(rand.NewSource(time.Now().UnixNano())) |
| } |
|
|
| lang := Languages[rng.Intn(len(Languages))] |
| platform := Platforms[rng.Intn(len(Platforms))] |
| sr := screenResolutions[rng.Intn(len(screenResolutions))] |
| sw, sh := sr[0]+rng.Intn(101)-50, sr[1]+rng.Intn(101)-50 |
| if sw < 1024 { |
| sw = 1024 |
| } |
| if sh < 600 { |
| sh = 600 |
| } |
|
|
| vendorIdx := rng.Intn(len(webglUnmaskedVendors)) |
|
|
| return &Profile{ |
| WebGLUnmaskedVendor: webglUnmaskedVendors[vendorIdx], |
| WebGLUnmaskedRenderer: webglUnmaskedRenderersMap[vendorIdx][rng.Intn(len(webglUnmaskedRenderersMap[vendorIdx]))], |
|
|
| Language: lang.Code, |
| BuildID: DefaultBuildID, |
| Platform: platform, |
|
|
| ScreenWidth: sw, |
| ScreenHeight: sh, |
| ScreenAvailHeight: sh - (20 + rng.Intn(40)), |
| ScreenColorDepth: 24, |
|
|
| HardwareConcurrency: pickInt(rng, []int{4, 8, 12, 16, 20, 24, 32}), |
| DeviceMemory: pickInt(rng, []int{4, 8, 16, 32}), |
| JSHeapSizeLimit: pickInt64(rng, []int64{2_147_483_648, 4_294_967_296, 8_589_934_592, 17_179_869_184}), |
|
|
| NetworkDownlink: networkDownlinks[rng.Intn(len(networkDownlinks))], |
| NetworkRTT: networkRTTs[rng.Intn(len(networkRTTs))], |
|
|
| DevicePixelRatio: devicePixelRatios[rng.Intn(len(devicePixelRatios))], |
|
|
| TimezoneOffset: (rng.Intn(23) - 12) * 60, |
| } |
| } |
|
|
| |
|
|
| func pickStr(rng *rand.Rand, opts []string) string { return opts[rng.Intn(len(opts))] } |
| func pickInt(rng *rand.Rand, opts []int) int { return opts[rng.Intn(len(opts))] } |
| func pickInt64(rng *rand.Rand, opts []int64) int64 { return opts[rng.Intn(len(opts))] } |