
    hY                     t   d dl Z d dl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  ee j                  d      re j                  j!                  d	       d d
lmZ  ee      j)                         j*                  d   Z ee      e j0                  vr"e j0                  j3                  d  ee             ej4                  j7                  dd       d dlmZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ ddZ,d Z-d Z.d Z/ e0       Z1d Z2ed        Z3ed        Z4ed        Z5	 ddZ6ddZ7y)     N)Path)product)urljoin)IntegrityErrortransaction)timezonereconfigureutf-8encoding)sync_to_async   DJANGO_SETTINGS_MODULEzNetworkMonitoring.settings)async_playwright)SourceNetworkNetworkMonitoredPageNetworkSourceErrorRawMonitoredLinkNetworkStatusAds	AdsManual)logger)handle_cookies)paginate_nextc                 ~   K    t        t        j                  j                        | |d d |       d {    y 7 w)Ni   )sourceerror_message
error_type)r   r   objectscreate)r   messager   s      5/var/www/extractly/link_agregator/source_managment.pylog_source_errorr#   %   s;     
:-*2299
:etn  s   3=;=c              #   4  K   |j                         D cg c]  \  }}t        |t              s| }}}|j                         D cg c]  \  }}t        |t              r| }}}|D cg c]  }t        ||   j	                                 }}t        | D ]i  }| }i }	t        ||      D ]&  \  }}|j                  d| d|      }||   |   |	|<   ( |D ]#  }|j                  d| d||         }||   |	|<   % ||	f k y c c}}w c c}}w c c}w w)N{})items
isinstancedictlistkeysr   zipreplace)
	structureparamskv	perm_keysstatic_keysvaluescombinationurlmapping_for_dbs
             r"   generate_permutationsr8   -   s    %||~E~tq!At1D~IE!'KAz!T7J1KK.78id6!9>>#$iF8'	;/DAq++1#Rj!,C &q	!N1 0 A++1#Rj&)4C &q	N1  >!! (	 FK8s3   DDDD	D"D&D-#DBDc           	      H  K   | j                  |       d {   }g }|D ]^  }	 |j                          d {   }t        dj                  t	        t
        j                  |                  }|j                  |       ` |rt        |      S y7 w7 Y# t        $ r Y ~w xY ww)N r   )
query_selector_all
inner_textintjoinfilterstrisdigitappend	Exceptionmax)pagepagination_numbers_selectorelementsnumberseltxtnums          r"   get_total_pages_from_paginationrL   >   s     ,,-HIIHG	'CbggfS[[#678CNN3	  7| J (  		sC   B"BB"BBAB?B"B	BB"BB"c           	      N  K   | j                  |       d {   }t        j                  dt        |       d|        g }t	        |      D ]  \  }}|j                  d       d {   }|dk(  rg|j                  |       d {   }	|	rt        j                  d| d|	        |j                  |	j                  d      r|	nt        ||	             nU|j                  |       d {   }	|	s|j                  d       d {   }
|
D ]d  }|j                  |       d {   }|st        j                  d|        |j                  |j                  d      r|nt        ||             f |sd	D ]g  }|j                  |       d {   }|st        j                  d
| d|        |j                  |j                  d      r|nt        ||             i nIt        j                  d| d|	        |j                  |	j                  d      r|	nt        ||	             |j                          d {   }t        j                  d| d|         t        j                  dt        |       d| d| d       |S 7 w7 )7 7 7 7 w7 7 aw)Nz[DEBUG] Znaleziono z sekcji przez selektor z(e) => e.tagName.toLowerCase()au   [DEBUG] Znalazłem atrybut z w <a>: httpu"   [DEBUG] Znalazłem atrybut w <a>: )zdata-urlz	data-hrefhrefu$   [DEBUG] Znalazłem atrybut fallback : z[HTML_SECTION z] z[EXTRACTED] Wyszukano u    linków (selector: z attr: ))r;   r   infolen	enumerateevaluateget_attributerB   
startswithr   
inner_htmldebug)rE   section_selectorurl_attrbase_urlrG   linksidxrI   tag_namevala_tagsa_elval2attrfallbackhtmls                   r"   extract_links_from_sectionrh   M   sh    ,,-=>>H
KK%c(m_4KL\K]^_EX&R%EFFs?((22C9(8C5QRCNN6$:SRU@VW((22C!44S99"D!%!3!3H!==D&H$OPT__V-DT'RZ\`Jab	 #
  A)+)9)9$)?#?#"KK*NtfTVW_V`(ab!LLX5H5H5PV]^fhpVqr	 !B 9(2cUKLCNN6$:SRU@VW]]_$~cU"TF345 '8 KK(U4HIYHZZabjakklmnLA ? G2
 39= $@ %s   J%JAJ%(J)J%JA&J%-J.J%J	J%&J'J%.A#J%J J%B(J%J#AJ%J%J%J%J%J% J%#J%c                    K   |t         vrBt        | |       d {    t         j                  |       t        j                  d|        y t        j                  d|        y 7 Kw)Nz"Cookies zaakceptowane dla domeny: u'   Cookies już zaakceptowane dla domeny: )cookies_clicked_for_baseurlr   addr   rS   )rE   r]   	ai_configs      r"   #ensure_cookies_accepted_for_baseurlrm   t   sZ     22T9---#''18
