o
    h'-                     @   s   d dl Z d dlmZmZmZmZmZ d dlZG dd dZe	dkrne Z
ee
  ed ee
jddd	 ed
 ee
jdd ed ee
jdd ed ee
jddddd ed ee
jdddd dS dS )    N)OptionalLiteralListDictTuplec                   @   s   e Zd ZdZdd Zddedee fddZ									
dde	e
d  de	e de	e de	e
d  dedefddZdeeef fddZdd Zdedeeef fddZdedefddZd	S )UserAgentGeneratora|  
    Generate random user agents with specified constraints.
    
    Attributes:
        desktop_platforms (dict): A dictionary of possible desktop platforms and their corresponding user agent strings.
        mobile_platforms (dict): A dictionary of possible mobile platforms and their corresponding user agent strings.
        browser_combinations (dict): A dictionary of possible browser combinations and their corresponding user agent strings.
        rendering_engines (dict): A dictionary of possible rendering engines and their corresponding user agent strings.
        chrome_versions (list): A list of possible Chrome browser versions.
        firefox_versions (list): A list of possible Firefox browser versions.
        edge_versions (list): A list of possible Edge browser versions.
        safari_versions (list): A list of possible Safari browser versions.
        ios_versions (list): A list of possible iOS browser versions.
        android_versions (list): A list of possible Android browser versions.
        
        Methods:
            generate_user_agent(
                platform: Literal["desktop", "mobile"] = "desktop",
                browser: str = "chrome",
                rendering_engine: str = "chrome_webkit",
                chrome_version: Optional[str] = None,
                firefox_version: Optional[str] = None,
                edge_version: Optional[str] = None,
                safari_version: Optional[str] = None,
                ios_version: Optional[str] = None,
                android_version: Optional[str] = None
            ): Generates a random user agent string based on the specified parameters.    
    c                 C   s   ddddddddd	d
d| _ ddddddddd| _dgdgdgdggddgddgddggg dg dgd| _ddg d d!| _g d"| _g d#| _g d$| _g d%| _d S )&Nz(Windows NT 10.0; Win64; x64)z(Windows NT 10.0; WOW64))10_6410_32z#(Macintosh; Intel Mac OS X 10_15_7)z+(Macintosh; Intel Mac OS X 10.15; rv:109.0))intelnewerz(X11; Linux x86_64)z(X11; Ubuntu; Linux x86_64)z(X11; CrOS x86_64 14541.0.0))genericubuntu	chrome_os)windowsmacoslinuxz(Linux; Android 13; SM-S901B)z(Linux; Android 12; Pixel 6)z"(Linux; Android 13; OnePlus 9 Pro)z(Linux; Android 12; M2102J20SG))samsungpixeloneplusxiaomiz*(iPhone; CPU iPhone OS 16_5 like Mac OS X)z!(iPad; CPU OS 16_5 like Mac OS X))iphoneipad)androidioschromefirefoxsafariedgegeckowebkit)r   r   r   )r   r   r   )         zAppleWebKit/537.36zAppleWebKit/605.1.15)Gecko/20100101r#   zGecko/2010010)chrome_webkitsafari_webkitr   )zChrome/119.0.6045.199zChrome/118.0.5993.117zChrome/117.0.5938.149zChrome/116.0.5845.187zChrome/115.0.5790.171)zEdg/119.0.2151.97zEdg/118.0.2088.76zEdg/117.0.2045.47zEdg/116.0.1938.81zEdg/115.0.1901.203)zSafari/537.36zSafari/605.1.15zSafari/604.1zSafari/602.1zSafari/601.5.17)
zFirefox/119.0zFirefox/118.0.2zFirefox/117.0.1zFirefox/116.0zFirefox/115.0.3zFirefox/114.0.2zFirefox/113.0.1zFirefox/112.0zFirefox/111.0.1zFirefox/110.0)desktop_platformsmobile_platformsbrowser_combinationsrendering_engineschrome_versionsedge_versionssafari_versionsfirefox_versions)self r/   Z/var/www/Befach/backend/venv/lib/python3.10/site-packages/crawl4ai/user_agent_generator.py__init__#   sR   


	zUserAgentGenerator.__init__r    num_browsersreturnc                 C   s   || j vrtd| t| j | }g }|D ]V}|dkr(|t| j q|dkr6|t| j q|dkrD|t| j q|dkrR|t| j q|dkrb|t| j	d  q|dkrn|| j	d  q|S )	a  
        Get a valid combination of browser versions.
        
        How it works:
        1. Check if the number of browsers is supported.
        2. Randomly choose a combination of browsers.
        3. Iterate through the combination and add browser versions.
        4. Return the browser stack.
        
        Args:
            num_browsers: Number of browser specifications (1-3)
            
        Returns:
            List[str]: A list of browser versions.
        z Unsupported number of browsers: r   r   r   r   r   r   r$   )
