
    g'-                        d dl Z d dlmZmZmZmZmZ d dlZ G d d      Ze	dk(  r e       Z
 ee
j                                 ed        ee
j                  dd	              ed
        ee
j                  d              ed        ee
j                  d              ed        ee
j                  dddd              ed        ee
j                  ddd             yy)    N)OptionalLiteralListDictTuplec                       e Zd ZdZd Zddedee   fdZ	 	 	 	 	 dde	e
d      d	e	e   d
e	e   de	e
d      dedefdZdeeef   fdZd Zdedeeef   fdZdedefdZy)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                     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%| _        y )&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)selfs    R/var/www/openai/venv/lib/python3.12/site-packages/crawl4ai/user_agent_generator.py__init__zUserAgentGenerator.__init__#   s     93
 ?F
 17;"
$ ;7?;	 G;!
  

	 )$8$8$ -.%
!( 23"
 

 
!
    num_browsersreturnc                    || j                   vrt        d|       t        j                  | j                   |         }g }|D ]0  }|dk(  r/|j	                  t        j                  | j
                               8|dk(  r/|j	                  t        j                  | j                               l|dk(  r/|j	                  t        j                  | j                               |dk(  r/|j	                  t        j                  | j                               |dk(  r3|j	                  t        j                  | j                  d                |dk(  s|j	                  | j                  d          3 |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-   r0   r/   r.   r,   )r1   r5   combinationbrowser_stackbrowsers        r2   get_browser_stackz$UserAgentGenerator.get_browser_stack   s4     t888?~NOOmmD$=$=l$KL"G("$$V]]43G3G%HII%$$V]]43H3H%IJH$$$V]]43G3G%HIF"$$V]]43E3E%FGG#$$V]]43I3I'3R%STH$$$T%;%;O%LM # r4   Ndevice_type)desktopmobileos_typedevice_brandbrowser_typer   r    r   r   c                    | j                  |||      }d|g}| j                  |      }dt        |      v r2|j                  t	        j
                  | j                  d                nIdt        |      v sdt        |      v r/|j                  | j                  d          |j                  d       |j                  |       dj                  |      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?   strr;   r9   r:   r,   extendjoin)	r1   r@   rC   rD   rE   r5   platform
componentsr=   s	            r2   generatezUserAgentGenerator.generate   s    " ++K,O $X.
 ..|< M**fmmD,B,B7,KLM]++x3};M/Md44_EF34 	-(xx
##r4   c                 P     | j                   di |}| j                  |      }||fS )z2Generate both user agent and matching client hints )rR   generate_client_hints)r1   kwargs
user_agentclient_hintss       r2   generate_with_client_hintsz-UserAgentGenerator.generate_with_client_hints   s0    "T]],V,
11*=<''r4   c                    |dk(  r| j                   n*|dk(  r| j                  ni | j                   | j                  }|r*| j                   | j                  fD ]  }||v s|||   i} n t        j                  t	        |j                                     }|r|||   v r||   |   S t        j                  t	        ||   j                                     S )z9Helper method to get random platform based on constraintsrA   rB   )r)   r*   r9   r:   listkeysvalues)r1   r@   rC   rD   	platformsplatform_groupos_keys          r2   rL   z&UserAgentGenerator.get_random_platform   s    .9Y.FD**,78,C4((Fd,,F0E0EF 	 #'#9#94;P;P"Qn,!(.*A BI #R
 tINN$456LIf,==V$\22}}T)F"3":":"<=>>r4   rW   c                     ddddd}i }|j                         D ]2  \  }}t        j                  ||      }|s|j                  d      ||<   4 |S )zDParse a user agent string to extract browser and version informationzChrome/(\d+)z	Edg/(\d+)zVersion/(\d+)zFirefox/(\d+)rF   r#   )itemsresearchgroup)r1   rW   browsersresultr>   patternmatchs          r2   parse_user_agentz#UserAgentGenerator.parse_user_agent   s_     & &'	
  ( 0GWIIgz2E"'++a.w !1
 r4   c                 t   | j                  |      }g }d|v r_|j                  d|d    d       |j                  d       d|v r|j                  d|d    d       nK|j                  d|d    d       n2d|v ry	d
|v r)|j                  d|d
    d       |j                  d       dj                  |      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, )rj   r;   rO   )r1   rW   rf   hintss       r2   rU   z(UserAgentGenerator.generate_client_hints   s    ((4  xLL>(8*<)=Q?@LL./!3HV4D3EQGH28H3E2FaHI("!LL<(:';1=>LL./yyr4   )r#   )NNNNr%   )__name__
__module____qualname____doc__r3   intr   rM   r?   r   r   rR   r   rY   rL   r   rj   rU   rT   r4   r2   r	   r	      s    8b
H$c $$s) $N GK)-.2Y]$%#$%g.A&BC#$!##$ 'sm#$ 'w/T'UV	#$
 "#$
 +.#$J(eCHo (?"3 4S> "     r4   r	   __main__z
Single browser (Chrome):r#   r   )r5   rE   z
Two browsers (Gecko/Firefox):r$   )r5   z%
Three browsers (Chrome/Safari/Edge):r%   z
Firefox on Linux:rA   r   r   )r@   rC   rE   r5   z
Chrome/Safari/Edge on Windows:r   )r@   rC   r5   )r9   typingr   r   r   r   r   rc   r	   rn   	generatorprintrR   rT   r4   r2   <module>rw      s    7 7 	N  N b z"$I	)


	
&'	)

!(

CD	
+,	)

!

,-	
23	)

!

,-	
 	)

	    

,-	)

   - r4   