web_parser/document/
user.rs

1use crate::prelude::*;
2use rand::Rng;
3
4static RAND_USERS: Lazy<(Vec<User>, usize)> = Lazy::new(|| {
5    let users = vec![
6        User::ChromeWindows,
7        User::ChromeMac,
8        User::ChromeLinux,
9
10        User::FirefoxWindows,
11        User::FirefoxMac,
12        User::FirefoxLinux,
13
14        User::EdgeWindows,
15        User::EdgeMac,
16
17        User::OperaWindows,
18        User::OperaMac,
19        User::OperaLinux,
20
21        User::YandexWindows,
22        User::YandexLinux,
23    ];
24
25    let len = users.len();
26    
27    (users, len)
28});
29
30/// The HTTP request User-Agent
31#[derive(Debug, Display, Clone, Eq, PartialEq)]
32pub enum User {
33    #[display = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
34AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]
35    ChromeWindows,
36
37    #[display = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) \
38AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]
39    ChromeMac,
40
41    #[display = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 \
42(KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]
43    ChromeLinux,
44
45    #[display = "Mozilla/5.0 (Linux; Android 13; Pixel 6) AppleWebKit/537.36 \
46(KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36"]
47    ChromeAndroid,
48
49    #[display = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:114.0) Gecko/20100101 Firefox/114.0"]
50    FirefoxWindows,
51
52    #[display = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:114.0) Gecko/20100101 Firefox/114.0"]
53    FirefoxMac,
54
55    #[display = "Mozilla/5.0 (X11; Linux x86_64; rv:114.0) Gecko/20100101 Firefox/114.0"]
56    FirefoxLinux,
57
58    #[display = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
59AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.0.0"]
60    EdgeWindows,
61
62    #[display = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) \
63AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.0.0"]
64    EdgeMac,
65
66    #[display = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 \
67(KHTML, like Gecko) Version/16.0 Safari/605.1.15"]
68    SafariMac,
69
70    #[display = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 \
71(KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1"]
72    SafariIOS,
73
74    #[display = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
75(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/120.0.0.0"]
76    OperaWindows,
77
78    #[display = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 \
79(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/120.0.0.0"]
80    OperaMac,
81
82    #[display = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 \
83(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/120.0.0.0"]
84    OperaLinux,
85
86    #[display = "Mozilla/5.0 (Linux; Android 13; Pixel 6) AppleWebKit/537.36 \
87(KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36 OPR/120.0.0.0"]
88    OperaAndroid,
89
90    #[display = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
91(KHTML, like Gecko) Chrome/114.0.0.0 YaBrowser/24.0.0.0 Safari/537.36"]
92    YandexWindows,
93
94    #[display = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 \
95(KHTML, like Gecko) Chrome/114.0.0.0 YaBrowser/24.0.0.0 Safari/537.36"]
96    YandexLinux,
97
98    #[display = "Mozilla/5.0 (Linux; Android 13; Pixel 6) AppleWebKit/537.36 \
99(KHTML, like Gecko) Chrome/114.0.0.0 YaBrowser/24.0.0.0 Mobile Safari/537.36"]
100    YandexAndroid,
101
102    #[display = "{0}"]
103    Custom(String)
104}
105
106impl User {
107    /// Get random PC User-Agent
108    pub fn random() -> Self {
109        let index = rand::rng().random_range(0..RAND_USERS.1);
110        RAND_USERS.0[index].clone()
111    }
112}