
    @h                         d dl Z d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	m	Z	m
Z
  G d d          Zd Zedk    r e j         e                       dS dS )    N)async_playwright)datetime	timedeltac                       e Zd Zd dZd Zd Zd!dZd Zd"d	Zd
 Z	d Z
d Zd Zd Zd dZd Zd Z	 	 	 	 d#dZd$dZdddg ddddddddddddfdZd ZdS )%	EbayLoginFc                     d | _         d | _        d | _        d| _        d| _        | j         d| _        | j         d| _        | j         d| _        d | _        i | _	        d | _
        d| _        || _        d S )Nz./browser-dataz./filesz/cookies.jsonz/session.jsonz/ebay_state.jsoni,  )browsercontextpageuser_data_dir	files_dircookies_filesession_filestorage_state_file
start_timeoperation_timeslogin_status_cachecache_timeoutdebug)selfr   s     login.py__init__zEbayLogin.__init__   s    	-"#1@@@#1@@@%)%7"I"I"I!"& 


    c                 <    t          j        | j        d           dS )z!Ensure the files directory existsTexist_okN)osmakedirsr   )r   s    r   ensure_files_directoryz EbayLogin.ensure_files_directory   s    
DNT222222r   c                 6    | j         rt          |           dS dS )z+Print message only if debug mode is enabledN)r   print)r   messages     r   debug_printzEbayLogin.debug_print    s%    : 	'NNNNN	 	r   Nc                     t          j                     }|r.||z
  }|| j        |<   |                     d| d|dd           |S |S )z#Log the time taken for an operationu   ⏱️ : z.2fz seconds)timer   r#   )r   operation_namer   current_timedurations        r   log_timezEbayLogin.log_time%   sc    y{{ 	 #j0H3;D 0O~OOOOOOPPPr   c                 0   | j         sdS t          | j                                                   }dd dd d}| j                                         D ]&\  }}|dk    r||z  dz  nd}||dd|d	d
|ddz  }'|d dz  }|ddd|d	dz  }|d dz  }|S )z$Get a summary of all operation timeszNo operations timed
2==================================================u   
📊 RUNTIME SUMMARY
r   d   z<35r%   z>8.2fzs (z>5.1fz%)
u   ──────────────────────────────────────────────────zTOTAL RUNTIMEzs (100.0%)
)r   sumvaluesitems)r   
total_timesummary	operationr)   
percentages         r   get_runtime_summaryzEbayLogin.get_runtime_summary0   s    # 	)((-446677
AvAAvAAA#'#7#=#=#?#? 	U 	UIx:Dq..(Z/366aJ)TTT8TTTjTTTTTGGh???"oKKKZKKKKKf=== r   config.infoc           	         |                      d          }	 t          j                    }|                    |           |                    dd          }|                    dd          }|                     d|            |                      d|           ||fS # t          $ rC}t          d| dt          |                      |                      d	|           Y d
}~dS d
}~ww xY w)z(Load email and password from config filezLoading credentialssettingsusernamepasswordzLoaded credentials for user: zLoad credentialszError loading credentials from r%   zLoad credentials (failed)N)NN)	r*   configparserConfigParserreadgetr#   	Exceptionr!   str)r   config_filer   configemailr;   es          r   load_credentialszEbayLogin.load_credentialsB   s   ]]#899
	!.00FKK$$$JJz:66Ezz*j99HDUDDEEEMM,j999(?" 	 	 	KKKK3q66KKLLLMM5zBBB:::::	s   BB 
C*'8C%%C*c                 J   ddl }g d}|}|D ]}|                    |||j        |j        z            }|r<t	          |                                          dk    r|                    d          } n'|                    |d||j        |j        z            }ddl}|	                    |          }d
                    d |                                D                       }d
                    |                                dd                   }|                                S )	zDRemove HTML wrapper tags from response content to extract clean JSONr   N)z<html><head><link rel="stylesheet" href="resource://content-accessible/plaintext\.css"></head><body><pre>(.*?)</pre></body></html>zE<html[^>]*>.*?<body[^>]*>.*?<pre[^>]*>(.*?)</pre>.*?</body>.*?</html>z<pre[^>]*>(.*?)</pre>z<html[^>]*>|</html>z<head[^>]*>.*?</head>z<body[^>]*>|</body>z<link[^>]*>    )flagsr,   c                 B    g | ]}|                                 d k    |S )rI   )strip).0lines     r   
