Generate realistic looking or browser-like HTTP headers.
| 24 | |
| 25 | @docs_group('Other') |
| 26 | class HeaderGenerator: |
| 27 | """Generate realistic looking or browser-like HTTP headers.""" |
| 28 | |
| 29 | def __init__(self) -> None: |
| 30 | self._generator = BrowserforgeHeaderGenerator() |
| 31 | |
| 32 | def _select_specific_headers(self, all_headers: dict[str, str], header_names: set[str]) -> HttpHeaders: |
| 33 | return HttpHeaders({key: value for key, value in all_headers.items() if key in header_names}) |
| 34 | |
| 35 | def get_specific_headers( |
| 36 | self, header_names: set[str] | None = None, browser_type: SupportedBrowserType = 'chrome' |
| 37 | ) -> HttpHeaders: |
| 38 | """Return subset of headers based on the selected `header_names`. |
| 39 | |
| 40 | If no `header_names` are specified, full unfiltered headers are returned. |
| 41 | """ |
| 42 | all_headers = self._generator.generate(browser_type=browser_type) |
| 43 | |
| 44 | if not header_names: |
| 45 | return HttpHeaders(all_headers) |
| 46 | return self._select_specific_headers(all_headers, header_names) |
| 47 | |
| 48 | def get_common_headers(self) -> HttpHeaders: |
| 49 | """Get common HTTP headers ("Accept", "Accept-Language"). |
| 50 | |
| 51 | We do not modify the "Accept-Encoding", "Connection" and other headers. They should be included and handled |
| 52 | by the HTTP client or browser. |
| 53 | """ |
| 54 | all_headers = self._generator.generate() |
| 55 | return self._select_specific_headers(all_headers, header_names={'Accept', 'Accept-Language'}) |
| 56 | |
| 57 | def get_random_user_agent_header(self) -> HttpHeaders: |
| 58 | """Get a random User-Agent header.""" |
| 59 | all_headers = self._generator.generate() |
| 60 | return self._select_specific_headers(all_headers, header_names={'User-Agent'}) |
| 61 | |
| 62 | def get_user_agent_header( |
| 63 | self, |
| 64 | *, |
| 65 | browser_type: SupportedBrowserType = 'chrome', |
| 66 | ) -> HttpHeaders: |
| 67 | """Get the User-Agent header based on the browser type.""" |
| 68 | if browser_type not in {'chrome', 'firefox', 'safari', 'edge'}: |
| 69 | raise ValueError(f'Unsupported browser type: {browser_type}') |
| 70 | all_headers = self._generator.generate(browser_type=browser_type) |
| 71 | return self._select_specific_headers(all_headers, header_names={'User-Agent'}) |
| 72 | |
| 73 | def get_sec_ch_ua_headers( |
| 74 | self, |
| 75 | *, |
| 76 | browser_type: SupportedBrowserType = 'chrome', |
| 77 | ) -> HttpHeaders: |
| 78 | """Get the sec-ch-ua headers based on the browser type.""" |
| 79 | if browser_type not in {'chrome', 'firefox', 'safari', 'edge'}: |
| 80 | raise ValueError(f'Unsupported browser type: {browser_type}') |
| 81 | all_headers = self._generator.generate(browser_type=browser_type) |
| 82 | return self._select_specific_headers( |
| 83 | all_headers, header_names={'sec-ch-ua', 'sec-ch-ua-mobile', 'sec-ch-ua-platform'} |
no outgoing calls