| package util |
|
|
| import ( |
| "fmt" |
| "math/rand" |
| "strings" |
| "sync" |
| "time" |
| ) |
|
|
| const FixedUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36" |
|
|
| |
| |
| type userAgentSpec struct { |
| Template string |
| MinVersion int |
| MaxVersion int |
| Family string |
| } |
|
|
| |
| var userAgentSpecs = []userAgentSpec{ |
| { |
| Template: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%d.0.0.0 Safari/537.36", |
| MinVersion: 148, |
| MaxVersion: 148, |
| Family: "Chrome-Win", |
| }, |
| } |
|
|
| var ( |
| uaRand *rand.Rand |
| uaRandOnce sync.Once |
| ) |
|
|
| func initUARand() { |
| uaRandOnce.Do(func() { |
| uaRand = rand.New(rand.NewSource(time.Now().UnixNano())) |
| }) |
| } |
|
|
| |
| func RandomUserAgent() string { |
| initUARand() |
| spec := userAgentSpecs[uaRand.Intn(len(userAgentSpecs))] |
|
|
| version := spec.MinVersion |
| if spec.MaxVersion > spec.MinVersion { |
| version += uaRand.Intn(spec.MaxVersion - spec.MinVersion + 1) |
| } |
|
|
| |
| placeholders := strings.Count(spec.Template, "%d") |
| switch placeholders { |
| case 1: |
| return fmt.Sprintf(spec.Template, version) |
| default: |
| |
| return fmt.Sprintf(strings.Replace(spec.Template, "%d", "%v", -1), version) |
| } |
| } |
|
|