
    6iM$                         d Z ddlZddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZmZmZmZmZ  ej                   dd      Z ej                   dd	      Zd
ededz  fdZd
edee   fdZdee   dee   fdZdedefdZy)z[
Research Phase Node
Gathers GSC data, competitor analysis, and SERP feature opportunities
    N)datetime)AnyDict)SEOCampaignStateCampaignPhasetransition_phase	add_erroradd_warningGSCDataCompetitorDataSERPFeatureDataNEXT_API_URLzhttp://127.0.0.1:3000MCP_URLzhttp://127.0.0.1:3001site_idreturnc                 B  K   	 t        j                  d      4 d{   }|j                  t         d|  dddt	        j
                  dd	       i
       d{   }|j                  dk(  r|j                         }t        |j                  dd	      |j                  di       |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dg       dd |j                  dg       dd t        j                         j                         	      cddd      d{    S ddd      d{    y7 >7 7 7 # 1 d{  7  sw Y   yxY w# t        $ r}t        d|        Y d}~yd}~ww xY ww)z+Fetch Google Search Console data for a site      >@timeoutNz/api/admin/seo/gsc/z/performanceAuthorizationBearer INTERNAL_API_TOKEN headers   propertyUrl	dateRangetotalImpressionsr   totalClicks
averageCtrg        averagePosition
topQueries2   topPages)	property_url
date_rangetotal_impressionstotal_clicksaverage_ctraverage_positiontop_queries	top_pages
fetched_atz [ResearchNode] GSC fetch error: )httpxAsyncClientgetr   osgetenvstatus_codejsonr   r   utcnow	isoformat	Exceptionprint)r   clientresponsedataes        6/var/www/html/langgraph-service/nodes/research_node.pyfetch_gsc_datar?      s    6$$T2 	 	f#ZZ. 3G9LI(GBII>RTV4W3X*YZ (  H ##s*}}!%-!<#xxR8&*hh/A1&E!%-!; $s ;%)XX.?%E $r :3B ?"hhz26s;'0::<
	 	 	 	 	( )		 	 	 	 	(   604556s   FE; EE; :E&ECE&9E; E"E; 
FE; E$E; FE; E&"E; $E; &E8,E/-E84E; 7F8E; ;	FFFFFc                 2  K   g }	 t        j                  d      4 d{   }|j                  t         dddt	        j
                  dd       i	       d{   }|j                  d
k(  r|j                         }|j                  dg       dd D ]  }|j                  t        |j                  dd      |j                  dd      |j                  dd      |j                  dg       dd |j                  dg       dd |j                  dg       dd t        j                         j                                       ddd      d{    |S 7 57 7 # 1 d{  7  sw Y   |S xY w# t        $ r}t        d|        Y d}~|S d}~ww xY ww)zFetch competitor analysis datar   r   Nz/api/admin/seo/competitorsr   r   r   r   r   r   competitors   domaindomainAuthorityr   estimatedTraffictopKeywords   contentGapsbacklinkSources)rC   domain_authorityestimated_traffictop_keywordscontent_gapsbacklink_sourcesanalyzed_atz'[ResearchNode] Competitor fetch error: )r/   r0   r1   r   r2   r3   r4   r5   appendr   r   r6   r7   r8   r9   )r   rA   r:   r;   r<   compr=   s          r>   fetch_competitor_datarR   6   s    K=$$T2 	 	f#ZZ. :;(GBII>RTV4W3X*YZ (  H ##s*}} HH]B7; 	D&&~#xx"5)-2CQ)G*.((3Eq*I%)XXmR%@"%E%)XXmR%@"%E)-2CR)H")M$,OO$5$?$?$A( 		 	& '		 	 	 	&   =7s;<<=s   FE2 EE2 7EEC'EE2 EE2 FE2 EE2 E/"E%#E/*E2 -F/E2 2	F;F	FFFkeywordsc                   K   g }	 t        j                  d      4 d{   }| dd D ]  }	 |j                  t         ddddd	d
|idd       d{   }|j                  dk(  r|j                         j                  di       }|j                  dg       }|rddl}|j                  |d   j                  dd            }dD ]|  }	|j                  d|	       s|j                  t        ||	|j                  d      |j                  d|	 d      dd|j                  dd      |j                  d      dd
             ~  ddd      d{    |s5| dd D ]-  }d D ]&  }	|j                  t        ||	dddddddd
             ( / |S 7 s7 @# t        $ r}
t        d| d|
        Y d}
~
d}
~
ww xY w7 k# 1 d{  7  sw Y   {xY w# t        $ r}
t        d|
        Y d}