CD=hZHI	 	.s   A(A&AA(c                 `    t         j                  j                  |       j                          y )Nr   )r   r   r?   deletero   s    r"   _clear_status_for_sourcerq      s$        /668    c                    t        j                         5  t        j                  j	                  | |d      }|j                  d|      }t        j                  j	                  | |d      j                  d|      }t        j                  j	                  | |d      j                  dd|      }|||fcddd       S # 1 sw Y   yxY w)z
    Atomically deactivate:
      - NetworkMonitoredPage
      - Ads
      - AdsManual
    joined via OneToOne reverse: <Model>.objects.filter(networkmonitoredpage__...)
    Returns tuple of counts (pages, ads, ads_manual).
    Tr   url__in	is_active)check_activeinactive_datenetworkmonitoredpage__sourcenetworkmonitoredpage__url__inrv   F)rv   rw   rx   Nr   atomicr   r   r?   updater   r   )r   expired_urlsnowpages_qspages_updatedads_updatedads_manual_updateds          r"   _cascade_deactivater      s     
			'//66<4 7 
 ! (  kk(()/*6 ) 
 &  	 	 '..55)/*6 6 
 &5t3&
G	 	 k+==; 
		s   B!C  C	c                    t        j                         5  t        j                  j	                  | |d      j                  dd      }t        j                  j	                  | |d      j                  ddd      }t        j                  j	                  | |d      j                  ddd      }|||fcddd       S # 1 sw Y   yxY w)u  
    Jeśli ogłoszenie wróciło na listę, a w DB było nieaktywne:
      - NetworkMonitoredPage: is_active=True, inactive_date=None
      - Ads/AdsManual: is_active=True, inactive_date=None, isSendToMainServer=False
    Zwraca (pages_re, ads_re, ads_manual_re).
    Frt   TN)rv   rx   ry   )rv   rx   isSendToMainServerr|   )r   active_urls_nowpages_reads_reads_manual_res        r"   _reactivate_return_countsr      s     
			'//66?e 7 

&4t&
4 	 ##)/*9 $ 
 &4t&
N	 	 "))00)/*9 1 
 &4t&
N	 	 .# 
		s   B B??Cc	                   K   |j                  d      }	|j                  dd      }
|j                  dd      }|}|j                  dd      }|j                  d      }|j                  d	d
      }|j                  d      }d}d}d}d }d}d}d }d}	 |dk(  r|j                  d|      }t        ||      }d|v r8t        j                  d| d       t        |d| d| dd       d {    n	 | j                  |dd|       d {    t        j                  d| d|        t        j                  d| d|        |7|r5|dk(  r0	 t        | |       d {   }t        j                  d"| d#|        t        | ||       d {    	 | j                  d%d&d'(       d {    	 | j                  |d')       d {    t        | |	|
|       d {   }t        j                  d,t        |       d-       t        |      }|F||k(  rA|dz  }t        j                  d.| d/| d0       ||k\  rt        j                  d1| d2       n_d}|}|D ]%  }|j!                  |      r|nt        ||      }|||||d3} d4|v r|d4   | d4<   d5|v r|d5   | d5<   d6|v r|d6   | d6<   |d7k(  r	  t#        t$        j&                  j(                        ||8       d {    	  t#        t*        j&                  j(                        ||j                  d5      |j                  d6      ||j,                  | :       d {    d}|d>k(  s	  t#        t0        j&                  j2                        ||8       d {    ( t5        |d@d       }!|!4t        |      |!k  r&t        j                  dAt        |       dB|! dC       n|st        j                  dD dE|	 dF|
 dG       t        |dH| dE|	 dF|
 ddI       d {    | j7                          d {   }"t9        dJ| dKdLdMN      5 }#|#j;                  |"       d d d        ng||k\  rt        j                  dO| dP       nH|||k\  rt        j                  dQ| dR       n't=        | ||||||||	|S
       d {   }$|$sn|dz  }$t        j                  dT|        y 7 7 # t        $ rB}t        j                  d| d|        t        |d | d| d!       d {  7   Y d }~ed }~ww xY w7 # t        $ r%}t        j                  d$|        d }Y d }~d }~ww xY w7 7 # t        $ r Y w xY w7 # t        $ r#}t        j                  d*| d+       Y d }~d }~ww xY w7 7 # t        $ r&}t        j                  d9| d|        Y d }~d }~ww xY w7 # t.        $ r% |dz  }t        j                  d;| d<| d       Y t        $ r&}t        j                  d=| d|        Y d }~d }~ww xY w7 # t        $ r&}t        j                  d?| d|        Y d }~d }~ww xY w7 h7 S# 1 sw Y   /xY w7 ٭w)UNsectionr\   rP   wait_for_wrapperz.lista_ofertpagination_strategy
url_changenext_selectorpage_url_templatez?page={{number}}total_pages_selectorr   r   i     Tz{pagination}uO   [ZABEZPIECZENIE] Próbowałem wejść na niepodstawiony link z '{pagination}': u    — przerywam permutację!u9   Próba wejścia na niepodstawiony link z '{pagination}': z (permutacja: rR   bad_pagination_linkr   domcontentloaded`  )
wait_untiltimeoutrefererz[PAGE] Strona     — u&   [GOTO PERM] Nie udało się otworzyć rQ   zGOTO PERM ERROR: permutation_goto_failedz#[PAGINACJA] Wyznaczono total_pages=z na podstawie u5   [PAGINACJA] Nie udało się wyznaczyć liczby stron: .cookie-modal, .cookiesdetachedȯ  stater   )r   u-   [WARN] Brak ogłoszeń lub timeout selector: u    — przerywam.z[FOUND] Znaleziono u    ogłoszeń.z[DUPLICATE PAGE] Strona z& zawiera te same linki co poprzednia (u    raz/y pod rząd).z[END] Strona zduplikowana u+    razy pod rząd – przerywamy permutację.)r]   r/   	selectorspage_numscraped_urltotal_pagescityestate_type
offer_typefetch)r6   r   z[RAW-LINK-ERROR] )r6   r   r   r   namemetaz[DUPLICATE] u    (duplikatów pod rząd: z[ERROR] Problem z zapisem checkz[NETWORKSTATUS-ERROR] skip_when_lessz[SKIP] Znaleziono tylko u    linków (limit: u,   ) — przerywamy tę kategorię/permutację.u#   [NO LINKS] Brak linków na stronie z (selector: z, attr: u   ) — przerywam paginację.zNo links found on no_linksdebug_page_z.htmlwr
   r   z[END] Przekroczono limit uC    kolejnych duplikatów — przerywam paginację dla tej permutacji.u&   [END] Osiągnięto ostatnią stronę: u   , przerywam permutację.)
