aurora / internal /browserfp /browserfp.go
qwen2api's picture
Upload 113 files
6bc074c verified
Raw
History Blame Contribute Delete
7.74 kB
package browserfp
import (
"math/rand"
"strings"
"time"
)
// โ”€โ”€โ”€ Language โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
// Language ๆต่งˆๅ™จ่ฏญ่จ€ๆก็›ฎใ€‚
type Language struct {
Code string // "en-US"
JoinList string // "en-US,en"
}
// Slice ่ฟ”ๅ›ž [][]string ็š„ []string ๅฝขๅผใ€‚
func (l Language) Slice() []string { return strings.Split(l.JoinList, ",") }
// LanguageJoin ่ฟ”ๅ›ž code ๅฏนๅบ”็š„ languagesJoin ๅญ—็ฌฆไธฒใ€‚
func LanguageJoin(code string) string {
for _, l := range Languages {
if l.Code == code {
return l.JoinList
}
}
return code + ",en"
}
// LanguageSlices ๆ‰€ๆœ‰ Language ็š„ [][]string ๅฝขๅผใ€‚
func LanguageSlices() [][]string {
out := make([][]string, len(Languages))
for i, l := range Languages {
out[i] = l.Slice()
}
return out
}
// โ”€โ”€โ”€ ้€š็”จๆ•ฐๆฎๆฑ  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
// UserAgents ็œŸๅฎž Chrome UA ๆฑ ใ€‚
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",
}
// Languages ๆต่งˆๅ™จ navigator.languages ็ป„ๅˆใ€‚
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"},
}
// Platforms ๆต่งˆๅ™จ navigator.platform ๅ€ผใ€‚
var Platforms = []string{"Win32", "Win32", "MacIntel", "Linux x86_64", "Linux armv8l", "Linux i686"}
// DocumentKeys document ไธŠ own-enumerable ๅฑžๆ€งๅๆฑ ใ€‚
var DocumentKeys = []string{
"_reactListening8in7sfyhjvp", "_reactListeningo743lnnpvdg",
"_reactContainer$5pyziap1brc", "__reactContainer$b63yiita51i",
"location", "cookie", "referrer", "currentScript", "body", "head", "documentElement",
}
// WindowKeys window ๅ…จๅฑ€ๅฑžๆ€งๅๆฑ ใ€‚
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",
}
// NavigatorProbes "X in navigator" ๆŽขๆต‹ๆ ผๅผใ€‚
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]",
}
// ScriptURLs sentinel SDK ่„šๆœฌ URL ๆฑ ใ€‚
// ๆต่งˆๅ™จไธญ hPt(Array.from(document.scripts).map(e=>e?.src).filter(e=>e))
// ไผš้šๆœบ้€‰ไธ€ไธช script URLใ€‚
var ScriptURLs = []string{
"https://chatgpt.com/backend-api/sentinel/sdk.js",
"https://chatgpt.com/sentinel/20260423af3c/sdk.js",
}
// DefaultBuildID ๅฝ“ๅ‰ chatgpt.com ็š„ data-build ๅฑžๆ€งใ€‚
const DefaultBuildID = "prod-dbbd612ddb47498515c3eecf8579bcafa0066e07"
// VendorForPlatform ่ฟ”ๅ›ž็ป™ๅฎšๅนณๅฐ็š„ navigator.vendor ๅ€ผใ€‚
func VendorForPlatform(platform string) string {
if platform == "MacIntel" {
return "Apple Computer, Inc."
}
return "Google Inc."
}
// โ”€โ”€โ”€ Profile โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
// Profile ๆต่งˆๅ™จๆŒ‡็บน้…็ฝฎใ€‚
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
// Init ๅฏๅŠจๆ—ถ่ฐƒ็”จไธ€ๆฌก๏ผŒ็”Ÿๆˆๅ…จๅฑ€ๅ”ฏไธ€็š„ Profileใ€‚
func Init() { current = Generate(nil) }
// Get ่ฟ”ๅ›žๅ…จๅฑ€ๅ”ฏไธ€็š„ Profileใ€‚
func Get() *Profile { return current }
// Generate ไปŽ็œŸๅฎžๆ•ฐๆฎๆฑ ไธญ้šๆœบ็”Ÿๆˆ Profileใ€‚
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))] }