
    i                     J    d Z ddlZddlZddlZdZdZd Z G d d          ZdS )uw   
[CYBER-STRAT] Client Wikidata — donnees structurees
API gratuite, zero cle requise
Agent responsable : DATA_SCRAPER
    Nz"https://www.wikidata.org/w/api.php   c                 0    t          d|  d|            dS )z#Log prefixe pour le module Wikidataz[CYBER-STRAT][WIKIDATA][z] N)print)levelmessages     5/var/www/cyber-strat/agents_python/wikidata_client.py_logr	      s'    	
7U
7
7g
7
788888    c                   Z    e Zd ZdZdddddddd	d
dddddddZddZddZddZd Zd Z	dS )WikidataClientu   Client pour l'API Wikidata — donnees structurees
    Fournit nationalite, profession, dates, description
    pour enrichir les resultats du pipeline multi-sources
    instance_ofnationality
occupation
birth_date
death_datebirth_placedeath_placeemployerpositioncountrycapital	continent
population	inceptionheadquarters)P31P27P106P569P570P19P20P108P39P17P36P30P1082P571P159frc                     |                      ||          }|st          dd| d           dS |                     ||          }|rt          dd| d| d           |S )	zRecuperer les donnees structurees pour une entite
        Point d'entree principal du client
        Retourne None si entite non trouvee
        WARNzEntite non trouvee: ''NINFOzDonnees recuperees pour 'z' ())_search_entityr	   _get_entity)selfquerylang	entity_iddatas        r   get_structured_dataz"WikidataClient.get_structured_data0   s    
 ''t44	 	9999:::4	400 	MKUKKyKKKLLLr
   c                    t           j                            d||ddd          }t           d| }|                     |          }|r|                    d          sdS |d         d                             d	          S )
ziRechercher une entite Wikidata par nom
        Retourne le premier entity_id (ex: Q7747) ou None
        wbsearchentitiesjson   )actionsearchlanguageformatlimit?r>   Nr   id)urllibparse	urlencodeWIKIDATA_API_fetchget)r3   r4   r5   paramsurlresults         r   r1   zWikidataClient._search_entity?   s     ''()
 )
   ((((S!! 	VZZ11 	4h"&&t,,,r
   c                 L   t           j                            d|| dddd          }t           d| }|                     |          }|rd|vrdS |d                             |i           }|                    d	i           }|                    |i                               d
          p*|                    di                               d
          pd}|                    di           }	|	                    |i                               d
          p*|	                    di                               d
          pd}
|                    di           }i }| j                                        D ]+\  }}||v r"|                     ||                   }|r|||<   ,|||
|dS )z6Recuperer les details d'une entite par son ID Wikidatawbgetentitiesz|enr;   zdescriptions|claims|labels)r=   ids	languagesr@   propsrB   entitiesNlabelsvalueen descriptionsclaims)wikidata_idlabeldescription
properties)	rD   rE   rF   rG   rH   rI   PROPSitems_extract_claim_values)r3   r6   r5   rJ   rK   rL   entityrS   rZ   rW   r[   rX   
structuredprop_id	prop_namevaluess                   r   r2   zWikidataClient._get_entityR   s   ''% 1)
 )
   ((((S!! 	6114
#''	266 Hb))JJtR  $$W-- zz$##''00 	 zz."55T2&&**733 b))--g66 	 Hb))
"&*"2"2"4"4 	3 	3GY&  33F7ODD 3,2Jy) %&$	
 
 	
r
   c                    g }|dd         D ]P}|                     di           }|                     di           }|                     dd          }|dk    r0|                    |d                              d	d                     {|d
k    r|                    |d                    |dk    rc|d                              dd          }|rC|                    d                              d          d         }|                    |           |dk    rD|d                              dd          }	|                    |	                    d                     R|r|ndS )zExtraire les valeurs d'une propriete Wikidata
        Gere les types : entity-id, string, time, quantity
        Max 3 valeurs par propriete
        N   mainsnak	datavaluetyperV   zwikibase-entityidrT   rC   stringtime+-r   quantityamount)rI   appendlstripsplit)
r3   rX   rd   claimrg   rh   vtypetime_valyearro   s
             r   r_   z$WikidataClient._extract_claim_values   si   
 BQBZ 	2 	2EyyR00H ["55IMM&"--E+++i044T2>>????(""i01111&$W-11&"== (#??3//55c::1=DMM$'''*$$"7+//"==fmmC00111)vvT)r
   c                    	 t           j                            |ddi          }t           j                            |t                    5 }t          j        |                                                    d                    cddd           S # 1 swxY w Y   dS # t          $ r}t          dd|            Y d}~dS d}~ww xY w)	z`Requete HTTP GET vers l'API Wikidata
        Timeout 5 secondes, gestion erreurs propre
        z
User-Agentz2CyberStrat/1.0 (console-intelligence-geopolitique))headers)timeoutzutf-8NERRORzEchec requete Wikidata: )rD   requestRequesturlopenFETCH_TIMEOUTr;   loadsreaddecode	Exceptionr	   )r3   rK   reqrespes        r   rH   zWikidataClient._fetch   s   	.((R7(  C '']'CC ?tz$))++"4"4W"="=>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 	 	 	8Q8899944444	s<   A	B 9BB BB BB 
C(CCN)r+   )
__name__
__module____qualname____doc__r]   r8   r1   r2   r_   rH    r
   r   r   r      s           E$   - - - -&/
 /
 /
 /
b* * *@    r
   r   )	r   urllib.requestrD   urllib.parser;   rG   r~   r	   r   r   r
   r   <module>r      s              49 9 9
X X X X X X X X X Xr
   