
    L9j"                        d Z ddlZddlmZmZmZ ddlZddlmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlmZmZ ej&                  j)                  ej&                  j+                  e            Z ej0                  d	d
d        eej&                  j3                  ed            Zej&                  j7                  ed         s"ej&                  j3                  eed         ed<   dD ]U  Zej;                  e      sej&                  j7                  ee         r4ej&                  j3                  eee         ee<   W dedefdZ ej@                  d      d        Z!dejD                  vr eed         ejD                  _#        ejH                  5   ejJ                  d        ejL                  d        ejN                  dddgd      Z( ejR                           ejT                  d        ejV                  dd d! e,ed"         d #      Z- ejV                  d$d%d& e,ed'               Z. ejV                  d(d d) e,ed*         d+      Z/ ej`                  d,d-j3                  ed.               Z1e1je                  d/      D  cg c]#  } | jg                         s| jg                         % c} Z4 ejj                  d0d12      rej@                  jm                          ej;                  d3      Z7e7rqej&                  jq                  e7      rV ejr                  e7      D ]A  Z:e:jw                  d4      s	  ejx                  ej&                  j3                  e7e:             C  ej|                          ddd       ejD                  jF                  D cg c]  }|j~                  s| c}Z?e?D cg c]  }|j                   c}ZAg i g cZBZCZDeAr e!eAe(e-      \  ZBZC eeBe.e/e4ed5   6      ZD ej                  g d7      \  ZFZGZHeF5   ej                  d8       eAs ej                  d9       neCj                         D cg c]  \  }}|j;                  d:      s| c}}ZLeCj                         D cg c]A  \  }}|j;                  d:      r|j;                  d;      s*|j;                  d<d      dk(  s@|C c}}ZMeCj                         D cg c]S  \  }}|j;                  d:      s=|j;                  d;      s,|j;                  d<d      dk(  r|j;                  d=d>      dk(  r|U c}}ZNeCj                         D cg c]S  \  }}|j;                  d:      s=|j;                  d;      s,|j;                  d<d      dk(  r|j;                  d=d>      dkD  r|U c}}ZOeLr. ej                  d?d-j3                  d@ eLD              z   dAz          eNr. ej                  dBd-j3                  dC eND              z   dDz          eMr+ ej                  dEd-j3                  dF eMD              z          eOr+ ejL                  dGd-j3                  dH eOD              z           eQeCj                         D cg c]  \  }}|j;                  d<d      dkD  s| c}}      ZR ejL                   eQeB       dIeR dJ eQeA       dKe- dL eQeD       	        eSeDd>      D ]  \  ZT\  ZUZV ej                  d1M      5   ej                  dNdOg      \  ZYZZeYj                  dPeT        eZ5   ej                  dQeVj                   dR eeVj                         dSeU dT        ej                  eVj                          ej                  dUeVj                  d/dVeVj                  d/dWeVj                  d/dXeVj                  d/dYeVj                   dZ       ddd       ddd        ddd       eG5   ej                  d[       eAs ej                  d\       n/ eed]   e      Ze ej                  eej                  eDe4^             ddd       eH5   ej                  d_        ejL                  d`       ejD                  jF                  D ]  Zg ej                  g da      \  ZYZZZheYj                  dQegj                   db       eZjM                  egj                  regj                   dcegj                   negj                         ehj                  ddegj~                  deegj                   dfg      eg_?          ejR                           ej                  dhdig      \  ZlZmelja                  djdkdfdlm      Znemjk                  dnd12      renj                  do      jg                         ZpejD                  jF                  D ch c]  }|j                  j                          c}Zreprepj                         ervryejD                  jF                  j                   e
epepp              eed   ejD                  jF                         ej@                  jm                           ej|                          nepr ej                  dq        ejj                  dr      rL eed   ejD                  jF                         ej@                  jm                           ej                  ds       ddd       yc c} w # e=$ r Y w xY w# 1 sw Y   xY wc c}w c c}w c c}}w c c}}w c c}}w c c}}w c c}}w # 1 sw Y   cxY w# 1 sw Y   nxY w# 1 sw Y   jxY w# 1 sw Y   xY wc c}w # 1 sw Y   yxY w)tzUDashboard del agente de Twitter/X (Streamlit).