rE   r   r   r   r]   permutation_urlpagination_patternfirst_page_paginationr[   r   u   [END] Ukończono: )getr-   r   r   warningr#   gotorS   rC   errorrL   rm   wait_for_selectorrh   rT   setrX   r   r   r   r    r   r   r   r   get_or_creategetattrcontentopenwriter   )%rE   r]   r   r   r   r   r7   r   moder[   r\   wrapper_selectorrl   r   r   r   rF   r   consecutive_duplicatesDUPLICATE_LIMITlast_links_setduplicate_pages_in_a_rowMAX_DUPLICATE_PAGESr   
first_pager6   eexc	full_urls	links_setad_urlfull_urlr   
skip_limitpage_sourcefshould_continues%                                        r"   scrape_single_permutationr      s     !}}Y/}}Z0H }}%7HI#--(=|LMM/2M!&9;MN"+--0F"GHON KJ
q=!)).:OPC(C(C$!rsvrw  xS   T  U&QRUQVVdetduuvw4  
 ii0BE[cidddnXJeC5AB KK.
%u=> #>8q=#$CDJe$ffA+n]x\yz{ 2$)LLL	(()B*^c(ddd	(()95(III 5T;KXW_``	)#i.)9FG	N	%)~*E$)$NN5hZ?ef~e  @R  S  T'+>>!;<O;PP{|}'($"  F!'!2!28!<v'(TZB[H$(&$"*D '-f5V.&4]&C]#~-%3L%A\"wJH-(8(@(@(G(GH$%  QL-(<(D(D(K(KL$$2$6$6}$E#1#5#5l#C%#[[!   ./* OL-(=(=(K(KL$%  W  f V%5t<
!c)nz&ANN5c)n5EEVWaVb  cO  P  QNN@\RbQcckltku  vQ  R  S"$SE6F5GxPXzYZ[%  
 !%.KH:U3S7Kq$ L!_4NN66G  HK  L  M "x;'>KK@Mefg !. 3+1"7-'!
 
 As v KK$_$567i e EcU"QCPQ&v1B3%r!/MZsttt g #!VWXVYZ["#
 	Md 		 J 	NNJ3%_`	
 aD ! JNN%6xj3%#HIIJ & m*a/*KK,xj8QRhQiij kl  QLL#=hZr#!OPPQ
 ! ONN%;H:Ru#MNNO
 /KK
s  C'Z)S*Z1S 	S
S )$ZT% T"T% =ZUZU *U+U 0U/ U,U/ ZVCZ2.V$ V!!V$&AW WWZ.X:=X7>X:BZY,ZY/Z3Y2A!Z&Y?'(ZS 	T2TTTZTZ"T% %	U.UZUZU 	U)%Z(U))Z,U/ /	V8VZVZ!V$$	W-WZWZW*X4ZX4X/)Z/X44Z7X::	Y)Y$Z$Y))Z/Z2Y<7	Zc                   K   | r= t        t              t        j                  j	                  | d             d {   }n; t        t              t        j                  j	                  d             d {   }t               4 d {   }|j                  j                  |       d {   }|j                  ddddd	
       d {   }|j                          d {   }t        j                  dt        |              t        j                  d|D 	cg c]  }	|	j                   c}	        |D ]  }
|dk(  rt        |
       d {    |
j                  }|
j                   }|
j"                  j%                         }|
j&                  j%                         }|
j(                  }t+        |
dd       xs |j-                  d      xs d}|rTd|v r|d   }d|v r|d   }d|v r|j/                  |d          d|v r|j/                  |d          d|v r|d   }d|v r|d   }t        t1        ||            }t        j                  d|
j                   dt        |       d       t        j                  d|
j                   d       |D ]   \  }}t        j                  d| d|        " t        j                  d|        	 |j3                         rJt        j4                  d       |j                          d {   }t7        j8                  d       d {    t7        j8                  d       d {    |j;                  |dd !       d {    t        j                  d"|        t        j                  d-| d.       tG        |||       d {    	 |jI                  d/d0d12       d {    |D ]!  \  }}tK        ||||||||
|3	       d {    # |dk(  stL        j                  j	                  d|
4      }tO         t        t              |jQ                  d5d6             d {         }tR        j                  j	                  |
7      }tO         t        t              |jQ                  d5d6             d {         }||z
  }tU        jV                         }tY        |
||       d {   \  }}}t        j                  d8t        |       d9|
j                   d:| d;| d<| d=       t[        |
|       d {   \  }} }!t]        || |!f      rt        j                  d>| d;|  d<|! d=       ||z
  }"d?}#|"D ]J  }$	  t        tL        j                  j^                        |$|
|
j`                  dd@dAiB       d {    |#dCz  }#L t        j                  dE|# dF        |jc                          d {    t        j                  dG       d d d       d {    y 7 7 7 }7 \7 @7 +c c}	w 7 7 7 7 7 # t<        $ r}t        j>                  d#| d$|        	 |jA                  d%|
jB                   d&'       d {  7   t        j                  d(       n$# t<        $ r t        j4                  d)       Y nw xY wtE        |
d*| d$| d+,       d {  7   Y d }~d }~ww xY w7 67 # t<        $ r Y &w xY w7 7 7 ]7 .7 7 d# t<        $ r&}t        j4                  dD|$ d$|        Y d }~d }~ww xY w7 ^7 <# 1 d {  7  sw Y   y xY ww)HNT)idenabled)r   )headlessz_Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115 Safari/537.36zpl-PLi   i   )widthheight)
user_agentlocaleviewportu)   [SRC] Liczba źródeł do przetworzenia: u   [SRC] Źródła: r   r   r:   r]   r.   r/   r   
paginationz[PERMUTACJE] r   z kombinacjiz![PERMUTACJE-LIST] Permutacje dla :z   -> URL: z | MAP: u   [GOTO] Próba wejścia na u9   [PAGE CLOSED] Strona zamknięta – tworzę nową stronęg      ?r   r   )r   r   u   [GOTO OK] Weszło na u1   [GOTO ERROR] Nie udało się otworzyć base_url: rQ   zerrors/goto_error_z.png)pathu   Zrobiono screenshot błędu.u$   Nie udało się zrobić screenshota.zGOTO ERROR for base_url: goto_failedr   z[COOKIES] Otwieram base_url: u1    i akceptuję cookies (tylko raz dla tej domeny).r   r   r   r   )r   )rv   r   r6   )flatro   zOznaczono jako nieaktywne u    ogłoszeń (status check dla z	) [pages:z, ads:z, ads_manual:]uL   Reaktywowane ogłoszenia (is_active=True, isSendToMainServer=False): [pages:r   notezDodano przez status-check)r6   r   r   rv   r   r   z[CHECKER-ADD-ERROR] zDodano u>    nowych ogłoszeń (brakujących w bazie) podczas status checku8   === Agregator zakończył pracę, browser zamknięty ===)2r   r*   r   r   r?   r   chromiumlaunchnew_contextnew_pager   rS   rT   titlerq   r]   r.   r/   copyr   r   r   r   r~   r8   	is_closedr   asynciosleepr   rC   r   
screenshotr   r#   rm   r   r   r   r   values_listr   r   r   r   r   anyr    r   close)%	source_idr/   r   r   sourcespbrowsercontextrE   sr   r]   r.   source_paramsr   r   r   permutationsperm_urlr7   r   r   db_links_qsdb_linksstatus_links_qsstatus_linksexpiredr   	pages_updads_updads_manual_updr   r   r   missingaddedr6   s%                                        r"   scrape_all_sourcesr    s9    +d+M,A,A,H,HI_c,H,dee+d+M,A,A,H,HQU,H,VWW!!Q

))8)<<++x#s3 , 
 

 %%''?G~NO''(B'Q'(B'CDEFw.v666H((I"MM..0M((--/I!'!2!2$+F4KT$R  %CV_VcVcd{V|  %C  AC!'%j1H&( &{ 3Iv%!(()9:&($$VK%896))/)=&*f4,23J,K) 5i OPLKK-~U3|;L:M[YZKK;FLL>KL,8(.k(8N;KLM -9 KK4XJ?@>>#NN%^`!(!1!1!33D!--,,,mmC(((ii5GQViWWW3H:>? KK7zArst5dHiPPP,,-Fjbg,hhh
 4@//#&)"
 
 
 4@ w2::AADY_A`%8]4%89P9PQV]a9P9b%ccd #0"7"7">">f">"M")<t)<_=X=XY^ei=X=j)k#kl #\1lln;NvW^`c;d5d2	7N0W>\]c]i]i\j k'[wi}^DTTUW 9RRXZf8g2g/&-&-89KK""*6&}oUVX '1"C