<listcomp>z0EbayLogin.clean_html_wrapper.<locals>.<listcomp>w   s0    $i$i$idVZV`V`VbVbfhVhVhTVhVhVhr   )researchDOTALL
IGNORECASElengroupsgroupsubhtmlunescapejoin
splitlinesrL   )r   contentrP   patternscleaned_contentpatternmatchrX   s           r   clean_html_wrapperzEbayLogin.clean_html_wrapperT   s3   			
 
 
 " 	h 	hGIIg	BM8QRRE hU\\^^,,q00"'++a.. #%&&"oRYY[YfMf&"g"g 	--88 ))$i$io6P6P6R6R$i$i$ijj))O$>$>$@$@$DEE$$&&&r   c                   K   	 | j         r| j                                          d{V }t          | j        d          5 }t	          j        ||d           ddd           n# 1 swxY w Y   |                     d| j                    dS dS # t          $ r*}t          dt          |                      Y d}~dS d}~ww xY w)	zSave browser cookies to fileNw   indentzCookies saved to TzError saving cookies: F)
r
   cookiesopenr   jsondumpr#   r@   r!   rA   )r   rg   frE   s       r   save_cookieszEbayLogin.save_cookies|   s0     		|  $ 4 4 6 6666666$+S11 4QIgq33334 4 4 4 4 4 4 4 4 4 4 4 4 4 4  !HT5F!H!HIIIt   	 	 	33q663344455555	s:   ;B A#B #A''B *A'+ B 
CB>>Cc                   K   	 t           j                            | j                  rt	          | j        d          5 }t          j        |          }ddd           n# 1 swxY w Y   | j        rC|rC| j                            |           d{V  | 	                    d| j                    dS dS dS dS # t          $ r*}t          dt          |                      Y d}~dS d}~ww xY w)zLoad browser cookies from filerNzCookies loaded from TzError loading cookies: F)r   pathexistsr   rh   ri   loadr
   add_cookiesr#   r@   r!   rA   )r   rk   rg   rE   s       r   load_cookieszEbayLogin.load_cookies   s]     
	w~~d/00  $+S11 +Q"illG+ + + + + + + + + + + + + + +<  G  ,227;;;;;;;;;$$%OD<M%O%OPPP4            	 	 	4CFF4455555555	s;   9B7 AB7 A""B7 %A"&A	B7 7
C+C&&C+c                   K   	 | j         r| j                             | j                   d{V  |                                  d{V  t	          j                                                    | j         j        j        	                    dd          | j         j        j        	                    di           | j
        r| j
        j        ndd}t          | j        d          5 }t          j        ||d	           ddd           n# 1 swxY w Y   |                     d
           dS dS # t"          $ r*}t%          dt'          |                      Y d}~dS d}~ww xY w)zISave complete session state including storage, cookies, and local storage)ro   N	userAgentrI   viewport)	timestamp
user_agentrv   urlrc   rd   re   z(Complete session data saved successfullyTzError saving session data: F)r
   storage_stater   rl   asyncioget_event_loopr&   	_impl_obj_optionsr?   r   ry   rh   r   ri   rj   r#   r@   r!   rA   )r   session_infork   rE   s       r   save_session_datazEbayLogin.save_session_data   s     	| l00d6M0NNNNNNNNN ''))))))))) ")!7!9!9!>!>!@!@"&,"8"A"E"EkSU"V"V $ 6 ? C CJPR S S,0I?49==4	    $+S11 9QIlAa88889 9 9 9 9 9 9 9 9 9 9 9 9 9 9   !KLLLt' (  	 	 	8A8899955555	s<   C D, $D<D, DD, DD, ,
E 6EE c                   K   	 t           j                            | j                  r|                     d           dS t           j                            | j                  r1|                     d           |                                  d{V  dS |                     d           dS # t          $ r*}t          dt          |                      Y d}~dS d}~ww xY w)zRestore complete session statez'Restoring session from storage state...TzRestoring cookies only...Nz-No session data found, starting fresh sessionFzError restoring session data: )
r   ro   rp   r   r#   r   rs   r@   r!   rA   r   rE   s     r   restore_session_datazEbayLogin.restore_session_data   s      	w~~d566 	  !JKKKt 122   !<==='')))))))))t  !PQQQu 	 	 	;3q66;;<<<55555	s#   9B+ AB+ B+ +
C5CCc                   K   |                      d          }t                                                       d{V }t          j        | j        d           |j                            |d           d{V | _        d}t          j	        
                    | j                  r$| j        }|                     d| j                    | j                            |dd	d
d           d{V | _        | j                                         d{V | _        |                                  d{V  |                      d|           dS )z-Start Firefox browser with persistent contextzStarting browserNTr   r   )headlessslow_mozLoading existing session from ip    )widthheightzFMozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0)rz   rv   rx   zBrowser startup)r*   r   startr   r   r   firefoxlaunchr	   ro   rp   r   r#   new_contextr
   new_pager   r   )r   r   r   