Ejecutar con:   streamlit run app.py
    N)datetime	timedeltatimezone)load_config)Account)rank_tweets)get_providerget_summarizer)load_accountssave_accountszTwitter Agentu   🐦wide)
page_title	page_iconlayoutzconfig.yamlaccounts_path)scweet_db_pathscweet_secrets_file	cache_dirdtreturnc                     t        j                  t        j                        | z
  j	                         }|dk  rdt        |dz         dS |dk  rdt        |dz         dS dt        |dz         dS )Ni  zhace <   z miniQ z hz d)r   nowr   utctotal_secondsint)r   secss     -/Users/danicosta/Desktop/Twitter-Agent/app.pyhumanize_ager      sz    LL&+::<Dd{s42:'t,,e|s44<(),,3tu}%&b))    uM   Capturando tweets… (con datos reales puede tardar unos segundos por cuenta))show_spinnerc                    t        |t              }t        j                  dd      r=|dk7  r8ddlm}  ||t        j                  dd      t        j                  dd	            }t        j                  t        j                        t        |
      z
  }g i }}| D ]  }	 |j                  ||d      }	|j                  |	       t        |di       j                  |j                  d      i       }
t        |	      dt        |
j                  dd            |
j                  d      t!        |
j                  dt        |	                  d||<    ||fS # t"        $ r}dt%        |      dddd||<   Y d}~d}~ww xY w)zLDevuelve (tweets, status). status[handle] = {'count': n, 'error': str|None}.cache_enabledTmockr   )CachedProviderr   z
data/cachecache_ttl_minutesr   )hours2   )sincelimit	last_meta@NstaleFnewestn_raw)counterrorr-   r.   r/   )r	   cfggetagent.providers.cachedr%   r   r   r   r   r   fetch_user_tweetsextendgetattrlstriplenboolr   	Exceptionstr)handlesprovider_namewindow_hoursproviderr%   r)   tweetsstatushtwmetaes               r   	fetch_allrG   &   sQ    M3/H
ww%-6*A9!(CGGK,N"%''*=r"BDLL&)FFEFF	b++AU"+EBMM"8["599!((3-LDRdhhw67((8,TXXgs2w78F1I  6>  	b"#c!fuPT_`aF1I	bs   B/E	E:E55E:accountsu   🐦 Twitter Agentu,   Captura · Ranking · Resumen de tus cuentaszFuente de datosscweetsyndicationzscweet = tweets REALES y frescos de CUALQUIER cuenta (requiere cookie de una cuenta secundaria; ver SETUP_SCWEET.md). syndication = tweets REALES sin login (gratis; alguna cuenta puede venir 'vieja').)helpu   ⚙️ Ajustes del TOPzVentana (horas)      r?   )stepu   Cuántos TOP      top_nz#Peso de la frescura (vida media, h)H   recency_halflife_hoursuJ   Más bajo = prioriza lo más reciente. Más alto = prioriza el engagement.z$Temas a potenciar (separa por comas)z, topics,u   🔄 Actualizar datosT)use_container_widthr   z.jsonweights)rQ   rS   keywordsrW   )u   🔝 TOPu   📝 Resumenu   📋 Cuentasu   🔝 Tweets TOPuJ   No hay cuentas activas. Añade o activa alguna en la pestaña **Cuentas**.r1   r-   r0   r/      u   ⚠️ No respondieron: c              #   &   K   | ]	  }d |z     ywr,   N .0rC   s     r   	<genexpr>r_      s     6M1sQw   u5   . Suele ser rate-limit — reintenta en unos minutos.u=   🚦 Sin datos (probable rate-limit de la cuenta de Scweet): c              #   &   K   | ]	  }d |z     ywr[   r\   r]   s     r   r_   r_      s     9[C!G[r`   uL   . Deja descansar la cuenta unos minutos, o añade una 2ª cuenta secundaria.u<   🟠 X sirve caché antiguo (proveedor 'syndication') para: c              #   &   K   | ]	  }d |z     ywr[   r\   r]   s     r   r_   r_           3UC!GUr`   z8Sin novedades en la ventana (prueba a subir las horas): c              #   &   K   | ]	  }d |z     ywr[   r\   r]   s     r   r_   r_      rc   r`   u    tweets · /u    cuentas con datos · últimas u
    h · TOP )bordergQ?gGz?z### z**@u   ** · u    · `score `u   ❤️ u	    · 🔁 u	    · 💬 u    · 👁️ u    · [Abrir en X →]()u   📝 Resumen del TOPu'   Añade cuentas para generar el resumen.