~
d}
~
ww xY ww)!z.Detect SERP feature opportunities for keywordsg      N@r   N   z/rpcz2.0   z
tools/callserp_feature_checkerkeyword)name	arguments)jsonrpcidmethodparams)r5   r   resultcontentr   textz{})snippetpaaai_overviewhas_our_positionwe_own_Fai_overview_mentions_uscitation_context)
rX   feature_typecurrent_positioncapturedcaptured_atcontent_hashai_overview_mentionri   	optimizedoptimization_appliedz%[ResearchNode] SERP check error for 'z': z%[ResearchNode] SERP detection error: 
   )rb   rc   )r/   r0   postr   r4   r5   r1   loadsrP   r   r8   r9   )rS   featuresr:   rX   r;   r_   r`   r5   r<   rj   r=   s              r>   detect_serp_featuresrv   P   sE    H(;$$T2 %	 %	f#CR= $#%+[[")4(',"#&2(>.7-A'	 &1 &  H  ++s2!)!4!4Xr!B"(**Y";"'#'::gajnnVT.J#KD0Q '#'88d<.,A#B$,OOO075A9=.9Q15GL>:RTY1Z4859<@HHE^`e<f9=BT9U27=A5& %'')$%	 %	T } 	G 2 #!-%)" $!%(-%)#)-! 	 Ou%	 @ ! A'#aSQRG%	 %	 %	 %	L  ;5aS9::;s   G<G FG 
G'FFBF A'FG
G GG 9G<G F	F>"F93G9F>>GG G	G
GG 	G9!G4/G<4G99G<statec           
      &  K   t        d| d           | d   }t        j                         j                         }	 t	        |       d{   }|r|| d<   t        d|d    d|d    d	       nt        | d
d      } d}t        |       d{   }|| d<   t        dt        |       d       g }|r/|j                  dg       D cg c]  }|j                  dd       }}|D ]A  }|j                  |j                  dg       D cg c]  }|j                  dd       c}       C |sg d}t        | d
d      } t        t        |            dd }t        |       d{   }	|	| d<   t        dt        |	       d       t        | t        j                        } || d<   | S 7 X7 c c}w c c}w 7 R# t         $ rQ}
t        d|
        t#        | d
dt%        |
             } t        | t        j                        } || d<   Y d}
~
| S d}
~
ww xY ww)z
    Research phase node

    Gathers:
    - Google Search Console data
    - Competitor analysis
    - SERP feature opportunities
    z*[ResearchNode] Starting research for site r   Ngsc_dataz[ResearchNode] GSC data: r(   z impressions, r)   z clicksresearchz2Could not fetch GSC data - using fallback keywordscompetitor_dataz[ResearchNode] Analyzed z competitorsr,   queryr   rL   rX   )zmlb props betting strategyzmlb moneyline value pickszmlb totals sharp moneyzmlb spread betting analyticszmlb injury impact bettingznba player props predictionsznba spread betting tipsznba totals over underznba sharp money indicatorszwhat is sharp money bettingzhow to fade the publiczbest sports betting analyticszsports betting value pickszlive odds comparison toolszAUsing sports betting keywords - connect GSC for personalized datar$   serp_features_dataz[ResearchNode] Found z SERP feature opportunities
updated_atz&[ResearchNode] Error during research: zResearch phase failed: )r9   r   r6   r7   r?   r
   rR   lenr1   extendlistsetrv   r   r   CONTENTr8   r	   str)rw   r   nowry   r{   rS   qrQ   kserp_featuresr=   s              r>   research_phaser      s=     
6uY7G6H
IJIG
//

%
%
'C>"'00 (E*-h7J.K-LN[cdr[sZtt{|}z3ghEH !6g >>#2 (_)=(>lKL 4<LLPR4STqgr*THT# 	ZDOO488NTV;WXaQUU9b1XY	Z H&  z3vwEH&s+ 38<<&3"#%c-&8%99TUV !(=(=>!l L} 1 ? UX8 =  "6qc:;%/Fs1vh-OP (=(=>!lL"s   9HF4 
F"AF4 F%9F4 F(&F4 F-
AF4 F2 A F4  H"F4 %F4 (F4 4	H=AH	H	HH)__doc__r2   r/   r   typingr   r   state.campaign_stater   r   r   r	   r
   r   r   r   r3   r   r   r   r?   r   rR   rv   r        r>   <module>r      s   
 
   	 	 	 ryy)@A
"))I6
7# 'D. 4 n1E 4@c @tO7L @FN 0 N5E Nr   