playwrightrz   s        r   start_browserzEbayLogin.start_browser   s     ]]#566
+--3355555555
 	D&6666 (/66 7 
 
 
 
 
 
 
 
 7>>$122 	Y 3MWd>UWWXXX!\55'#s33_ 6 
 
 
 
 
 
 
 
 ,//11111111	 '')))))))))'44444r   c                   K   |                      d          }| j        t          j                    | j                            dd          z
  }|| j        k     rJ|                     d| j        d         rdnd            |                      d	|           | j        d         S 	 | j                            d
dd           d{V  | j                            d           d{V }| j                            d           d{V }|o| }|t          j                    d| _        |r-|                     d           |                      d|           dS |                     d           |                      d|           dS # t          $ r@}t          dt          |                      |                      d|           Y d}~dS d}~ww xY w)z,Check if user is currently logged in to eBayzChecking login statusNrw   r   zUsing cached login status: statusu   ✅ Logged inu   ❌ Not logged inzLogin status check (cached)https://www.ebay.com/sh/ovwdomcontentloaded'  
wait_untiltimeoutinput#userid
input#pass)r   rw   zALogin inputs not found on the page. User appears to be logged in.zLogin status check (logged in)Tu   ❌ Not logged in to eBayz"Login status check (not logged in)FzError checking login status: zLogin status check (error))r*   r   r&   r?   r   r#   r   gotoquery_selectorr@   r!   rA   )r   r   	cache_age
user_input
pass_inputis_logged_inrE   s          r   check_login_statuszEbayLogin.check_login_status   s6     ]]#:;;
 ".	d&=&A&A+q&Q&QQI4---    "ORVRijrRs  @M  zM  "O  "O  P  P  P;ZHHH.x88	)..!>K]gl.mmmmmmmmm  $y77GGGGGGGGJ#y77EEEEEEEEJ * 9z:L '!Y[[' 'D#
    !deee>
KKKt  !<===BJOOOu 	 	 	:#a&&::;;;MM6
CCC55555	s   $B0F +F 
G5GGc                 H	  K   |                      d          }	 | j                            ddd           d{V  | j                            d           d{V }| j                            d           d{V }| j                            d	           d{V }| j                            d
           d{V }|r|s>t	          d           g d}|D ]v}		 t	          d|	            | j                            |	          j         d{V }
