Toolbelt fingerprint functions - Doc strings and type annotations stuff

This commit is contained in:
Karim shoair
2024-11-03 23:31:09 +02:00
parent e270b00811
commit 544d23b696
2 changed files with 25 additions and 13 deletions
-1
View File
@@ -2,7 +2,6 @@ from .fingerprints import (
get_os_name, get_os_name,
generate_headers, generate_headers,
generate_convincing_referer, generate_convincing_referer,
generate_suitable_fingerprint,
) )
from .custom import ( from .custom import (
Response, Response,
+25 -12
View File
@@ -4,27 +4,32 @@ Functions related to generating headers and fingerprints generally
import platform import platform
from scrapling.core._types import Union, Dict
from tldextract import extract from tldextract import extract
from browserforge.fingerprints import FingerprintGenerator
from browserforge.headers import HeaderGenerator, Browser from browserforge.headers import HeaderGenerator, Browser
from browserforge.fingerprints import FingerprintGenerator, Fingerprint
def generate_convincing_referer(url): def generate_convincing_referer(url: str) -> str:
""" """Takes the domain from the URL without the subdomain/suffix and make it look like you were searching google for this website
Takes the domain from the URL without the subdomain/suffix and make it look like you were searching google for this website
>>> generate_convincing_referer('https://www.somewebsite.com/blah') >>> generate_convincing_referer('https://www.somewebsite.com/blah')
'https://www.google.com/search?q=somewebsite' 'https://www.google.com/search?q=somewebsite'
:param url: The URL you are about to fetch. :param url: The URL you are about to fetch.
:return: :return: Google's search URL of the domain name
""" """
website_name = extract(url).domain website_name = extract(url).domain
return f'https://www.google.com/search?q={website_name}' return f'https://www.google.com/search?q={website_name}'
def get_os_name(): def get_os_name() -> Union[str, None]:
# Get the OS name in the same format needed for browserforge """Get the current OS name in the same format needed for browserforge
:return: Current OS name or `None` otherwise
"""
#
os_name = platform.system() os_name = platform.system()
return { return {
'Linux': 'linux', 'Linux': 'linux',
@@ -35,17 +40,25 @@ def get_os_name():
}.get(os_name) }.get(os_name)
def generate_suitable_fingerprint(): def generate_suitable_fingerprint() -> Fingerprint:
# This would be for Browserforge playwright injector """Generates a browserforge's fingerprint that matches current OS, desktop device, and Chrome with version 128 at least.
os_name = get_os_name()
This function was originally created to test Browserforge's injector.
:return: `Fingerprint` object
"""
return FingerprintGenerator( return FingerprintGenerator(
browser=[Browser(name='chrome', min_version=128)], browser=[Browser(name='chrome', min_version=128)],
os=os_name, # None is ignored os=get_os_name(), # None is ignored
device='desktop' device='desktop'
).generate() ).generate()
def generate_headers(browser_mode=False): def generate_headers(browser_mode: bool = False) -> Dict:
"""Generate real browser-like headers using browserforge's generator
:param browser_mode: If enabled, the headers created are used for playwright so it have to match everything
:return: A dictionary of the generated headers
"""
if browser_mode: if browser_mode:
# In this mode we don't care about anything other than matching the OS and the browser type with the browser we are using # In this mode we don't care about anything other than matching the OS and the browser type with the browser we are using
# So we don't raise any inconsistency red flags while websites fingerprinting us # So we don't raise any inconsistency red flags while websites fingerprinting us