
    0iH                        d Z ddlmZ ddlZddlmZmZ ddlZddlm	Z	 dZ
dZ G d d	e      Z G d
 d      ZddZddZy)u2  Google Patents arama — public XHR JSON endpoint.

patents.google.com'un kendi web UI'ı `https://patents.google.com/xhr/query?url=...`
public JSON endpoint'ine istek atar. Normal tarayıcı trafiği gibi çalışır.

Önemli:
- Hukuki yarı-gri alan — Google ToS scraping'e izin vermez ama XHR endpoint
  tarayıcı UI'ının kendisinin kullandığı public endpoint'tir. Rate-limit'e
  saygılı ol (1 req/2s), ek "resmi" kaynak olarak EPO'yu önce dene.
- Production'da: optional flag (ENABLE_GOOGLE_PATENTS=false default) ile
  kapatılabilir.
- Fallback için kullanışlı: EPO'da olmayan USPTO/CN başvurularına erişim.

Response schema (reverse engineered):
{
  "results": {
    "cluster": [
      {"result": [
        {"patent": {"publication_number": "US9876543B2",
                    "title": "...",
                    "snippet": "...",
                    "priority_date": "2019-03-15",
                    "publication_date": "2021-05-20",
                    "assignee": "...",
                    "inventor": [...]}},
        ...
      ]}
    ]
  }
}
    )annotationsN)quote	urlencode)PriorArtHitz$https://patents.google.com/xhr/queryzuMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                      e Zd ZdZy)GooglePatentsErroru$   Google Patents HTTP / parse hatası.N)__name__
__module____qualname____doc__     D/var/www/ai.patentyazar.com/app/services/prior_art/google_patents.pyr   r   1   s    .r   r   c                  H    e Zd ZdZddd	 	 	 	 	 ddZddZdddd	Zdd
Zy)GooglePatentsClientu   Google Patents XHR endpoint üzerinden arama.

    Rate-limit: bloke olmayı önlemek için `min_interval_seconds` kadar bekler.
    Ng       @)http_clientmin_interval_secondsc                   |d u| _         |xs t        j                  ddt        i      | _        || _        t        j                         | _        d| _	        y )Ng      .@z
User-Agent)timeoutheadersg        )
_external_clienthttpxAsyncClient_USER_AGENT_http_min_intervalasyncioLock_lock_last_request_at)selfr   r   s      r   __init__zGooglePatentsClient.__init__;   sT     !,4 7  
E$5$5!;/%

 2\\^
'*r   c                n   K   | j                   s#| j                  j                          d {    y y 7 w)N)r   r   aclose)r!   s    r   closezGooglePatentsClient.closeJ   s-     $$**##%%% %%s   *535
   limitc               2  K   | j                          d{    t        |t        |d      d      }t         dt	        |       }	 | j
                  j                  |       d{   }|j                  dk7  r(t        d|j                   d|j                  dd        	 |j                         }t        t        ||
            S 7 7 d# t        j                  $ r}t        d|       |d}~ww xY w# t        $ r}t        d	|       |d}~ww xY ww)u   Google Patents arama (source='google').

        Args:
            query: Doğal dil veya Google Patents advanced syntax
                (ör. '(post-quantum) cryptography', 'inventor:Smith').
            limit: 1-50.
        N2   )qnumz?url=u   HTTP hatası:    zGoogle Patents HTTP z: u   JSON parse hatası: r'   )_respect_rate_limitr   min_SEARCH_URLr   r   getr   	HTTPErrorr   status_codetextjson
ValueErrorlist_parse_google_response)r!   queryr(   inner_params	outer_urlresponseexcdatas           r   searchzGooglePatentsClient.searchN   s"     &&((( uS^!DE"m5|)<(=>		F!ZZ^^I66H 3&$&x';';&<Bx}}Tc?R>ST 	L==?D *4u=>>) 	) 7 	F$~cU%;<#E	F  	L$';C5%ABK	Lsi   DC	0DC &C'C +7D#C7 3DC C4 C//C44D7	D DDDc                  K   | j                   4 d {    t        j                         j                         }| j                  | j
                  z   |z
  }|dkD  rt        j                  |       d {    t        j                         j                         | _        d d d       d {    y 7 7 >7 	# 1 d {  7  sw Y   y xY ww)Nr   )r   r   get_event_looptimer    r   sleep)r!   nowwaits      r   r.   z'GooglePatentsClient._respect_rate_limitl   s     :: 	D 	D((*//1C))D,>,>>#EDaxmmD)))$+$:$:$<$A$A$CD!	D 	D 	D *		D 	D 	D 	DsW   CB0CAB63B24+B6C*B4+C2B64C6C<B?=CC)r   zhttpx.AsyncClient | Noner   floatreturnNone)rG   rH   )r9   strr(   intrG   list[PriorArtHit])r	   r
   r   r   r"   r%   r?   r.   r   r   r   r   r   5   sG     15&)	+ .+ $	+
 
+& 8: ?<Dr   r   c               2   | j                  di       j                  dg       }g }|D ]m  }|j                  dg       D ]V  }|j                  d      }t        |t              s%t        |      }|r|j	                  |       t        |      |k\  sR|c c S  o |S )u4   Google Patents XHR response → PriorArtHit listesi.resultsclusterresultpatent)r1   
isinstancedict_parse_single_patentappendlen)r>   r(   clustershitsrN   rO   rP   hits           r   r8   r8   x   s    xx	2&**9b9H D 	kk(B/ 	FZZ)Ffd+&v.CC 4yE!		 Kr   c                   | j                  d      }|sy | j                  d      xs g }d }t        |t              r|D cg c]  }|st        |       }}nt        |t              r|g}| j                  d      }d }t        |t              r|rt        |d         }nt        |t              r|}t	        d|| j                  d      | j                  d      ||| j                  d      | j                  d	      d d
| 
      S c c}w )Npublication_numberinventorassigneer   googletitlesnippetpriority_datepublication_datez"https://patents.google.com/patent/)
source	patent_nor^   abstract	applicant	inventorsfiling_datera   cpc_classesurl)r1   rQ   r7   rI   r   )rP   pub_noinventors_rawrf   iassignee_rawre   s          r   rS   rS      s    ZZ,-FJJz*0bM"&I-&%28aSV8	8	M3	'"O	::j)L I,%,Q(		L#	& 	jj!I&JJ/$6709  9s    DD)r>   rR   r(   rJ   rG   rK   )rP   rR   rG   zPriorArtHit | None)r   
__future__r   r   urllib.parser   r   r   app.services.prior_art.modelsr   r0   r   RuntimeErrorr   r   r8   rS   r   r   r   <module>rr      sN   @ #  )  549 / /=D =DF$r   