|
                                 d{V rt	          d            dS g# t          $ r Y sw xY wt	          d           | j                            ddd           d{V  | j        	                    d           d{V  | j                            d           d{V }| j                            d	           d{V }| j                            d
           d{V }g d}d}|D ]&}| j                            |           d{V rd} n'|rot	          d           | j        	                    d           d{V  | j                            d           d{V }| j                            d	           d{V }|r<|r:|
                                 d{V  | j        	                    d           d{V  |rU|                    |           d{V  |
                                 d{V  | j        	                    d           d{V  |r|                    |           d{V  | j                            d           d{V }|r\|
                                 d{V  | j                            dd           d{V  | j        	                    d           d{V  |                                  d{V  |                                  d{V r-|                     d           |                      d|           dS t	          d           |                      d|           dS # t          $ r@}t	          dt!          |                      |                      d|           Y d}~dS d}~ww xY w) z'Login to eBay with provided credentialszeBay login processr   r   r   r   Nz#switch-account-anchorr   r   z#signin-continue-btnzNLogin inputs not found on the page. Checking login indicators as a fallback...)
ztext=usspanz-css=span.textbox.search-input-panel__inputBoxz)css=.textbox.search-input-panel__inputBoxz\xpath=//span[contains(@class,"textbox") and contains(@class,"search-input-panel__inputBox")]zcss=.shui-header__user-profilez7xpath=//*[contains(@class,"shui-header__user-profile")]ztext=My eBayz [data-testid="x-header-my-ebay"]z.gh-ua span:has-text("Hi")z#gh-uo a[title*="My eBay"]zChecking for login indicator: u1   ✅ Already logged in to eBay (fallback detected)TzULogin indicators not found. Navigating to explicit signin page and retrying inputs...zhttps://signin.ebay.com/  )ziframe[src*='captcha']z.captchaz#captchaz[id*='captcha']z[class*='captcha']ziframe[src*='recaptcha']z.g-recaptchaz#g-recaptchaFz6CAPTCHA detected! Waiting 5 seconds before retrying...  r   z6button#sgnBt, button#signin-btn, button[type='submit']r   u   ✅ Login successful!zeBay login (successful)u=   ❌ Login may have failed or requires additional verificationzeBay login (failed)zError during login: zeBay login (error))r*   r   r   r   r!   locatorfirst
is_visibler@   wait_for_timeoutclickfillwait_for_load_stater   r   r#   rA   )r   rD   r;   r   switch_anchorr   r   continue_btnlogin_indicators	indicatorelementcaptcha_selectorscaptcha_presentselectorsign_in_btnrE   s                   r   login_to_ebayzEbayLogin.login_to_ebay  s]     ]]#788
k	)..!>K]gl.mmmmmmmmm #')":":;S"T"TTTTTTTM#y77GGGGGGGGJ#y77EEEEEEEEJ!%!9!9:P!Q!QQQQQQQL  "VZ "Vfggg$ $ $  "2 ! !I!JyJJKKK(,	(9(9)(D(D(J"J"J"J"J"J"J!(!3!3!5!5555555 (!"UVVV#'44( % ! ! ! ! mnnninn%?L^hmnnnnnnnnnni00666666666 $(9#;#;N#K#KKKKKKK
#'9#;#;L#I#IIIIIII
%)Y%=%=>T%U%UUUUUUU	! 	! 	! $O-  11(;;;;;;;; &*OE  JNOOOi00666666666&*i&>&>?W&X&X X X X X X X#'9#;#;L#I#IIIIIII
 6 6#))+++++++++i00555555555 7 ooe,,,,,,,,,"((*********i00666666666 0 ooh///////// !%	 8 89q r rrrrrrrK 7!'')))))))))i334FPU3VVVVVVVVVi00666666666 ((********* ,,........   !89997DDDtUVVV3Z@@@u 	 	 	1Q11222MM.
;;;55555	sJ   B?Q A D=9Q <Q =
E
Q 	E

K$Q 0%Q 
R!!5RR!iphone caseZ   r   2   EBAY-USSOLDAfrica%2FCairosearchResultsc                   K   |                      d| d| d          }	 |sB|                                  d{V s't          d           |                      d|           dS n|                     d           ddl}| t           |j                    d	z            }n|}|||d
z  dz  dz  d	z  z
  }n|}d|
 d|                    dd           d| d| d| d| d| d| d| d| d| }||dk    r|d| z  }||dk    r|d| z  }|	|	dk    r|d|	 z  }||dk    r|d| z  }|                     d|            |                     d| d | d!|            |                     d"|            | j                            |d#d$%           d{V }	 | j        	                    d&d'(           d{V  n#  t          d)           Y nxY w| j        
                                 d{V }	 | j                            d*           d{V }|                     |          }|                     d+t          |           d,           |                                                    d-          st!          j        d.|d          t!          j        |          }d/|vrt          d0           ||d1S g }|                    d/g           }|D ]i}|                    d2          r|                    d3i           }|                    d4i                               d5          }dZd6} ||                    d7i                               d8           | |d9          |                    d:i                               d:i                               d;g           d                             d<d           | |d=d          r! | |d=d                              d>d          nd | |d?d          r! | |d?d                              d>d          nd | |d@d          dA}!|                    |!           kt           |j                              }"|                    ddB                              ddB          }#dC|# dB|" dD}$|                                  | j         dE|$ }%t/          |%dFdGH          5 }&t!          j        ||&dIdJK           ddd           n# 1 swxY w Y   |                     dL|%            |                     dMt          |           dNt          |           dO           |                      dP| dQ|           |S # t           j        $ r}'t          dRt3          |'                      ddl}t           |j                              }"|                    ddB                              ddB          }#|                     |          }(|(r|(|k    r{dC|# dB|" dS}$|                                  | j         dE|$ }%t/          |%dFdGH          5 }&|&                    |(           ddd           n# 1 swxY w Y   t          dT|%            nzdC|# dB|" dU}$|                                  | j         dE|$ }%t/          |%dFdGH          5 }&|&                    |           ddd           n# 1 swxY w Y   t          dV|%            |                      dW| dQ|           |(p||d1cY d}'~'S d}'~'ww xY w# t6          $ rD}'t          dXt3          |'                      |                      dY| dQ|           Y d}'~'dS d}'~'ww xY w)[z3Fetch data from eBay research API and save responsezFetching data: 'z' (offset: )Nu.   ❌ Not logged in. Cannot fetch research data.z Fetch data failed: not logged inu0   ⚡ Skipping login check for faster execution...r   r      <   z8https://www.ebay.com/sh/research/api/search?marketplace=z
