summaryrefslogtreecommitdiff
path: root/modules/headers/versions.go
blob: eae19f64dff2986833df4111dcdec65678b1724d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

package headers

import (
	_ "embed"
	"fmt"
	"math/rand"
	"strings"
)

//go:generate bash -c "flyscrape run ../../examples/useragents/chrome.js | jq -r '[.[].data] | flatten | .[]' | sort -nr | uniq > versions_chrome.txt"
//go:generate bash -c "flyscrape run ../../examples/useragents/firefox.js | jq -r '[.[].data] | flatten | .[]' | sort -nr | uniq > versions_firefox.txt"
//go:generate bash -c "flyscrape run ../../examples/useragents/edge.js | jq -r '[.[].data] | flatten | .[]' | sort -nr | uniq > versions_edge.txt"
//go:generate bash -c "flyscrape run ../../examples/useragents/opera.js | jq -r '[.[].data] | flatten | .[]' | sort -nr | uniq > versions_opera.txt"

//go:embed versions_chrome.txt
var versionsChromeRaw string
var versionsChrome = strings.Split("\n", strings.TrimSpace(versionsChromeRaw))

//go:embed versions_firefox.txt
var versionsFirefoxRaw string
var versionsFirefox = strings.Split("\n", strings.TrimSpace(versionsFirefoxRaw))

//go:embed versions_edge.txt
var versionsEdgeRaw string
var versionsEdge = strings.Split("\n", strings.TrimSpace(versionsEdgeRaw))

//go:embed versions_opera.txt
var versionsOperaRaw string
var versionsOpera = strings.Split("\n", strings.TrimSpace(versionsOperaRaw))

//go:embed versions_macos.txt
var versionsMacOSRaw string
var versionsMacOS = strings.Split("\n", strings.TrimSpace(versionsMacOSRaw))

//go:embed versions_windows.txt
var versionsWindowsRaw string
var versionsWindows = strings.Split("\n", strings.TrimSpace(versionsWindowsRaw))

//go:embed versions_linux.txt
var versionsLinuxRaw string
var versionsLinux = strings.Split("\n", strings.TrimSpace(versionsLinuxRaw))

func randomUAChrome() string {
	f := "Mozilla/5.0 (%s) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36"
	return fmt.Sprintf(f, randomOS(), random(versionsChrome))
}

func randomUAFirefox() string {
	f := "Mozilla/5.0 (%s; rv:%s) Gecko/20100101 Firefox/%s"
	ver := random(versionsFirefox)
	return fmt.Sprintf(f, randomOS(), ver, ver)
}

func randomUAEdge() string {
	f := "Mozilla/5.0 (%s) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/%s"
	return fmt.Sprintf(f, randomOS(), random(versionsEdge))
}

func randomUAOpera() string {
	f := "Mozilla/5.0 (%s) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 OPR/"
	return fmt.Sprintf(f, randomOS(), random(versionsOpera))
}

func randomUserAgent() string {
	switch rand.Intn(4) {
	case 0:
		return randomUAChrome()
	case 1:
		return randomUAFirefox()
	case 2:
		return randomUAEdge()
	case 3:
		return randomUAOpera()
	}
	panic("rand.Intn is broken")
}

func randomOS() string {
	switch rand.Intn(3) {
	case 0:
		return random(versionsMacOS)
	case 1:
		return random(versionsWindows)
	case 2:
		return random(versionsLinux)
	}
	panic("rand.Intn is broken")
}

func random(ss []string) string {
	return ss[rand.Intn(len(ss))]
}