r(   
ValueErrorrandomchoiceappendr*   r-   r,   r+   r)   )r.   r2   combinationbrowser_stackbrowserr/   r/   r0   get_browser_stack   s&   
z$UserAgentGenerator.get_browser_stackNr"   device_type)desktopmobileos_typedevice_brandbrowser_typer   r   r   r   c           	      C   s   |  |||}d|g}| |}dt|v r"|t| jd  ndt|v s.dt|v r;|| jd  |d || d|S )	a  
        Generate a random user agent with specified constraints.
        
        Args:
            device_type: 'desktop' or 'mobile'
            os_type: 'windows', 'macos', 'linux', 'android', 'ios'
            device_brand: Specific device brand
            browser_type: 'chrome', 'edge', 'safari', or 'firefox'
            num_browsers: Number of browser specifications (1-3)
        zMozilla/5.0Firefoxr   ChromeSafarir$   z(KHTML, like Gecko) )	get_random_platformr;   strr7   r5   r6   r)   extendjoin)	r.   r<   r?   r@   rA   r2   platform
componentsr9   r/   r/   r0   generate   s   



zUserAgentGenerator.generatec                 K   s"   | j di |}| |}||fS )z2Generate both user agent and matching client hintsNr/   )rM   generate_client_hints)r.   kwargs
user_agentclient_hintsr/   r/   r0   generate_with_client_hints   s   
z-UserAgentGenerator.generate_with_client_hintsc                 C   s   |dkr| j n|dkr| jni | j | j}|r-| j | jfD ]}||v r,||| i} nqtt| }|rD||| v rD|| | S tt||  S )z9Helper method to get random platform based on constraintsr=   r>   )r&   r'   r5   r6   listkeysvalues)r.   r<   r?   r@   	platformsplatform_groupos_keyr/   r/   r0   rG      s   z&UserAgentGenerator.get_random_platformrP   c                 C   sF   ddddd}i }|  D ]\}}t||}|r |d||< q|S )zDParse a user agent string to extract browser and version informationzChrome/(\d+)z	Edg/(\d+)zVersion/(\d+)zFirefox/(\d+)rB   r    )itemsresearchgroup)r.   rP   browsersresultr:   patternmatchr/   r/   r0   parse_user_agent   s   z#UserAgentGenerator.parse_user_agentc                 C   s   |  |}g }d|v r7|d|d  d |d d|v r+|d|d  d n&|d|d  d nd|v r=d	S d
|v rQ|d|d
  d |d d|S )z:Generate Sec-CH-UA header value based on user agent stringr   z"Chromium";v=""z"Not_A Brand";v="8"r   z"Microsoft Edge";v="z"Google Chrome";v="r   z""r   z"Safari";v="z, )ra   r7   rJ   )r.   rP   r]   hintsr/   r/   r0   rN      s   



z(UserAgentGenerator.generate_client_hints)r    )NNNNr"   )__name__
__module____qualname____doc__r1   intr   rH   r;   r   r   rM   r   rR   rG   r   ra   rN   r/   r/   r/   r0   r      s4    d'


%r   __main__z
Single browser (Chrome):r    r   )r2   rA   z
Two browsers (Gecko/Firefox):r!   )r2   z%
Three browsers (Chrome/Safari/Edge):r"   z
Firefox on Linux:r=   r   r   )r<   r?   rA   r2   z
Chrome/Safari/Edge on Windows:r   )r<   r?   r2   )r5   typingr   r   r   r   r   rZ   r   rd   	generatorprintrM   r/   r/   r/   r0   <module>   s:      