&keywords= +z
&dayRange=z	&endDate=z&startDate=z&categoryId=z&offset=z&limit=z	&tabName=z&tz=z	&modules=rI   z
&minPrice=z
&maxPrice=z&topRatedProducts=z&format=u&   🔍 Fetching eBay research data for: u   📊 Parameters: z days, offset: z	, limit: u   🔗 API URL: r   i:  r   zCdocument.body.textContent && document.body.textContent.length > 100r   r   u;   ⚠️ Quick response check timed out, proceeding anyway...zdocument.body.textContentu   🧹 Cleaned response length: z chars{z"Response doesn't appear to be JSONresultsu2   ⚠️ Warning: No 'results' key found in response)r\   ry   dsaNotificationlistingimageURLc                     	 |                      |i                                dg           |                              dd          S # t          t          f$ r Y d S w xY wN	textSpanstextrI   r?   
IndexErrorAttributeErrorobjro   indexs      r   safe_extract_textz=EbayLogin.fetch_ebay_research_data.<locals>.safe_extract_text  i    (#&774#4#4#8#8b#I#I%#P#T#TU[]_#`#`` *N; ( ( (#'44(   AA AAitemIdvaluetitleavgsalespricer   r   	itemssold,
totalsalesdatelastsold)r   r   r   price	itemsSoldr   r   _ebay_research_.json/rc   utf-8encodingr   :F
separatorsensure_asciiu   ✅ Research data saved to: u   📈 Found z items processed from z total resultszFetch data successful: ''u   ❌ JSON parsing failed: z_cleaned.txtu   ✅ Cleaned response saved to: z.htmlu(   ✅ Original response saved as HTML to: zFetch data (non-JSON): 'u'   ❌ Error fetching eBay research data: zFetch data error: 'r   )r*   r   r!   r#   r&   intreplacer   r   wait_for_functionr\   evaluatera   rT   rL   
startswithri   JSONDecodeErrorloadsr?   appendr   r   rh   rj   rA   writer@   ))r   keywords	day_rangeoffsetlimitcategory_idskip_login_checkminPricemaxPricetopRatedProductsmarketplacetabNametzmodulesendDate	startDateformatr   r&   end_timestampstart_timestampapi_urlresponser\   	page_textcleaned_textdataarr   itemr   r   r   tmprw   safe_keywordsfilenamefilepathrk   rE   r^   s)                                            r   fetch_ebay_research_dataz"EbayLogin.fetch_ebay_research_data|  s
     
 ]]#Th#T#T6#T#T#TUU
p	# U!4466666666  JKKKMM"EzRRR4 
   !STTT KKK #IDIKK$$6 7 7 ' "/9r>B3F3Kd3R"S"+%*% %$,,S#66% % &% % )	% %
 -% % *% % !% % % % #% % % % #% %   #B2222#B2222+0@B0F0FB0@BBB!fll.f...PhPPQQQccc6cc\accddd7g77888 "Y^^G@R\a^bbbbbbbbHUi11Y  2          USTTTTT !I--////////GcO"&)"4"45P"Q"QQQQQQQ	  $66yAA  ![#lBSBS![![![\\\ $))++66s;; f./SUacdeee z,// D((NOOO'3GDDD ((9b11# # #Dxx 122 !  #hhy"55G#KK4488??E( ( ( ( "'")++h";";"?"?"H"H!2!27G!D!D!%/2!>!>!B!B?TV!W!W![![\gik!l!lmn!o!s!stz|~!!ararsw  zE  GH  bI  bI  &Q%6%6t[!%L%L%T%TUXZ\%]%]%]  OQctctuy  |H  JK  dL  dL  'T&7&7lA&N&N&V&VWZ\^&_&_&_  RT(9(9$PQ(R(R C IIcNNNN		,,	 ( 0 0c : : B B3 L LLMLLILLL ++---"n99x99 (C'::: PaIb!
OOOOP P P P P P P P P P P P P P P   !J!J!JKKK  !js2ww!j!jcRYll!j!j!jkkkDDDDjQQQ' O O O:#a&&::;;;		,,	 ( 0 0c : : B B3 L L #'"9"9)"D"D" Q)'C'CWWW	WWWH//111"&.==8==Hhg>>> 1!0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 FHFFGGGG  QPP	PPPH//111"&.==8==Hhg>>> )!((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) OXOOPPPDDDDjQQQ#2#=ggNNNNNNNN=O@  	 	 	DCFFDDEEEMM;;;;ZHHH44444	s   A\ #D<\  "G \ G$\ 9CU =HU S(U (S,,U /S,0A,U \-C\.Y\Y	\Y	A\)[?\[	\[	5\\	\ \\ 
]$ 9]]$   c                 L  K   |                      d| d| d          }	 g }d}d}t          d|            t          d| d| d           t          |          |k     r't          d	|d
z    d| d           |                     ||||           d{V }	|	rd|	v r|	d                             dg           }
|                    |
           t          d|d
z    dt          |
           d           t          dt          |           d           t          |
          |k     rt          d           nOnt          d|d
z               n8|d
z  }||z  }t          j        d           d{V  t          |          |k     '|r-ddl}t           |j                              }|
                    dd          
                    dd          }d| d| d}|                                  | j         d| }|||||dt          |          |d}t          |d d!"          5 }t          j        ||d#d$%           ddd           n# 1 swxY w Y   t          d&|            t          d't          |                      t          d(|            |                      d)| d*|           |S |                      d+| d*|           dS # t           $ rD}t          d,t#          |                      |                      d-| d*|           Y d}~dS d}~ww xY w).z*Fetch multiple pages of eBay research datazMulti-page fetch: 'z' (z items)r   u$   🔄 Starting multi-page fetch for: u   📊 Target: z items, z	 per pageu   