summarizer)rT   u   📋 Cuentas vigiladasuD   Activa/desactiva las que quieras incluir en el TOP, o añade nuevas.)g(\?gRQ?g333333?z**u    — Activaen_	collapsed)valuekeylabel_visibilitygffffff?g333333?u   Añadir cuenta (handle sin @)
new_handlezej. sama)rn   ro   placeholderu   ➕ Añadirr,   )handledisplay_nameu    Esa cuenta ya está en la lista.u   💾 Guardar cambioszLista de cuentas guardada.)u__doc__osr   r   r   	streamlitstagent.configr   agent.modelsr   agent.rankingr   agent.registryr	   r
   agent.storer   r   pathdirnameabspath__file__HEREset_page_configjoinr2   isabs_kr3   r<   r   
cache_datarG   session_staterH   sidebartitlecaption	selectboxr>   divider	subheadersliderr   r?   rQ   halflife
text_input
topics_strsplitstriprT   buttonclear_cdirisdirlistdir_fnendswithremoveOSErrorrerunenabledrr   r=   rA   rB   rankedtabstab_toptab_summarytab_accountsheaderinfoitemserrsr-   ratelimitedquietwarningr9   	with_data	enumerateiscoret	containercolumnsc1c2markdownauthor
created_atwritetextlikesretweetsrepliesviewsurlri   	summarizeac3noters   togglecol_addcol_btnrp   r8   rC   lowerexistingappendsuccess)r   r   rC   sxs   00000r   <module>r      s4
  
 
 2 2  $   % 7 4	wwrwwx01   o O"'',,t]34	ww}}S)*77<<c/.BCC
@B
wwr{277==R1'',,tSW-B A*X *# * kl m6 R%%% -c/.B CB ZZBHH!"BJJ=> BLL	=!a	M BJJLBLL)*299.3C<O8PWXYLBIInaSW->?Eryy-q"c#>V:W6XYH EtyyQTU]Q^G_`J!+!1!1#!6D!6A!'')aggi!6DFryy(dC
$RWW]]5)!rzz%(<<(!		"'',,uc":; ) 	
E J &&//
=/1991/
=$
%W188W
% R 
w|DNFFeHYF
 &-RWW-Y%Z "l BII \]$lln?ndagn?%||~r~tq!QUU7^g[\[`[`ahjk[lpq[q~r%+\\^ N^TQeeGnQUU7^55!,1aeeGQ6G16L ^ N  &||~ G~tq!gquuW~UU7A&!+gq0AA0E ~ G BJJ*TYY6M6M-MMIJ BJJO))9[99:`a
 BGGN))3U334 BJJJ))3U334 v||~O~tq!w9JQ9N~OP	

6{m;yk3w<. A$~ZF}>	
 'vq1MAzqT*#T4L1Bd1#J'BKK#ahhZvl1<<6P5QQ\]b\ccd efBHHQVV$BKK!!''!Iajj^9QYYWXM Z##$771+-B155'L  +* 2O j BII$%9:#C$5s;
J(((?@  BII&'BJJUV&&RZZ 23
B
c!((2&'


qvvann%U166(31>>RIIhaiis188*=M`kIl		 ' BJJL!rzz3*-GW##$Chs  BL#  MJ~~m~>c"((*.0.>.>.G.GH.GAHHNN$.GH(*%%,,WAA-NO#o.0@0@0I0IJMM!BHHJBJJ9:ryy'(c/*B,<,<,E,EF


/07 \} E # A ZJ >
%( @rNG0 P R +*Q Wj [2 I \s*  C5k6k%k%.Bk65,k*!k6l&l1l<mll!m8ll$l:l>mAl-mAlCm/l%l%A m1.l8B+l+	
l8m'AmE1m$9!mDm$%k6*k3/k62k33k66l m+l50l88m=mmmm$$m-