
    :j                     @    d Z ddlZddlmZ ddlmZmZ  G d d      Zy)an  
User-Agent Manager

This module manages User-Agent strings with random load balancing.
It provides thread-safe access to multiple User-Agent strings for web scraping.

Key Features:
- Random User-Agent selection (default strategy)
- Thread-safe User-Agent access
- Usage statistics and monitoring
- Easy User-Agent list updates
- Built-in common User-Agent strings
    N)List   )BalancerStrategyc                       e Zd ZdZdee   fdZdefdZdefdZdefdZ	dee   ddfd	Z
d
eddfdZd
edefdZddZdefdZdee   fdZdefdZdefdZdefdZdefdZdefdZedd       Zy)Agentsz-User-Agent manager with random load balancinguser_agentsc                     |st        d      |j                         | _        t        | j                  t        j
                        | _        t        j                         | _	        d| _
        y)ziInitialize User-Agent manager

        Args:
            user_agents: List of User-Agent strings
         User agents list cannot be emptyr   N)
ValueErrorcopyr	   r   r   RANDOMbalancer	threadingLocklocktotal_requestsselfr	   s     2/root/.openclaw/workspace/harvester/tools/agent.py__init__zAgents.__init__   sT     ?@@&++- !!1!18??CNN$	    returnc                     | j                   5  | xj                  dz  c_        | j                  j                         cddd       S # 1 sw Y   yxY w)zaGet random User-Agent string

        Returns:
            str: Random User-Agent string
        r   N)r   r   r   getr   s    r   r   z
Agents.get+   sA     YY 	'1$==$$&	' 	' 	's   /AAc                 "    | j                         S )zkAlias for get() method for convenience

        Returns:
            str: Random User-Agent string
        r   r   s    r   nextzAgents.next5        xxzr   c                 "    | j                         S )zxGet random User-Agent string (explicit method name)

        Returns:
            str: Random User-Agent string
        r   r   s    r   
get_randomzAgents.get_random=   r    r   Nc                     |st        d      | j                  5  |j                         | _        | j                  j                  | j                         ddd       y# 1 sw Y   yxY w)znUpdate User-Agent strings list

        Args:
            user_agents: New list of User-Agent strings
        r   N)r   r   r   r	   r   update_itemsr   s     r   update_agentszAgents.update_agentsE   sX     ?@@YY 	9*//1DMM&&t'7'78	9 	9 	9s   ;AA'
user_agentc                     |st        d      | j                  5  || j                  vr@| j                  j                  |       | j                  j                  | j                         ddd       y# 1 sw Y   yxY w)zdAdd a new User-Agent string

        Args:
            user_agent: User-Agent string to add
        zUser agent cannot be emptyN)r   r   r	   appendr   r$   r   r&   s     r   	add_agentzAgents.add_agentR   si     9::YY 	=!1!11  ''
3**4+;+;<	= 	= 	=s   AA22A;c                 (   | j                   5  || j                  v rbt        | j                        dkD  rJ| j                  j                  |       | j                  j                  | j                         	 ddd       y	 ddd       y# 1 sw Y   yxY w)zRemove a User-Agent string

        Args:
            user_agent: User-Agent string to remove

        Returns:
            bool: True if removed, False if not found
        r   NTF)r   r	   lenremover   r$   r)   s     r   remove_agentzAgents.remove_agent`   s~     YY 	T---#d6F6F2G!2K  ''
3**4+;+;<		 	
 	 	 	s   A(B>BBc                     | j                   5  d| _        | j                  j                          ddd       y# 1 sw Y   yxY w)zReset usage statisticsr   N)r   r   r   resetr   s    r   reset_statszAgents.reset_statsp   s6    YY 	""#DMM!	" 	" 	"s	   "8Ac                     | j                   5  | j                  j                         }| j                  |d<   |cddd       S # 1 sw Y   yxY w)zRGet usage statistics

        Returns:
            dict: Usage statistics
        r   N)r   r   	get_statsr   )r   statss     r   r3   zAgents.get_statsv   sF     YY 	MM++-E&*&9&9E"#	 	 	s   +AAc                 z    | j                   5  | j                  j                         cddd       S # 1 sw Y   yxY w)z}Get copy of current User-Agent strings list

        Returns:
            List[str]: Copy of User-Agent strings list
        N)r   r	   r   r   s    r   get_agents_listzAgents.get_agents_list   s2     YY 	+##((*	+ 	+ 	+s   1:c                 ,    t        | j                        S ziGet number of User-Agent strings

        Returns:
            int: Number of User-Agent strings
        r,   r	   r   s    r   countzAgents.count        4##$$r   c                 2    t        | j                        dk(  S )zdCheck if User-Agent list is empty

        Returns:
            bool: True if list is empty
        r   r9   r   s    r   is_emptyzAgents.is_empty   s     4##$))r   c                 ,    t        | j                        S r8   r9   r   s    r   __len__zAgents.__len__   r;   r   c                 N    dt        | j                         d| j                   dS )zWString representation

        Returns:
            str: String representation
        zAgents(count=z, requests=))r,   r	   r   r   s    r   __str__zAgents.__str__   s-     s4#3#345[ATAT@UUVWWr   c                 "    d| j                    dS )zbDetailed string representation

        Returns:
            str: Detailed representation
        zAgents(user_agents=rA   )r	   r   s    r   __repr__zAgents.__repr__   s     %T%5%5$6a88r   c                     g d} | |      S )zCreate Agents instance with default User-Agent strings

        Returns:
            Agents: Agents instance with default User-Agents
        )zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36zuMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36zeMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36zPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0zuMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15zFMozilla/5.0 (X11; Linux x86_64; rv:132.0) Gecko/20100101 Firefox/132.0 )clsdefault_agentss     r   create_defaultzAgents.create_default   s    
 >""r   )r   N)r   r   )__name__
__module____qualname____doc__r   strr   r   r   r"   r%   r*   boolr.   r1   dictr3   r6   intr:   r=   r?   rB   rD   classmethodrI   rF   r   r   r   r      s    7 DI  "'S 'c C 9c 9t 9=C =D =s t  "	4 	+c +%s %*$ *% %X X9# 9 # #r   r   )rM   r   typingr   r   r   r   r   rF   r   r   <module>rT      s!      (k# k#r   