JPm,@,H,H,O,OP ##)!'&*"(*E!F   
 # geW,jkls x mmoNOS "!!	 fW!<

 ( )C
 7D 4,(W PQYPZZ\]^\_`aK//1CFII;d/S/TTTKK >?  KNN#IJK 'v1J8*TVWXVY/Zgtuuu Qh 

"  d $l
 6e 3h % J)=cU"QC'HIIJ
 	Q "!!!sT  :]X;]8X9]X] \;/X0\;X\;&X'9\; X3"\;XE:\;8X(	X
X(&X'X(X"X(X% X(<)\;%[&\;+[![[!\;&[1
'\;4A\;[4A\;[71\;[:A\;[=A\;=\\ 
	\&1\;\5\;1]<\8=]]]\;\;\;\;X(X("X(%X((	[1[#Z0Y3
1Z[Z-	*[,Z-	-[[

[\;[\;[!!	[.*\;-[..\;4\;7\;:\;=\; \	\2	\-	'\;-\2	2\;8];]]]	])general)r   )NNr   F)8sysosr   pathlibr   	itertoolsr   urllib.parser   	django.dbr   r   django.utilsr   hasattrstdoutr	   asgiref.syncr   __file__resolveparentsBASE_DIRr@   r   insertenviron
setdefaultplaywright.async_apir   extractly.modelsr   r   r   r   r   r   r   link_agregator.utils.loggerr   link_agregator.utils.cookiesr   link_agregator.utils.next_pager   r#   r8   rL   rh   r   rj   rm   rq   r   r   r   r   rr   r"   <module>r     s4   
 	      1 ! 3::}%JJG, '>!!#++A.x= HHOOAs8}% 

  .0L M 1   / 7 8""!J "e J 9 9 &> &>T / /> MTs8lOPrr   