📄 Fetching page rH   z
 (offset: )...)r   r   r   r   Nr   r1   u	   ✅ Page : Found z itemsu   📈 Total collected: u   📄 Reached end of resultsu   ❌ Failed to fetch page       ?r   r   r   ebay_research_combined_r   r   )r   r   total_items_requesteditems_per_pagepages_fetchedsearch_parameterstotal_itemsr1   rc   r   r   rd   F)rf   r   !   
🎉 Combined results saved to:    📊 Total items collected: u   📄 Pages fetched: zMulti-page fetch successful: 'r   zMulti-page fetch (no data): 'u   ❌ Error in multi-page fetch: zMulti-page fetch error: ')r*   r!   rT   r  r?   extendr{   sleepr&   r   r   r   r   rh   ri   rj   r@   rA   )r   r   r   r!  r  r   all_datar  r   	page_datar1   r&   rw   r  r  r  combined_datark   rE   s                      r   fetch_multiple_pageszEbayLogin.fetch_multiple_pages4  sn     ]]#Z#Z#Zk#Z#Z#Z[[
M	HMFCCCDDDP+PP~PPPQQQh--+--Wma.?WW6WWWXXX"&"?"?%'!(	 #@ # #      	  I!=!=%o6::7BGGEOOE***Sma&7SSUSSSTTTH3x==HHHIII 5zzN22;<<< 3
 Ima6GIIJJJ".( mC(((((((((= h--+--B  %		,,	 ( 0 0c : : B B3 L LU]UUYUUU++---"n99x99 %-%.1<*8)6* * $'x==%
! 
! (C'::: NaImQquMMMMN N N N N N N N N N N N N N N E8EEFFFDS]]DDEEE<]<<===JxJJJJWWW$$MME(EEEzRRR4 	 	 	<CFF<<===MMAhAAA:NNN44444	sC   H
K *IK IK IA!K 9K 
L#9LL#)r   r.      r     c                 
  K   |                      d| d| d          }	 g }d}|                     d|            |                     d|            t          |          D ]\  }}|                     d| d|d	z    d
t          |           d           |dk    r|                     d           |                     |||||	|dk    |||||
|||||           d{V }|rt          |t                    rd|v r|                    dg           }d}|D ]}|                    d          r|d	z  }|                     d| d| dt          |           d           |                    |           |d	z  }t          |          dk    r|                     d| d            nhn5|                     d| d           n|                     d| d           ||t          |          d	z
  k     rt          j
        d           d{V  |rg }|D ]!}|                    d          r|                    di           }|                    di                               d          }dAd}d  }||                    d!i                               d"           ||           ||d#           ||d$d          r! ||d$d                              d%d&          nd& ||d'd          r! ||d'd                              d%d&          nd& ||d(d          d)}||                    |           #t          t          j                              }|                    d*d+                              d,d+          } d-|  d+| d.}!|                                  | j         d
|! }"||||t          |          k     r
|d|         n||d/t          |          |d0}#t#          |"d1d23          5 }$t%          j        |#|$d4d56           ddd           n# 1 swxY w Y   |                     d7|"            |                     d8t          |                      |                     d9| d
t          |                      | j        sCddl}%|%j                            |"          }&d:|&i}'t1          t%          j        |'                     |                      d;| d<|           |#S t1          d=           |                      d>| d<|           dS # t4          $ rD}(t1          d?t7          |(                      |                      d@| d<|           Y d}(~(dS d}(~(ww xY w)Bz4Fetch data from multiple offsets and combine resultszMulti-offset fetch: 'z' (offsets: r   r   u&   🔄 Starting multi-offset fetch for: u   📊 Offsets to fetch: u   
📄 Fetching offset z (rH   r   r  u0   ⚡ Skipping login check - already authenticated)r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  Nr   r   u   ✅ Offset r  z valid items from z totalu   📄 No more results at offset z, stopping...u   ⚠️ Offset z: No 'results' in responseu   ❌ Offset z*: Failed to fetch data or invalid responser  r   r   r   c                     	 |                      |i                                dg           |                              dd          S # t          t          f$ r Y d S w xY wr   r   r   s      r   r   z;EbayLogin.fetch_multiple_offsets.<locals>.safe_extract_text  r   r   c                     	 |                      di                                di                                dg           d                              dd          S # t          t          f$ r Y d S w xY w)Nr   r   r   r   rI   r   )r   s    r   safe_extract_pricez<EbayLogin.fetch_multiple_offsets.<locals>.safe_extract_price  s    (#&77?B#?#?#C#COUW#X#X#\#\]hjl#m#mno#p#t#tu{}  $A  $A  A *N; ( ( (#'44(s   AA A/.A/r   r   r   r   r   rI   r   r   )r   r   r   r   r   r   r   r   r   r   ebay_research_combined_offsets_r   )r   r   limit_per_offsetoffsets_fetchedsuccessful_fetchesr  rc   r   r   r   Fr   r"  r#  u   📄 Successful fetches: filez Multi-offset fetch successful: 'r   u+   ❌ No valid data collected from any offsetzMulti-offset fetch (no data): 'u!   ❌ Error in multi-offset fetch: zMulti-offset fetch error: 'r   )r*   r#   	enumeraterT   r  
isinstancedictr?   r$  r{   r%  r   r   r   r&   r   r   rh   ri   rj   r   r   ro   abspathr!   dumpsr@   rA   ))r   r   r   r   offsetsr   r   r   r  r   r  r  r  r  r  r  r   	all_itemsr3  ir   r'  r   processed_countr  combined_processedr   r   r   r/  r  rw   r  r  r  r(  rk   r   	full_pathresultrE   s)                                            r   fetch_multiple_offsetsz EbayLogin.fetch_multiple_offsets  s     
 ]]#[8#[#[QX#[#[#[\\
R	I!"PhPPQQQ@w@@AAA&w// :- :-	6  !]6!]!]QqS!]!]3w<<!]!]!]^^^ &))$$%WXXX #'"?"?%'! +&81&<%%%5 +###'!! #@ # #      	&  It!<!<  I--"+--	2">">*+$+ 1 1D#xx(9:: ) (+q0OO(()~v)~)~)~)~jmnujvjv)~)~)~!((111*a/* w<<1,, ,,-dv-d-d-deee!E -
 (()\&)\)\)\]]]]$$%e6%e%e%efff s7||a'''!-,,,,,,,,,  I%'"% 7 7Dxx 122 ! "hhy"55G#KK4488??E( ( ( (( ( ( "'")++h";";"?"?"H"H!3!3D!9!9!2!27G!D!Dararsw  zE  GH  bI  bI  &Q%6%6t[!%L%L%T%TUXZ\%]%]%]  OQctctuy  |H  JK  dL  dL  'T&7&7lA&N&N&V&VWZ\^&_&_&_  RT(9(9$PQ(R(R C (*11#666  	,,	 ( 0 0c : : B B3 L L]]]]Y]]]++---"n99x99 %-%.,1K]`cdk`l`lKlKl73F4F3F+G+Gry.@* * $''9#:#:/
! 
! (C'::: [aImQ:TYZZZZ[ [ [ [ [ [ [ [ [ [ [ [ [ [ [   !Ph!P!PQQQ  !YDV@W@W!Y!YZZZ  !`=O!`!`RUV]R^R^!`!`aaa z .III " 9 9I$i0F$*V,,---LLLLjYYY$$CDDDKKKKZXXXt 	 	 	>c!ff>>???MMCCCCZPPP44444	sC   OT 6PT PT "P#CT 1)T 
U*&9U%%U*c                   K   	 |                                   d{V  | j        r| j                                         d{V  | j        r| j                                         d{V  | j        r| j                                         d{V  |                     d           n6# t          $ r)}t          dt          |                      Y d}~nd}~ww xY wdS )zClose the browser and cleanupNz%Browser closed and session data savedz'Warning: Error during browser cleanup: )	r   r   closer
   r	   r#   r@   r!   rA   r   s     r   close_browserzEbayLogin.close_browser!  s*     	F((*********y (ioo'''''''''| +l((*********| +l((*********DEEEE 	F 	F 	FDCFFDDEEEEEEEE	Fs   B!B& &
C0CC)F)N)r7   )r   r   r   r   r   FNNNr   r   r   r   NNN)r   r   r  r   )__name__
__module____qualname__r   r   r#   r*   r6   rF   ra   rl   rs   r   r   r   r   r   r  r)  rA  rD   r   r   r   r      s          3 3 3  
	  	  	  	   $   $&' &' &'P      6  "5 5 5 5@' ' 'Rn n n` HMfoRaJNv v v vpP P P Pd 5BRWYczczcz-1DSWen016FV`o,0DY Y Y Yv    r   r   c                    K   t          j        d          } |                     dddd           |                     dd	d
           |                     dt          dd           |                     dt          dd           |                     dt          dd           |                     dddgdd           |                     dddgdd           |                     dt          dd            |                     d!t          dd"           |                     d#t          d$d%           |                     d&t          dd'           |                     d(t          dd)           |                     d*d+d,           |                     d-d.d/           |                     d0d1d2           |                     d3d4d56           |                                 }t          j                    }t          |j        7          }	 |	                    d8t          j                                        d9                      |j        rt          d:           |                                \  }}|r|st          d;           	 t          j                    |z
  }||j        d<<   |j        r!t          |                                           |	                    d=t          j                                        d9                      |                                 d{V  dS |                    d>?           d{V  |                                 d{V r|	                    d@           n|	                    dA           |                    ||           d{V }|st          dB           	 t          j                    |z
  }||j        d<<   |j        r!t          |                                           |	                    d=t          j                                        d9                      |                                 d{V  dS |	                    dC           |	                    dD           |	                    dE           |                    |j        |j        |j        |j        |j        dFz   |j        dGz   |j        dHz   |j        dIz   g|j        |j        |j        |j        |j        |j        |j         |j!        |j"        |j#        |j$        J           d{V }|rB|	                    dK           |	                    dL|%                    dMd                      nt          dN           n6# tL          $ r)}	t          dOtO          |	                      Y d}	~	nd}	~	ww xY wt          j                    |z
  }||j        d<<   |j        r!t          |                                           |	                    d=t          j                                        d9                      |                                 d{V  dS # t          j                    |z
  }||j        d<<   |j        r!t          |                                           |	                    d=t          j                                        d9                      |                                 d{V  w xY w)PzExample usagezeBay Research Data Fetcher)descriptionr   ?r   z(Search keywords (default: "iphone case"))nargsdefaulthelpz--marketplacer   z#eBay marketplace (default: EBAY-US))rM  rN  z--categoryIdr   z+Category ID (default: 0 for all categories))typerM  rN  z
--minPriceNzMinimum price filterz
--maxPricezMaximum price filterz--topRatedProductsSHOWEXCLUDEzOTop-rated products filter: SHOW (only top-rated) or EXCLUDE (exclude top-rated))choicesrM  rN  z--formatFIXED_PRICEAUCTIONz&Listing format: FIXED_PRICE or AUCTIONz
--dayRanger   z"Day range for search (default: 90)z--offsetzSearch offset (default: 0)z--limitr   z'Results limit per request (default: 50)z	--endDatez!End date timestamp (milliseconds)z--startDatez#Start date timestamp (milliseconds)z	--tabNamer   zTab name (default: SOLD)z--tzr   z Timezone (default: Africa/Cairo)z	--modulesr   z$API modules (default: searchResults)z--debug
store_truezEnable debug output)actionrN  )r   u&   🚀 Starting eBay research script at z%Y-%m-%d %H:%M:%Su1   🐛 Debug mode enabled - showing detailed outputz0Failed to load credentials from config.info filezTOTAL SCRIPT RUNTIMEu   🏁 Script completed at F)r   u,   🎉 Already logged in! Using saved session.u'   🔐 Not logged in, attempting login...u   ❌ Login failed!z3
==================================================u+   🔬 Starting eBay Research Data Collectionr-   r.   r*  r  r+  )r   r   r   r:  r   r   r   r  r   r  r  r  r  r  r  u&   ✅ Multi-offset data fetch completed!r#  r!  u)   ❌ No data was collected from any offsetzError: )(argparseArgumentParseradd_argumentr   float
parse_argsr&   r   r   r#   r   nowstrftimer!   rF   r   r6   rD  r   r   r   rA  r   dayRanger   r   r   r   r   r  
categoryIdr  r  r  r  r  r  r?   r@   rA   )
parserargstotal_start_time
ebay_loginrD   r;   total_runtimesuccessr(  rE   s
             r   mainrf  4  s      $1MNNNF 
#}Kuvvv
Afggg
S!Boppp 5$E[\\\
5$E[\\\
,vy6ISWm  o o o

]I,FPTD  F F F 3Aefff

a>Z[[[
	R>ghhh
#tBefff
CDijjj V:TUUU
(8?abbb
_Cijjj 	,=RSSSDy{{,,,JX)vH_H_`sHtHtvvwww: 	GEFFF %5577x 	H 	DEEEL 	&66=J
"#9:  	4*0022333i8<>>;R;RSf;g;giijjj&&(((((((((((W &&&666666666 ..00000000 	""#QRRRR""#LMMM&44UHEEEEEEEEG )***r 	&66=J
"#9:  	4*0022333i8<>>;R;RSf;g;giijjj&&(((((((((((} 	}---LMMMv&&& )??]m*[$+"3T[35FVYHY[_[fil[lm]]!2(LwLLn; @ 
 
 
 
 
 
 
 
$  	?""#KLLL""#g-BSBSTacdBeBe#g#ghhhh=>>>.  " " " A  !!!!!!!!" 	&66=J
"#9:  	4*0022333i8<>>;R;RSf;g;giijjj&&((((((((((( 	&66=J
"#9:  	4*0022333i8<>>;R;RSf;g;giijjj&&((((((((((s@   A<V )BV D,V Y 
V8V3.Y 3V88Y B [;__main__)r{   playwright.async_apir   r   ri   r<   r&   sysrW  r   r   r   rf  rE  runrH  r   r   <module>rk     s     1 1 1 1 1 1 				       



  ( ( ( ( ( ( ( (e e e e e e e eP~) ~) ~)B zGK r   