
    BTjQ                       d 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ZddlZ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ZddlZ ed      Zej)                  d        ed	      Z ed
      ZdZd Z e        ej2                  j5                  d      xs dZej2                  j5                  dd      Zej2                  j5                  dd      Zej2                  j5                  dd      Zej2                  j5                  dd      Zej2                  j5                  dd      Z ej2                  j5                  dd      Z!d Z" ed      Z# ed      Z$ ed      Z% ed      Z&h dZ'd_dede(dz  de)fdZ*d e+de)fd!Z,d" Z-d# Z.d$e+d%e(de(fd&Z/d'e(fd(Z0d'e(de+dz  fd)Z1d%e(de2fd*Z3d+e)de)fd,Z4d`de(fd-Z5d.e)d/e)de)dz  fd0Z6d1e)de+fd2Z7dad3e)d4ed5e(de8fd6Z9d.e)d/e)de+fd7Z:d8e)de+fd9Z;d.e)d/e)de)fd:Z<d e+de+fd;Z=d e+de+fd<Z>d e+de+fd=Z?d e+de+fd>Z@d?e+d e+d@e2e)   dAe)de)f
dBZAd?e+d e+d@e2e)   dAe)de)f
dCZBdDe+dEe)dFede2e)   fdGZCd?e+d e+d@e2e)   de)fdHZDd'e(dIedJe(dKe)ddf
dLZEdKe)dJe(de)fdMZFdKe)de8fdNZGdbd8e)d4edOe(de8fdPZHd'e(d e+d?e+dQe)dRedz  dSede8fdTZI edU      ZJde)fdVZKdWe)de)fdXZL	 d_d'e(d e+d?e+dQe)dYe+dz  dedz  fdZZMd[ed\ede8fd]ZNd'e(d$e+ddfd^ZOy)cu  
analisador.py - Analisador automático de leads (prospeccao ativa)

Fluxo:
  1) Coleta dados públicos (Google Places, Instagram, site atual)
  2) Gera copy persuasiva com OpenAI GPT-4o
  3) Baixa imagens (Google Photos ou Unsplash fallback)
  4) Monta site HTML + serve via porta local + registra rota Traefik + DNS Cloudflare
  5) Gera dossiê PDF via WeasyPrint (com screenshot Playwright)
    N)Path)datetime)
quote_plusz/opt/mia/workspace/analisesT)exist_okz,/opt/mia/workspace/prospeccao_ativa/users.dbz)/etc/easypanel/traefik/config/custom.yamlzagentesclimb.usc                     t        d      } | j                         sy| j                         j                         D ]  }|j	                         }|r|j                  d      sd|vr+|j                  dd      \  }}|j	                         }|j	                         j	                  d      j	                  d      }|s|t        j                  vs|t        j                  |<    y)uA   Carrega /opt/mia/.env em os.environ se ainda não estiver setado.z/opt/mia/.envN#=   "')	r   exists	read_text
splitlinesstrip
startswithsplitosenviron)env_pathlinekvs       1/opt/mia/workspace/prospeccao_ativa/analisador.py_load_env_filer   (   s    O$H??""$//1 zz|ts+s$zz#q!1GGIGGIOOC &&s+"**$BJJqM    GOOGLE_PLACES_KEY'AIzaSyCnOTQxLdFua3OLBnNbb0Husoo9dH80FbwOPENAI_API_KEY ANTHROPIC_API_KEYCLAUDE_CODE_OAUTH_TOKENCLOUDFLARE_DNS_TOKENCLOUDFLARE_ZONE_IDUNSPLASH_ACCESS_KEYc                  |    ddl } t        r| j                  t              S t        r| j                  t              S y)zARetorna cliente Anthropic usando API key ou OAuth token (Bearer).r   Napi_key)
auth_token)	anthropicr    	AnthropicANTHROPIC_OAUTH_TOKEN)
_anthropics    r   _get_anthropic_clientr-   A   s8    "##,=#>>##/D#EEr   z1/home/mia/.claude/skills/frontend-design/SKILL.mdz//home/mia/.claude/skills/ui-ux-pro-max/SKILL.mdz//home/mia/.claude/skills/landing-funil/SKILL.mdz9/home/mia/.claude/skills/landing-funil/reference/base.css>	   cursoebookonlinedigitalafiliadocoachingmentoriainfoprodutotreinamentopathlimitreturnc                     	 | j                  d      }||d| S |S # t        $ r}t        d|  d|        Y d}~yd}~ww xY w)uA   Lê um arquivo de skill do disco. Retorna string vazia se falhar.utf-8encodingNz[analisador] falha lendo skill : r   )r   	Exceptionprint)r7   r8   contentes       r   _read_skillrC   W   sW    ..'.26E?" /vRs;<s     	A<Adadosc                     | j                  d      xs dj                         }dj                  | j                  d      xs g       j                         }|dz   |z   t        fdt        D              ryy)zDClassifica o lead como 'digital' (infoproduto/curso/etc) ou 'local'.	categoriar    typesc              3   &   K   | ]  }|v  
 y wN ).0pcombineds     r   	<genexpr>z$detectar_segmento.<locals>.<genexpr>h   s     
3Q1=
3s   r1   local)getlowerjoinanyPALAVRAS_DIGITAL)rD   catrH   rN   s      @r   detectar_segmentorW   c   sg    99[!'R
.
.
0CHHUYYw'-2.446ESy5 H

3"2
33r   c                  t    t        j                  t        t                    } t         j                  | _        | S rJ   )sqlite3connectstrDB_PATHRowrow_factoryconns    r   	_get_connra   n   s%    ??3w<(D{{DKr   c                  z    t               } | j                  d       | j                          | j                          y)u*   Cria tabela lead_analises se não existir.a,  
        CREATE TABLE IF NOT EXISTS lead_analises (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            lead_nome TEXT NOT NULL,
            lead_telefone TEXT,
            lead_cidade TEXT,
            lead_categoria TEXT,
            lead_instagram TEXT,
            lead_site_atual TEXT,
            status TEXT DEFAULT 'aguardando',
            site_url TEXT,
            pdf_path TEXT,
            analise_json TEXT,
            erro TEXT,
            criado_em TEXT,
            concluido_em TEXT,
            user_id INTEGER
        )
    N)ra   executecommitcloser_   s    r   ensure_tablerf   t   s.    ;DLL  	& 	KKMJJLr   	lead_datauser_idc                    t                t               }|j                  d| j                  d      xs d| j                  d      xs d| j                  d      xs d| j                  d      xs d| j                  d      xs d| j                  d      xs dt	        j
                         j                         |f      }|j                          |j                  }|j                          |S )	Nz
        INSERT INTO lead_analises
            (lead_nome, lead_telefone, lead_cidade, lead_categoria,
             lead_instagram, lead_site_atual, status, criado_em, user_id)
        VALUES (?, ?, ?, ?, ?, ?, 'aguardando', ?, ?)
    nomer   telefonecidaderF   	instagram
site_atual)
rf   ra   rc   rQ   r   now	isoformatrd   	lastrowidre   )rg   rh   r`   curaids        r   criar_analisert      s    N;D
,,  	f#j!'Rh%2k"(bk"(bl#)r  "	
C 	KKM
--CJJLJr   
analise_idc                 ^   |sy g d}|j                         D ci c]  \  }}||v s|| }}}|sy dj                  d |D              }t        |j                               | gz   }t	               }|j                  d| d|       |j                          |j                          y c c}}w )N)statussite_urlpdf_pathanalise_jsonerroconcluido_em, c              3   &   K   | ]	  }| d   yw)z = ?NrK   )rL   r   s     r   rO   z!update_analise.<locals>.<genexpr>   s     1As$Z1s   zUPDATE lead_analises SET z WHERE id = ?)itemsrS   listvaluesra   rc   rd   re   )	ru   kwargscamposr   r   updatessetsvalsr`   s	            r   update_analiser      s    WF &>1!v+q!t>G>99111D !ZL0D;DLL,TF-@$GKKMJJL ?s
   B)B)c                     t               }|j                  d| f      j                         }|j                          |rt	        |      S d S )Nz(SELECT * FROM lead_analises WHERE id = ?)ra   rc   fetchonere   dict)ru   r`   rows      r   get_analiser      s?    ;D
,,AJ=
Q
Z
Z
\CJJL49%%r   c                     t                t               }|j                  d| f      j                         }|j	                          |D cg c]  }t        |       c}S c c}w )NzHSELECT * FROM lead_analises WHERE user_id = ? ORDER BY id DESC LIMIT 100)rf   ra   rc   fetchallre   r   )rh   r`   rowsrs       r   listar_analisesr      sS    N;D<<R	
 hj 	 	JJL!"DG"""s   
Atextc                     | syt        j                  d|       }|j                  dd      j                  d      }|j	                         }t        j                  dd|      }|j                  d      }|d d xs dS )NleadNFKDASCIIignorez
[^a-z0-9]+-(   )unicodedata	normalizeencodedecoderR   resubr   )r   nfkd
only_asciis      r   slugifyr      sv      .DWh/66w?J!!#JsJ7J!!#&Jcr?$f$r   c                 ,   t        | |dz         D ]U  }t        j                  t        j                  t        j                        5 }	 |j	                  d|f       |cd d d        c S  t        d      # t
        $ r Y d d d        vw xY w# 1 sw Y   xY w)Nr
   z	127.0.0.1zSem porta livre no range)rangesocketAF_INETSOCK_STREAMbindOSErrorRuntimeError)iniciofimrM   ss       r   porta_livrer      s    637# ]]6>>6+=+=> 	!Q'(	 	 1
22  	 			 	s*   B
A33	B<B
BB

B	rj   rl   c           	         	 t        j                  d|  d| j                         ddt        ddd      }|j	                         }|j                  d	      xs g }|r|d
   j                  d      S 	 y# t
        $ r Y yw xY w)z$Retorna place_id do estabelecimento.zAhttps://maps.googleapis.com/maps/api/place/findplacefromtext/jsonrG   	textqueryplace_idpt-BR)input	inputtypefieldskeylanguage   paramstimeout
candidatesr   N)requestsrQ   r   r   jsonr?   )rj   rl   r   datacandss        r   _google_find_placer      s    LLO 66(+113($(# 	
 vvx&,"8<<
++    s   A/A4 4	B ?B r   c                     	 t        j                  d| dt        ddd      }|j                         j                  d      xs i S # t        $ r i cY S w xY w)zDetalhes completos do lugar.z7https://maps.googleapis.com/maps/api/place/details/jsonzname,formatted_address,formatted_phone_number,website,opening_hours,rating,user_ratings_total,reviews,photos,types,url,international_phone_numberr   )r   r   r   r   r   r   result)r   rQ   r   r   r?   )r   r   s     r   _google_place_detailsr      sc    LLE$B )# 

 vvx||H%++ 	s   AA AAphoto_referencedestmaxwidthc                     	 d| d|  dt          }t        j                  |dd      }|j                  dk(  r(|j                  r|j                  |j                         yy# t        $ r Y yw xY w)	z&Baixa foto do Places (segue redirect).z:https://maps.googleapis.com/maps/api/place/photo?maxwidth=z&photoreference=z&key=   Tr   allow_redirects   F)r   r   rQ   status_coderA   write_bytesr?   )r   r   r   urlr   s        r   _google_photo_downloadr     s    
!
"2?2C5IZH[] 	 LLb$?==CAIIQYY'   s   AA! !	A-,A-c                    t        | |      }|si S t        |      }|si S |j                  d      xs g D cg c]%  }|j                  d      s|j                  d      ' }}|j                  d      xs d|j                  d      xs d|j                  d      xs |j                  d      xs d|j                  d      xs d|j                  d	      |j                  d
      |j                  d      xs g |j                  d      xs i j                  d      xs g |j                  d      xs g |j                  d      xs d|dd |dS c c}w )z(Retorna dict com dados do Google Places.photosr   namer   formatted_addressformatted_phone_numberinternational_phone_numberwebsiteratinguser_ratings_totalreviewsopening_hoursweekday_textrH   r   N   )nome_googleenderecork   site_googler   total_reviewsr   horariosrH   google_maps_url
fotos_refsr   )r   r   rQ   )rj   rl   piddetrM   r   s         r   coletar_google_placesr     s?   
T6
*C	

$C	58WWX5F5L"jqQRQVQVWhQi!%%)*jJjwwv,"GG/06BGG45dA]9^dbdwwy)/R''(#!56779%+WW_-388HNB!'R775>/R !n  ks   EEr   c                 D   | si S | j                  d      sd| z   } 	 t        j                  | dddi      }|j                  d d }d}t	        j
                  d	|t        j                  t        j                  z        }|r"|j                  d
      j                         d d }d}t	        j
                  d|t        j                        }|r"|j                  d
      j                         d d }|||j                  dS # t        $ r}dt        |      d d icY d }~S d }~ww xY w)N)http://https://r      
User-AgentMozilla/5.0r   headersi@ r   z<title>(.*?)</title>r
   r   z<<meta\s+name=["\']description["\']\s+content=["\'](.+?)["\']i,  )site_titulosite_descricaosite_status	site_errox   )r   r   rQ   r   r   searchISgroupr   r   r?   r[   )r   r   htmltitlemdescrB   s          r   coletar_site_atualr   2  s   	>>123+LLb<2OPvvgvII-tRTTBDD[AGGAJ$$&t,EIIUW[]_]a]ab771:##%ds+D$Q]][[ +SVDS\**+s   CC< <	DDDDc                    	 t        |  d| d      }t        j                  d| dddi      }|j                  }t	        j
                  d|      }|r%|j                  d	      }|j                         d
vr|S y# t        $ r Y yw xY w)uF   Heurística: tenta encontrar @handle do negócio via busca DuckDuckGo.rG   z
 instagramzhttps://duckduckgo.com/html/?q=
   r   r   r   z$instagram\.com/([a-zA-Z0-9._]{3,30})r
   )rM   reelreelsexploreaccountsr   )	r   r   rQ   r   r   r   r   rR   r?   )rj   rl   qr   r   r   handles          r   buscar_instagramr  G  s    $q
34LL-aS1!=1

 vvII=tDWWQZF||~%RR   s   A6A: :	BBc                    t         st        |       S 	 ddlm}  |t               }d}| j	                  d      rdj                  d | d   dd	 D              }d
| j	                  d      xs | j	                  d       d| j	                  d       d| j	                  d       d| j	                  d       d| j	                  d       d| j	                  d       d| j	                  d       ddj                  | j	                  d      xs g       dd  d|xs d d| j	                  d       xs d d!| j	                  d"      xs d d#}|j                  j                  j                  d$d%d&d'd(|d'gd)d*d+id,-      }|j                  d   j                  j                  j                         }t        j                  |      S # t        $ r#}t!        d.|        t        |       cY d}~S d}~ww xY w)/z=Gera copy persuasiva usando GPT-4o. Retorna dict estruturado.r   OpenAIr&   r   r   
c              3   r   K   | ]/  }d |j                  dd       d|j                  dd      dd   1 ywz- r   ?z/5: r   r   Nr   rQ   rL   r   s     r   rO   z$gerar_copy_openai.<locals>.<genexpr>g  D      % QUU8S)*$quuVR/@#/F.GH%   57Nr   u   Você é um copywriter sênior especialista em pequenos negócios locais brasileiros.

Gere copy persuasiva para uma landing page de demonstração deste negócio:

- Nome: r   rj   
- Cidade: rl   
- Categoria: rF      
- Endereço: r   
- Telefone: rk   
- Rating Google: r    (r       avaliações)
- Horários:  | r        

Avaliações reais recentes:
   (sem avaliações)

Site atual (se existe): r    - r   u  

Devolva EXATAMENTE este JSON (sem texto fora, sem markdown):
{
  "headline": "chamada principal impactante, até 12 palavras",
  "subheadline": "subheadline com promessa/benefício, até 25 palavras",
  "sobre": "parágrafo de 2-3 linhas apresentando o negócio, tom acolhedor e profissional",
  "servicos": [
    {"titulo": "Serviço 1", "descricao": "descrição curta"},
    {"titulo": "Serviço 2", "descricao": "descrição curta"},
    {"titulo": "Serviço 3", "descricao": "descrição curta"}
  ],
  "por_que_escolher": [
    "Motivo 1 em uma linha",
    "Motivo 2 em uma linha",
    "Motivo 3 em uma linha",
    "Motivo 4 em uma linha"
  ],
  "depoimentos": [
    {"nome": "Nome plausível brasileiro", "texto": "depoimento verossímil baseado nas avaliações reais", "rating": 5},
    {"nome": "Outro nome", "texto": "outro depoimento", "rating": 5}
  ],
  "cta_principal": "texto do botão principal (2-4 palavras)",
  "cta_secundario": "texto do botão secundário",
  "cor_primaria": "hex hex adequado ao segmento, ex #2E7D32",
  "cor_secundaria": "hex secundário complementar",
  "analise_oportunidades": [
    "Oportunidade 1 identificada olhando o negócio",
    "Oportunidade 2",
    "Oportunidade 3"
  ]
}
gpt-4osystemuF   Você devolve APENAS JSON válido, sem markdown, sem cerca de código.rolerA   userffffff?typejson_object  modelmessagestemperatureresponse_format
max_tokensz[analisador] erro openai: r   _copy_fallbackopenair	  rQ   rS   chatcompletionscreatechoicesmessagerA   r   r   loadsr?   r@   )rD   r	  clientreviews_textpromptresprA   rB   s           r   gerar_copy_openair;  \  s   e$$I%!/99Y99 %y)"1-% L
	 
=	!	6UYYv%67 899X
  ii$% &ii
#$ %YYz"# $))H%&b?)C(D Ejj:.4"5ds;< = %% & '=17R8EIIFV<W<][];^  _/` {{&&--!.vwF3 #]3 . 	
 ,,q/))11779zz'"" %*1#./e$$%s   F,G   	G,	G'!G,'G,c                    | j                  d      xs | j                  d      xs d}| j                  d      xs d}| d| d| j                  dd	       d
| ddddddddddgg dddddddddgddddg ddS ) Nr   rj   u   Seu NegóciorF   atendimentou   Referência em z em rl   r   u	   Conheça uZ   . Atendimento de qualidade, profissionais experientes e resultados que fazem a diferença.Atendimentou!   Serviço profissional e dedicado.)titulo	descricao	Qualidadeu'   Padrão de excelência em cada detalhe.u
   Confiançaz'Anos de mercado e clientes satisfeitos.)u   Experiência comprovadazAtendimento personalizadou   Localização acessívelu   Preços justosz	Ana Silvaz Atendimento nota mil. Recomendo!r   )rj   textor   zCarlos Souzaz/Profissionais atenciosos e resultado excelente.Agendar agoraFale conosco#2E7D32#1B5E20)u;   Otimizar presença digital para atrair mais clientes locaisz'Implantar sistema de agendamento onlineu8   Estruturar campanhas de tráfego pago para escalar leads)headlinesubheadlinesobreservicospor_que_escolherdepoimentoscta_principalcta_secundariocor_primariacor_secundariaanalise_oportunidadesr  )rD   rj   rV   s      r   r/  r/    s    99]#Juyy'8JND
))K
 
1MCf(T%))Hb2I1JKTF"|}$3VW"1Z[#2[\


 !+MYZ[#._klm
 )(!#"
/ r   c                    t         st        |       S 	 ddlm}  |t               }d}| j	                  d      rdj                  d | d   dd	 D              }d
}d| j	                  d      xs | j	                  d       d| j	                  d       d| j	                  d       d| j	                  d       d| j	                  d       d| j	                  d       d| j	                  d       ddj                  | j	                  d      xs g       dd  d|xs d d | j	                  d!      xs d d"| j	                  d#      xs d d$}|j                  j                  j                  d%d&|d'd(|d'gd)d*d+id,-      }|j                  d   j                  j                  j                         }t        j                  |      S # t        $ r#}t!        d.|        t        |       cY d}~S d}~ww xY w)/z4Gera copy com persona Jonathan usando OpenAI GPT-4o.r   r  r&   r   r   r
  c              3   r   K   | ]/  }d |j                  dd       d|j                  dd      dd   1 ywr  r  r  s     r   rO   z._gerar_copy_jonathan_openai.<locals>.<genexpr>  r  r  Nr   uj  Você é Jonathan, copywriter sênior especialista em marketing digital para pequenos negócios brasileiros.
Você escreve copy persuasiva, humana, específica para o segmento — nunca genérica ou robótica.
Você usa gatilhos emocionais, linguagem próxima, e adapta o tom ao tipo de negócio.
Você devolve APENAS JSON válido, sem markdown, sem texto extra.V   Gere copy persuasiva para uma landing page de demonstração deste negócio:

- Nome: r   rj   r  rl   r  rF   r  r   r  rk   r  r   r  r   r  r  r   r  r  r  r  r   r  r   u   

Devolva EXATAMENTE este JSON (sem texto fora, sem markdown):
{
  "headline": "chamada principal impactante, até 12 palavras",
  "subheadline": "subheadline com promessa/benefício, até 25 palavras",
  "sobre": "parágrafo de 2-3 linhas apresentando o negócio, tom acolhedor e profissional",
  "servicos": [
    {"titulo": "Serviço 1", "descricao": "descrição curta"},
    {"titulo": "Serviço 2", "descricao": "descrição curta"},
    {"titulo": "Serviço 3", "descricao": "descrição curta"}
  ],
  "por_que_escolher": [
    "Motivo 1 em uma linha",
    "Motivo 2 em uma linha",
    "Motivo 3 em uma linha",
    "Motivo 4 em uma linha"
  ],
  "depoimentos": [
    {"nome": "Nome plausível brasileiro", "texto": "depoimento verossímil baseado nas avaliações reais", "rating": 5},
    {"nome": "Outro nome", "texto": "outro depoimento", "rating": 5}
  ],
  "cta_principal": "texto do botão principal (2-4 palavras)",
  "cta_secundario": "texto do botão secundário",
  "cor_primaria": "hex adequado ao segmento (ex: clínica estética tons rosé/nude/dourado; restaurante tons quentes; academia tons vibrantes)",
  "cor_secundaria": "hex secundário complementar",
  "analise_oportunidades": [
    "Oportunidade 1 identificada olhando o negócio",
    "Oportunidade 2",
    "Oportunidade 3"
  ]
}
r  r   r!  r#  r$  r%  r&  r'  r(  z.[analisador] erro Jonathan (openai fallback): r.  )	rD   r	  r7  r8  system_promptuser_promptr:  rA   rB   s	            r   _gerar_copy_jonathan_openairW    s   e$$O%!/99Y99 %y)"1-% LP 			=	!	6UYYv%67 899X
  ii$% &ii
#$ %YYz"# $))H%&b?)C(D Ejj:.4"5ds;< = %% & '=17R8EIIFV<W<][];^  _-\ {{&&--!m<K8 #]3 . 	
 ,,q/))11779zz'"" %>qcBCe$$%s   F.G 	G.G)#G.)G.c                 @   t               }|st        |       S 	 d}| j                  d      rdj                  d | d   dd D              }d}d| j                  d	      xs | j                  d
       d| j                  d       d| j                  d       d| j                  d       d| j                  d       d| j                  d       d| j                  d       ddj                  | j                  d      xs g       dd  d|xs d d| j                  d      xs d d| j                  d       xs d d!}|j                  j                  d"d#|d$|d%g&      }d}|j                  D ]  }t        |d'      s||j                  z  }  |j                         }|j                  d(      r.t        j                  d)d|      }t        j                  d*d|      }t        j                  |      S # t        $ r#}t!        d+|        t#        |       cY d}~S d}~ww xY w),u   Gera copy persuasiva via persona do Jonathan (Anthropic Haiku).
    Se não houver chave Anthropic, usa OpenAI com a mesma persona.
    Fallback final: _copy_fallback.r   r   r
  c              3   r   K   | ]/  }d |j                  dd       d|j                  dd      dd   1 ywr  r  r  s     r   rO   z&gerar_copy_jonathan.<locals>.<genexpr>4  r  r  Nr   u  Você é Jonathan, copywriter sênior especialista em marketing digital para pequenos negócios brasileiros.
Você escreve copy persuasiva, humana e que converte — nunca genérica ou robótica.
Você devolve APENAS JSON válido, sem markdown, sem texto extra.rT  r   rj   r  rl   r  rF   r  r   r  rk   r  r   r  r   r  r  r   r  r  r  r  r   r  r   u  

Devolva EXATAMENTE este JSON (sem texto fora, sem markdown, sem cerca de código):
{
  "headline": "chamada principal impactante, até 12 palavras",
  "subheadline": "subheadline com promessa/benefício, até 25 palavras",
  "sobre": "parágrafo de 2-3 linhas apresentando o negócio, tom acolhedor e profissional",
  "servicos": [
    {"titulo": "Serviço 1", "descricao": "descrição curta"},
    {"titulo": "Serviço 2", "descricao": "descrição curta"},
    {"titulo": "Serviço 3", "descricao": "descrição curta"}
  ],
  "por_que_escolher": [
    "Motivo 1 em uma linha",
    "Motivo 2 em uma linha",
    "Motivo 3 em uma linha",
    "Motivo 4 em uma linha"
  ],
  "depoimentos": [
    {"nome": "Nome plausível brasileiro", "texto": "depoimento verossímil baseado nas avaliações reais", "rating": 5},
    {"nome": "Outro nome", "texto": "outro depoimento", "rating": 5}
  ],
  "cta_principal": "texto do botão principal (2-4 palavras)",
  "cta_secundario": "texto do botão secundário",
  "cor_primaria": "hex adequado ao segmento, ex #2E7D32",
  "cor_secundaria": "hex secundário complementar",
  "analise_oportunidades": [
    "Oportunidade 1 identificada olhando o negócio",
    "Oportunidade 2",
    "Oportunidade 3"
  ]
}
zclaude-haiku-4-5-20251001  r#  r!  r)  r-  r   r*  r   ```z^```(?:json)?\s*\s*```$z([analisador] erro Jonathan (anthropic): )r-   rW  rQ   rS   r*  r3  rA   hasattrr   r   r   r   r   r   r6  r?   r@   r/  )	rD   r7  r8  rU  rV  r:  rawblockrB   s	            r   gerar_copy_jonathanra  (  sN    #$F*511U%99Y99 %y)"1-% LP 			=	!	6UYYv%67 899X
  ii$% &ii
#$ %YYz"# $))H%&b?)C(D Ejj:.4"5ds;< = %% & '=17R8EIIFV<W<][];^  _-^ %%- %+>?	 & 
 \\ 	"Euf%uzz!	" iik >>% &&,b#6C&&R-Czz# %8<=e$$%s%   E"G1 <A4G1 1	H:HHHcopyimagenssegmentoc                    t         st        | ||      S 	 ddlm}  |t               }|j	                  d      xs |j	                  d      xs d}|j	                  d      xs d}|j	                  d	      xs d}|j	                  d
      xs d}	|j	                  d      xs |j	                  d      xs d}
|j	                  d      xs d}|j	                  d      xs d}|j	                  d      xs g }t        j                  dd|
xs d      }|r|j                  d      sd|z   }d}|dk(  r-t        t        d      }t        t              }d| d| }d}d}n.t        t        d      }t        t        d      }d| d| }d}d}dj                  g d | d!| d"| d#|	 d$|
 d%| d&| d'd(j                  |      d)d*  d+t        j                  | d,d-.       d/t        j                  |       d0| d1| d2| d3| d4| d5      }|j                   j"                  j%                  d6d7|d8d9|d8gd:d;<      }|j&                  d   j(                  j*                  j-                         }|j                  d=      r.t        j                  d>d|      }t        j                  d?d|      }d@|j/                         vs dA|j/                         vst1        |      dBk  rt3        dC       t        | ||      S |S # t4        $ r%}t3        dD|        t        | ||      cY d)}~S d)}~ww xY w)EzBGera HTML com persona Leo usando OpenAI GPT-4o + skills injetadas.r   r  r&   r   rj      Negóciorl   r   rF   r   rk   lead_telefoner      —r   r   \D55u  Você é Leo, desenvolvedor-designer sênior especialista em landing pages de alta conversão para negócios brasileiros.
Você gera HTML completo, auto-contido, com CSS interno (sem link pra CSS externo exceto Google Fonts).
O HTML deve ser profissional, visualmente impressionante, mobile-first, com favicon SVG inline.
Referências de imagens SEMPRE como "imgs/NOME_ARQUIVO" (caminho relativo, nunca absoluto).
Você NUNCA usa gradiente roxo/azul genérico, NUNCA usa grid idêntico de cards com ícone+título+texto, NUNCA usa glassmorphism decorativo.
Você devolve APENAS o HTML completo, sem explicações, sem markdown, sem cerca de código.r1     r8   uL   SKILL DE DESIGN (landing-funil editorial - use como referência principal):
zI

BASE CSS DO DESIGN SYSTEM (incorpore inline ou use as classes/tokens):
zEestilo editorial premium (bege + coral + navy) da skill landing-funilu@   hero VSL-style, sobre, oferta/serviços, prova social, CTA finalrZ  z.DIRETRIZES DE DESIGN (frontend-design skill):
*

DIRETRIZES UI/UX (ui-ux-pro-max skill):
u;   design distintivo e memorável, específico para o segmentouB   hero, sobre, serviços, por que escolher, depoimentos, contato/CTAui   Crie uma landing page HTML COMPLETA e AUTO-CONTIDA para o seguinte negócio:

DADOS DO NEGÓCIO:
- Nome: r  r  r  r  r  r  r  r  Nr  -

COPY GERADA (use exatamente estes textos):
F   ensure_asciiindent<   

IMAGENS DISPONÍVEIS (use como src relativo "imgs/NOME"):
z

u   

REQUISITOS OBRIGATÓRIOS:
1. HTML completo (DOCTYPE, head, body), auto-contido, com CSS interno em <style>
2. Design ÚNICO e DISTINTIVO para ESTE negócio específico — não template genérico
3. z*
4. Paleta de cores ADEQUADA ao segmento "u  ":
   - Clínica estética/beleza: tons rosé, nude, dourado (nunca verde clínico genérico)
   - Restaurante/gastronomia: tons quentes, terrosos, apetitosos
   - Academia/fitness: tons vibrantes, energia
   - Escritório/advocacia: tons sóbrios, navy, dourado, marrom
   - Escolha a paleta certa, NÃO use "#2E7D32" verde genérico como padrão
5. Google Fonts via <link rel="preconnect"> e <link href="https://fonts.googleapis.com/..."> no <head>
   (fonte escolhida por você combinando com o segmento — NUNCA Arial ou Roboto genérico)
6. Favicon SVG inline no <head>
7. Mobile-first e totalmente responsivo
8. Imagens referenciadas como "imgs/foto_1.jpg" (caminho RELATIVO, nunca absoluto, nunca URL)
9. WhatsApp link com número real: https://wa.me/u   
10. Seções: u   
11. Sem gradiente roxo/azul genérico. Sem grid idêntico de cards. Sem glassmorphism decorativo.

Devolva APENAS o HTML completo. Sem explicação, sem markdown, sem cerca de código.r  r   r!  r#  g?i   )r)  r*  r+  r-  r\  ^```(?:html)?\s*r]  <html</html>  uU   [analisador] Leo (openai) retornou HTML inválido/curto, fallback pro gerador antigo.z)[analisador] erro Leo (openai fallback): )r   gerar_html_siter0  r	  rQ   r   r   r   rC   SKILL_LANDING_FUNILSKILL_LANDING_FUNIL_BASE_CSSSKILL_FRONTEND_DESIGNSKILL_UI_UX_PRO_MAXrS   r   dumpsr1  r2  r3  r4  r5  rA   r   rR   lenr@   r?   )rb  rD   rc  rd  r	  r7  rj   rl   rF   r   rk   r   r   r   telefone_numerosrU  conteudo_landing_funilconteudo_base_cssskills_blocoestilo_hintsecoesconteudo_frontendconteudo_uiuxrV  r:  r_  rB   s                              r   _gerar_html_leo_openair    ss   tUG44q5!/yy'J599V+<J
8$*IIk*0b	99Z(.B99Z(LEIIo,FL"8$-		/27a99Z(.B66%X^<$4$?$?$E#&66k 	 y %01DD%Q" +,H I     	L
 bKWF +,A N'(;4HM    	L
 XKYF&Y &Y 	 &Y 
&Y&Y (	&Y	&Y
 [&Y
&Y Z&Y&Y J&Y&Y &Y &Y *?&Y+&Y jj"4C()&Y*&Y DuQ/ 0&Y1&Y G &Y&Y" #&Y"#&Y, =-&Y,*-&Y. +4/&Y.52/&YD 3C1CE&YDDE&YF hG&YFVG&YP {{&&--!m<K8  . 
 ll1o%%--335 >>% &&,b#6C&&R-C #))+%#))+)ESTXij"488
 59!=>tUG445s$   K9L L 	L?L:4L?:L?c                    t               }|st        | |||      S 	 |j                  d      xs |j                  d      xs d}|j                  d      xs d}|j                  d      xs d}|j                  d      xs d}|j                  d      xs |j                  d	      xs d}	|j                  d
      xs d}
|j                  d      xs d}|j                  d      xs g }t        j                  dd|	xs d      }|r|j                  d      sd|z   }d}|dk(  rt        t        d      }t        t              }d| d| d| d| d|	 d|
 d| ddj                  |      dd  d t        j                  | d!d"#       d$t        j                  |       d%| d&| d'| d(}nt        t        d)      }t        t        d)      }d*| d| d| d| d|	 d|
 d| ddj                  |      dd  d t        j                  | d!d"#       d$t        j                  |       d+| d,| d-| d.}|j                  j                  d/d0|d1|d2g3      }d}|j                   D ]  }t#        |d4      s||j$                  z  }  |j'                         }|j                  d5      r.t        j                  d6d|      }t        j                  d7d|      }d8|j)                         vs d9|j)                         vst+        |      d:k  rt-        d;       t/        | ||      S |S # t0        $ r%}t-        d<|        t/        | ||      cY d}~S d}~ww xY w)=u   Gera HTML completo via persona do Leo (Anthropic Sonnet).
    Se não houver chave Anthropic, usa OpenAI com a mesma persona + skills.
    Fallback final: gerar_html_site.r   rj   rf  rl   r   rF   r   rk   rg  r   rh  r   r   r   ri  rj  u  Você é Leo, desenvolvedor-designer sênior especialista em landing pages e sites de alta conversão para pequenos negócios brasileiros.
Você gera HTML completo, auto-contido, com CSS inline (sem dependências externas), altamente otimizado visualmente.
O HTML deve ser profissional, belo, mobile-first, com favicon SVG inline e referências de imagens sempre como "imgs/NOME_ARQUIVO" (caminho relativo).
Você devolve APENAS o HTML completo, sem explicações, sem markdown, sem cerca de código.r1   i  rl  ux   Crie uma landing page HTML COMPLETA no estilo editorial premium (bege + coral + navy) para:

DADOS DO NEGÓCIO:
- Nome: r  r  r  r  r  r  r  r  Nr  rn  Fro  rp  rs  z-

SKILL DE DESIGN (landing-funil editorial):
zB

BASE CSS DO DESIGN SYSTEM (incorpore inline ou use as classes):
z

REQUISITOS:
1. HTML completo, auto-contido, CSS inline
2. Estilo editorial bege/coral/navy conforme a skill landing-funil
3. Favicon SVG inline
4. Mobile-first
5. Imagens em "imgs/foto_1.jpg" (caminho relativo)
6. Link WhatsApp real: wa.me/uO   
7. Seções: hero VSL-style, sobre, oferta/serviços, prova social, CTA final
rk  uo   Crie uma landing page HTML COMPLETA e AUTO-CONTIDA para o seguinte negócio local:

DADOS DO NEGÓCIO:
- Nome: z0

DIRETRIZES DE DESIGN (frontend-design skill):
rm  u/  

REQUISITOS OBRIGATÓRIOS:
1. HTML completo com DOCTYPE, head, body
2. Todo CSS inline (sem link para CSS externo)
3. Favicon SVG inline no head
4. Mobile-first e responsivo
5. Imagens referenciadas como "imgs/foto_1.jpg" (caminho relativo, nunca absoluto)
6. Link do WhatsApp com telefone real (wa.me/u
  )
7. Design DISTINTIVO e MEMORÁVEL — não genérico
8. Seções: hero, sobre, serviços, por que escolher, depoimentos, contato/CTA
9. Sem dependências externas (sem Google Fonts via @import que precise de internet — use fontes do sistema ou font-face inline)
zclaude-sonnet-4-6i@  r#  r!  r[  r   r\  rt  r]  ru  rv  rw  uX   [analisador] Leo (anthropic) retornou HTML inválido/curto, fallback pro gerador antigo.z#[analisador] erro Leo (anthropic): )r-   r  rQ   r   r   r   rC   ry  rz  rS   r   r}  r{  r|  r*  r3  rA   r^  r   r   rR   r~  r@   rx  r?   )rb  rD   rc  rd  r7  rj   rl   rF   r   rk   r   r   r   r  rU  r  r  rV  conteudo_frontend_designr  r:  r_  r`  rB   s                           r   gerar_html_leor    s    #$F%dE7HEE~5yy'J599V+<J
8$*IIk*0b	99Z(.B99Z(LEIIo,FL"8$-		/27a99Z(.B66%X^<$4$?$?$E#&66k 	 y %01DD%Q" +,H I	 
 ( [ Z J M? +jj"4C() * DuQ/ 0 1 G         // 0;KB (33HPT'U$'(;4HM	 
 ( [ Z J M? +jj"4C() * DuQ/ 0 1 G       . /?-? @;!KF %%% %+>?	 & 
 \\ 	"Euf%uzz!	" iik >>% &&,b#6C&&R-C #))+%#))+)ESTXlm"488
 53A378tUG445s+   IL 2B)L L 	M'MMMdados_placerF   dest_dirc                    |j                  dd       g }t        | j                  d      xs g dd       D ]9  \  }}|d|dz    dz  }t        ||      s|j	                  |j
                         ; dt        |      z
  }|d	kD  rt        |xs d
      }t        |      D ]  }|d|dz    dz  }	 d| dt        t        j                               |z    }	t        j                  |	dd      }
|
j                  dk(  rNt        |
j                        dkD  r6|j                  |
j                         |j	                  |j
                          |S # t        $ r Y w xY w)uC   Baixa até 3 imagens. Retorna lista de nomes de arquivo (relativo).Tparentsr   r   N   foto_r
   z.jpgr   business	unsplash_z&https://source.unsplash.com/1200x800/?z&sig=r   r   r   i  )mkdir	enumeraterQ   r   appendr   r~  r   r   inttimer   r   rA   r   r?   )r  rF   r  imgsirefr   faltamqueryr   r   s              r   baixar_imagensr    sZ   NN4$N/D [__\:@b"1EF #3E!A#d++!#t,KK		"# T]Fz92
3v 		A	!A#d33D>ugU3tyy{K[\]K]J^_LLb$G==C'C		NT,A$$QYY/KK		*		 K  s   0BE	EEc                    | j                  d      xs d}| j                  d      xs d}|j                  d      xs |j                  d      xs d}|j                  d      xs d	}|j                  d
      xs |j                  d      xs d	}|j                  d      xs g }|r|d   nd	}	t        |      dkD  r|d   n|	}
t        |      dkD  r|d   n|	}d	j                  d | j                  d      xs g dd D              }d	j                  d | j                  d      xs g D              }d	j                  d | j                  d      xs g D              }d	j                  d |D              }t        j                  dd	|xs d	      }|r|j                  d      sd|z   }|rd| nd}d	j                  g d| d|j                  dd	       d | d!|dd j                          d"| d#| d$| d%| d&| d'| d(| d)|	 d*| d+| d,| d-| d.| d/| d0| d1| d(| d2| d3| d4| d5| j                  d6d7       d8| j                  d9|       d:| j                  d;d	       d<| d5| j                  d6d7       d=| j                  d>d?       d@|
 dA| dB| j                  dCd	       dD| dE| j                  d6d7       dF| dG| dH| dI|xs dJ dK|xs dJ dL|xs dM dN| d5| j                  d6dO       dPt        j                         j                   dQ| dR      S )Sz Gera HTML completo do site demo.rO  rE  rP  rF  r   rj   rf  r   r   rk   rg  r   r   r
   ro  c              3   n   K   | ]-  }d |j                  dd       d|j                  dd       d / yw)z-<div class="servico-card">
              <h3>r?  r   z</h3>
              <p>r@  </p>
            </div>Nr  )rL   r   s     r   rO   z"gerar_html_site.<locals>.<genexpr>  sK      
 	55"%& '%%B'( )	s   35rJ  Nr  c              3   (   K   | ]
  }d | d  ywz<li>z</li>NrK   )rL   r   s     r   rO   z"gerar_html_site.<locals>.<genexpr>  s      $qc   rK  c           
   3      K   | ]L  }d dt        |j                  dd            z   d|j                  dd       d|j                  dd       d	 N y
w)z8<div class="dep-card">
              <div class="stars">   ★r   r   z</div>
              <p>"rB  r   u.   "</p>
              <div class="dep-nome">— rj   z</div>
            </div>N)r  rQ   )rL   ds     r   rO   z"gerar_html_site.<locals>.<genexpr>  sl       ""'#aeeHa.@*A"A!B C55$% &))*vb)9(: ;	s   AArL  c              3   (   K   | ]
  }d | d  ywr  rK   )rL   hs     r   rO   z"gerar_html_site.<locals>.<genexpr>  s     >d1#UO>r  ri  rj  zhttps://wa.me/r   z<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>u    — rl   z</title>
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><circle cx='50' cy='50' r='50' fill='z\'/><text x='50' y='68' font-size='60' text-anchor='middle' fill='white' font-family='Arial'>a$  </text></svg>" />
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }
  body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; color: #1a1a1a; line-height: 1.6; }
  .container { max-width: 1140px; margin: 0 auto; padding: 0 20px; }
  header { background: white; padding: 16px 0; position: sticky; top: 0; z-index: 10; box-shadow: 0 2px 12px rgba(0,0,0,0.05); }
  header .container { display: flex; align-items: center; justify-content: space-between; }
  .logo { font-weight: 800; font-size: 22px; color: zD; }
  .btn { display: inline-block; padding: 12px 28px; background: z; color: white; text-decoration: none; border-radius: 8px; font-weight: 600; transition: transform 0.2s; }
  .btn:hover { transform: translateY(-2px); background: z5; }
  .btn-outline { background: transparent; color: z; border: 2px solid z2; }
  .hero { background: linear-gradient(135deg, r}   z); color: white; padding: 80px 0; position: relative; overflow: hidden; }
  .hero::before { content: ""; position: absolute; inset: 0; background: url('imgs/a  ') center/cover; opacity: 0.25; }
  .hero .container { position: relative; z-index: 1; text-align: center; }
  .hero h1 { font-size: clamp(32px, 5vw, 56px); font-weight: 800; margin-bottom: 20px; line-height: 1.1; }
  .hero p { font-size: clamp(18px, 2vw, 22px); opacity: 0.95; max-width: 720px; margin: 0 auto 32px; }
  .hero-cta { display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; }
  .hero-cta .btn { background: white; color: z; }
  .hero-cta .btn.btn-outline { background: transparent; color: white; border-color: white; }
  section { padding: 80px 0; }
  section h2 { font-size: clamp(28px, 4vw, 40px); font-weight: 800; margin-bottom: 16px; text-align: center; color: a|  ; }
  section .lead { font-size: 18px; color: #555; text-align: center; max-width: 720px; margin: 0 auto 48px; }
  .sobre-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: center; }
  .sobre-img { border-radius: 16px; overflow: hidden; box-shadow: 0 12px 40px rgba(0,0,0,0.15); }
  .sobre-img img { width: 100%; height: 420px; object-fit: cover; display: block; }
  .servicos-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 28px; }
  .servico-card { background: white; padding: 32px; border-radius: 16px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); border-top: 4px solid zs; transition: transform 0.2s; }
  .servico-card:hover { transform: translateY(-6px); }
  .servico-card h3 { color: an  ; font-size: 22px; margin-bottom: 12px; }
  .servico-card p { color: #555; }
  .porque { background: #f8f9fa; }
  .porque ul { list-style: none; display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px; max-width: 900px; margin: 0 auto; }
  .porque li { background: white; padding: 20px 24px; border-radius: 12px; border-left: 4px solid uQ   ; font-weight: 500; color: #333; }
  .porque li::before { content: "✓"; color: a  ; font-weight: 800; margin-right: 12px; font-size: 18px; }
  .depoimentos-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 28px; }
  .dep-card { background: white; padding: 32px; border-radius: 16px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
  .dep-card .stars { color: #FFA000; font-size: 20px; margin-bottom: 12px; }
  .dep-card p { font-style: italic; color: #444; margin-bottom: 16px; }
  .dep-card .dep-nome { font-weight: 700; color: z5; }
  .contato { background: linear-gradient(135deg, a  ); color: white; }
  .contato h2 { color: white; }
  .contato .lead { color: rgba(255,255,255,0.9); }
  .info-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 32px; max-width: 900px; margin: 0 auto 40px; }
  .info-box { background: rgba(255,255,255,0.1); padding: 24px; border-radius: 12px; backdrop-filter: blur(10px); }
  .info-box h4 { margin-bottom: 12px; font-size: 16px; opacity: 0.9; text-transform: uppercase; letter-spacing: 1px; }
  .info-box ul { list-style: none; }
  .info-box li { padding: 4px 0; font-size: 14px; }
  .contato-cta { text-align: center; }
  .contato-cta .btn { background: white; color: a  ; font-size: 18px; padding: 16px 40px; }
  footer { background: #1a1a1a; color: #aaa; padding: 32px 0; text-align: center; font-size: 14px; }
  @media (max-width: 768px) {
    .sobre-grid { grid-template-columns: 1fr; }
    .sobre-img img { height: 260px; }
    section { padding: 56px 0; }
    .hero { padding: 56px 0; }
  }
</style>
</head>
<body>

<header>
  <div class="container">
    <div class="logo">z</div>
    <a href="z" class="btn">rM  AgendarzR</a>
  </div>
</header>

<section class="hero">
  <div class="container">
    <h1>rG  z</h1>
    <p>rH  z/</p>
    <div class="hero-cta">
      <a href="z6</a>
      <a href="#contato" class="btn btn-outline">rN  rD  z</a>
    </div>
  </div>
</section>

<section>
  <div class="container">
    <div class="sobre-grid">
      <div class="sobre-img">
        <img src="imgs/z" alt="u   " />
      </div>
      <div>
        <h2 style="text-align:left;">Sobre nós</h2>
        <p style="font-size:18px;color:#555;">rI  z</p>
        <a href="z'" class="btn" style="margin-top:24px;">u   </a>
      </div>
    </div>
  </div>
</section>

<section style="background:#f8f9fa;">
  <div class="container">
    <h2>Nossos serviços</h2>
    <p class="lead">O que oferecemos para você</p>
    <div class="servicos-grid">
      u   
    </div>
  </div>
</section>

<section class="porque">
  <div class="container">
    <h2>Por que nos escolher</h2>
    <p class="lead">Razões que fazem a diferença</p>
    <ul>z</ul>
  </div>
</section>

<section>
  <div class="container">
    <h2>O que dizem nossos clientes</h2>
    <p class="lead">Depoimentos reais de quem confiou no nosso trabalho</p>
    <div class="depoimentos-grid">u  </div>
  </div>
</section>

<section class="contato" id="contato">
  <div class="container">
    <h2>Fale com a gente</h2>
    <p class="lead">Estamos prontos para atender você</p>
    <div class="info-grid">
      <div class="info-box">
        <h4>Endereço</h4>
        <p>rh  zT</p>
      </div>
      <div class="info-box">
        <h4>Telefone</h4>
        <p>uV   </p>
      </div>
      <div class="info-box">
        <h4>Horários</h4>
        <ul>   <li>—</li>zK</ul>
      </div>
    </div>
    <div class="contato-cta">
      <a href="rC  uR   </a>
    </div>
  </div>
</section>

<footer>
  <div class="container">
    <p>© rG   u   . Todos os direitos reservados.</p>
    <p style="margin-top:8px;font-size:12px;opacity:0.6;">Página demonstrativa — Climb Digital</p>
  </div>
</footer>

</body>
</html>
)
rQ   r~  rS   r   r   r   upperr   ro   year)rb  rD   rc  cor1cor2rj   r   rk   r   img_heroimg_2img_3servicos_htmlmotivos_htmldep_htmlhorarios_htmlwawa_links                     r   rx  rx    sn   88N#0yD88$%2D99]#Fuyy'8FJDyy$*Hyy$H		/(BHbHyy$*H$wqz"Hg,*GAJEg,*GAJEGG 
 ((:&,"bq1 M 77 "&((+=">"D" L ww  ((=)/R H GG>X>>M	r8>r	*B	"--%BY')rd#sG^ ^  ^
 	v^
 ^
 99Xb)*^
+h^ im  hn^ nJ^ KO  PR  QR  KS  KY  KY  K[  J\^\6^ 7;V^<B^ CG^H:^ ;?^@3^  48&!^  9M!^  NRF!^ S0!^" 15v#^" 68#^" 9=v#^">U#^$ V^T^%^$_/%^. 04f/^.5v/^4 w{u{5^4|J5^@ KO  JPA^@PA^D #VE^D$dE^L eiciM^Lj0M^N 15vO^N63O^X 48&Y^X93Y^Z 48&[^Z 9;[^Z <@&[^Z	A2[^l 37m^l8m^H fI^HI^J YK^J %K^J &*XXoy%I$JK^JK	K^V 
*d	#$W^V%W^X 	#$Y^X%Y^\ y]^\ ']^\ (,xx'K&L]^\M2]^^ 37((;K^2\1]_^^	^_^p wq^p &q^p '+Vq^p,/q^x 04xx/C.Dy^xEy^z {^z B{^z CG((?[dBeAf{^zg{^P oQ^P		Q^b 
c^b#c^r $,*s^r-s^H I^HI^P Q^PQ^X ,n-Y^X.Y^` ya^` 'a^` (,xx'Q&Ra^`Sa^n <<>
o^n  !o^n "&o^n'o^ ^r   site_dirportaslugc           	      R   d| d|  d}t        d|       }d| d|  d| d| d		}t        d
|       }|j                  |       t        j                  ddt	        |      t	        |      gd       t        j                  g dd       t        j                  dddd|gd       y)z8Cria um systemd unit rodando http.server no dir do site.analise-r   z.servicez/etc/systemd/system/z"[Unit]
Description=Analise Lead - z #zG
After=network.target

[Service]
Type=simple
User=mia
WorkingDirectory=z+
ExecStart=/usr/bin/python3 -m http.server zR --bind 0.0.0.0
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
z/tmp/sudomvTcheck)r  	systemctlzdaemon-reloadr  enablez--nowN)r   
write_text
subprocessrunr[   )ru   r  r  r  	unit_name	unit_pathrA   tmps           r   montar_servidor_siter  s  s    4&*X6I+I;78I 6J< 0  ++0' 2G yk"
#CNN7NNFD#c(C	N;4HNN9FNNFK7IFdSr   c                 0   ddl }|  dt         }d|  }t        t              5 }|j	                  |      }ddd       d   d   }|d   d   }||v rdd	| ig||   d
   d<   n6dgdgd| d|d|| d<   dgd| d|ddid|| d<   d
ddd	| igii||<   t        dt        t        j                                d      }	t        |	d      5 }|j                  ||dd       ddd       t        j                  ddt        t              t         dt        t        j                                gd       t        j                  ddt        |	      t        t              gd       |	j                  d        |S # 1 sw Y   KxY w# 1 sw Y   xY w)!z(Adiciona rota Traefik. Retorna hostname.r   N.r  httproutersservicesr   zhttp://172.18.0.1:loadBalancerserverszredirect-to-httpszHost(`z`))entryPointsmiddlewaresruleservicez-httphttpscertResolverletsencrypt)r  r  r  tlsz-httpsz/tmp/traefik-z.yamlwFT)	sort_keysallow_unicoder  cpz.bak.r  )
missing_ok)yamlDOMINIO_BASEopenTRAEFIK_CONFIG	safe_loadr   r  r  	safe_dumpr  r  r[   unlink)
r  r  r  hostservice_namefcfgr  r  r  s
             r   registrar_traefikr    s   V1\N#DdV$L	n	  nnQ  &k)$G6{:&H x>CGYZ_Y`Ea=b<c~.y9 #8/0TF"%#	+
<.&' $9TF"%#"M2	,
<.'( Y%3EeW1M)N(OP"

 s499;/06
7C	c3 D1sAdCDNNFD#n"5.9IsSWS\S\S^O_N`7abjopNNFD#c(C,?@MJJ$JKC   8D Ds   E?F?F	Fc                 F   t         rt        sy| }| dt         }	 t        j                  dt         dddt          id|id	      }|j                         }|j	                  d
      ry	 d|dddd}	 	 ddl}|j                  dt               }||d<   t        j                  dt         ddt          dd|d      }|j                         j	                  dd      S # t        $ r Y w xY w# t        $ r Y ew xY w# t        $ r}t        d|        Y d}~yd}~ww xY w)zACria registro CNAME para slug.agentesclimb.us apontando pro root.Fr  z+https://api.cloudflare.com/client/v4/zones/z/dns_recordsAuthorizationzBearer r   r   )r   r   r   r   TAz168.231.106.207r
   )r%  r   rA   ttlproxiedr   Nzprospeccao.rA   zapplication/json)r  zContent-Type   )r   r   r   successz[analisador] erro CF: )r"   r#   r  r   rQ   r   r?   r   gethostbynamepostr@   )	r  	subdomainfqdnr   r   payloadskip_raizrB   s	            r   registrar_cloudflarer    sa   '9I[,(DLL9:L9M\Z$0D/E&FGD>	
 vvx88H  $G	&&\N'CDG!(GI MM9:L9M\Z#*+?*@!A 2 
 vvx||Iu--9     		  &qc*+sI   AC! 5!C0 A
C? !	C-,C-0	C<9C? ;C<<C? ?	D DD 
timeout_msc                 t   	 ddl m}  |       5 }|j                  j                  d      }|j	                  ddd      }|j                  | |d	
       |j                  t        |      d       |j                          d d d        y# 1 sw Y   yxY w# t        $ r}t        d|        Y d }~yd }~ww xY w)Nr   sync_playwrightTheadlessi   i  )widthheight)viewportnetworkidler   
wait_untilF)r7   	full_pagez [analisador] screenshot falhou: )playwright.sync_apir  chromiumlaunchnew_pagegoto
screenshotr[   re   r?   r@   )r   r   r  r  rM   browserpagerB   s           r   tirar_screenshotr    s    7 	!jj'''6G##ts-K#LDIIc:-IHOOTeO<MMO	 	  045s5   B A2B
B 
BB B 	B7B22B7rx   screenshot_pathdest_pdfc                 @   	 ddl m} |j	                  d      xs |j	                  d      xs d}|j	                  d      xs g }	d	j                  d
 |	d d D              xs d}
d	j                  d |j	                  d      xs g D              }d	}|rG|j                         r7t        j                  |j                               j                         }d| d}|j	                  d      xs d}d	j                  g d| d| d| d| d| d| d| d|j	                  dd	       d|j	                  dd	       dt        j                         j                  d       d|j	                  d       xs d! d"|j	                  d#      xs |j	                  d$      xs d! d%|j	                  d&      xs d! d'|j	                  d(      xs d d)|j	                  d*      xs |j	                  d+      xs d! d,|xs d- d.|
 d/| d0| d1| d2|  d3      }	  ||4      j                  t        |             y5# t        $ r}t        d|        Y d }~yd }~ww xY w# t        $ r}t        d6|        Y d }~yd }~ww xY w)7Nr   )HTMLu'   [analisador] weasyprint indisponível: Fr   rj   rf  r   r   c              3      K   | ]R  }d |j                  dd       ddt        |j                  dd            z   d|j                  d      xs d	d
d  d T y
w)zR<div class="review">
              <div class="rev-head">
                <strong>author_namerh  z.</strong>
                <span class="stars">r  r   r   z.</span>
              </div>
              <p>r   r   Nr  r  )rQ   r  r  s     r   rO   z#gerar_pdf_dossie.<locals>.<genexpr>  su      	 }U34 5%%*Sx1C-D%D$E F55=&B-. /		s   AAr   u+   <p><em>Sem avaliações públicas.</em></p>c              3   (   K   | ]
  }d | d  ywr  rK   )rL   os     r   rO   z#gerar_pdf_dossie.<locals>.<genexpr>  s      !$qc!r  rQ  z <img src="data:image/png;base64,z" class="screenshot" />rO  rE  uL  <!DOCTYPE html>
<html><head><meta charset="UTF-8" />
<style>
  @page { size: A4; margin: 20mm 15mm; @bottom-center { content: "Dossiê Climb Digital — página " counter(page); font-size: 9pt; color: #999; } }
  body { font-family: -apple-system, Arial, sans-serif; color: #222; line-height: 1.55; font-size: 11pt; }
  h1 { color: z4; font-size: 26pt; margin: 0 0 6pt; }
  h2 { color: z@; font-size: 15pt; margin: 22pt 0 8pt; border-bottom: 2px solid a  ; padding-bottom: 4pt; }
  .subtitle { color: #666; font-size: 12pt; margin-bottom: 20pt; }
  .grid { display: flex; gap: 12pt; margin: 12pt 0; }
  .box { flex: 1; background: #f7f7f7; padding: 12pt; border-radius: 6pt; }
  .box strong { display: block; color: z; font-size: 9pt; text-transform: uppercase; letter-spacing: 0.5pt; margin-bottom: 4pt; }
  ul { margin: 8pt 0 8pt 18pt; }
  li { margin: 4pt 0; }
  .review { background: #fafafa; padding: 10pt; border-left: 3pt solid a  ; margin: 8pt 0; border-radius: 4pt; }
  .rev-head { display: flex; justify-content: space-between; margin-bottom: 4pt; }
  .stars { color: #FFA000; }
  .screenshot { width: 100%; border: 1pt solid #ddd; border-radius: 6pt; margin: 10pt 0; }
  .cta { background: u#  ; color: white; padding: 14pt; border-radius: 8pt; margin-top: 16pt; text-align: center; }
  .cta a { color: white; font-weight: bold; text-decoration: none; }
  .meta { color: #888; font-size: 9pt; margin-top: 24pt; text-align: center; }
</style></head>
<body>

<h1>Dossiê de Análise — z</h1>
<div class="subtitle">rl   u    • rF   z%d/%m/%Yun   </div>

<h2>Perfil do negócio</h2>
<div class="grid">
  <div class="box">
    <strong>Endereço</strong>
    r   rh  z@
  </div>
  <div class="box">
    <strong>Telefone</strong>
    rk   rg  ud   
  </div>
</div>
<div class="grid">
  <div class="box">
    <strong>Avaliação Google</strong>
    r   z / 5 (r   uP    avaliações)
  </div>
  <div class="box">
    <strong>Site atual</strong>
    lead_site_atualr   z;
  </div>
</div>

<h2>Oportunidades identificadas</h2>
<ul>r  u,   </ul>

<h2>Avaliações reais (Google)</h2>
u   

<h2>Site demonstrativo</h2>
<p>Preparamos uma página demonstrativa mostrando como o negócio pode se apresentar online:</p>
z
<div class="cta">
  <a href="u   ">Ver site online → uF   </a>
</div>

<div class="meta">Gerado por Climb Digital • Análise #z</div>
</body></html>
)stringTz[analisador] erro pdf: )
weasyprintr  r?   r@   rQ   rS   r   base64	b64encode
read_bytesr   r   ro   strftime	write_pdfr[   )ru   rD   rb  rx   r  r  r  rB   rj   r   reviews_htmloportunidades_htmlscreenshot_htmlb64r  r   s                   r   gerar_pdf_dossier$    s   #
 99]#Fuyy'8FJDii	"(bG77 	 !	 	 	7 
7   !"&((+B"C"Ir!  O?11399;<CCE<SEAXY88N#0yD? ?  ?
 v?
? v? V? W[U[?\)? *.?/I? JN?O?" f#?"#?. "F/?.#/?0 yy"-.1?0 /41?0 5:IIk"4M3N1?0 OT1?0 U]T`T`TbTkTklvTwSx1?0y1?< YYz#e$=?<%=?D YYzAeii8AEBE?DCE?P YYx!E"Q?P #)Q?P */?)C)Hq(IQ?PJQ?X YY !FUYY}%=FGY?XHY?b )>*c?b+c?h i?hi?p  q?pq?t :u?t ,u?t -5:u?t6:u?z ;E{?zF{?DBD##CM2  7s;<@  's+,s/   I 6!I< 	I9!I44I9<	JJJzB/opt/mia/workspace/prospeccao_ativa/templates/dossie_template.htmlc                     	 t        |       } | dk\  r:| dz  }|dj                  dd      j	                  d      j	                  d      dz   S t        |       S # t        $ r | rt        |       cY S dcY S w xY w)u-   Formata número: 1234 -> '1,2k' quando > 999.0rw  .1fr  ,r   )r  r?   r[   replacerstrip)nr   s     r   _fmt_numr,  k  s    $F 	DyHC!!#s+2237>>sCcIIq6M  $s1v##$s   A A4/A43A4url_or_handlec                    | syt        |       j                         }d|v r|j                  d      d   }|j                  d      d   j                  d      d   j                         }|sy|j                  d      r|S d| S )z;Extrai handle @xxx de qualquer coisa (URL, @handle, texto).rh  zinstagram.com//r   r  @)r[   r   r   r   )r-  r   s     r   
_handle_igr2  w  s    M  "A1GG$%b)	Qc"1%++-AS!1.1#w.r   instagram_datac           
      v   t         j                         st        dt                 y|xs i }t        t	        |       z  }|j                  dd       |j                  d      xs |j                  d      xs d}|j                  d      xs d	}|j                  d
      xs d	}|j                  d      xs |j                  d      xs d}	|j                  d      xs |j                  d      xs d}
|j                  d      }|j                  d      xs |j                  d      xs d	}|j                  d      xs g }|j                  d      xs d	}|rt        |      nd}|j                  d      xs |j                  d      xs |xs d}t        |j                  d      xs d      }t        |j                  d      xs d      }t        |j                  d      xs d      }g d}t        j                         }|r$| d||j                  dz
      d|j                   n ||j                  dz
      d|j                   }d	}|d z  }|j                         r#d!D ]  }||z  }|j                         sd"| } n |s&d#t        j                  d$      j                         z   }d	}|d%z  }|j                         rd"| }|j!                  d&d	      j!                  d'd	      j#                  d(      }|rd)nd}d}|rd*nd} |rt%        t	        |            d+kD  rd,nd}!|rd,nd}"d-}#d}$d}%||z   | z   |!z   |"z   |#z   |$z   |%z   }&d.}'|&d/k  rd0}'nt'        d.|&d1z         }'d2 }(|rg })|dd3 D ]  }*|*j                  d4      xs d5j)                         }+d6t+        |*j                  dd,            z  },|*j                  d7      xs d	j)                         j!                  d8d      }-t%        |-      d9kD  r|-dd: d;z   }-|)j-                  d<|+ d=|, d>|- d?        d	j/                  |)      }.nd@}.g }/g }0|rt1        |      dAk\  r|/j-                  dB       |	r|	dk7  r|/j-                  dC       |r|/j-                  dD       |r(t%        t	        |            dEkD  r|/j-                  dF       |
r|
dk7  r|/j-                  dG       |s|0j-                  dH       n|0j-                  dI       |0j-                  dJ       |s|0j-                  dK       n|0j-                  dL       |0j-                  dM       |/ddN xs dOg}/|0ddN }0d	j/                  dP |/D              j#                         }1d	j/                  dQ |0D              j#                         }2|rdR|j3                         xs dS dT}3ndU}3dV|j3                         xs dW d| dX}4|xs dYj5                         }5i dZ|d[|5d\|d]|	d^|
d_|d`|da|db|dc|rt1        |      ddnddet	        |&      dft	        |'      dg|dh|di|djt	        |      dk|3i dl|.dm|1dn|2do|4dpt	        |      dqt	         |(|d)            drt	        |      dst	         |(|d+            dtt	        |       dut	         |(| dv            dwt	        |!      dxt	         |(|!d)            dyt	        |"      dzt	         |(|"dv            d{t	        |#      d|t	         |(|#d)            d}t	        |$      t	         |(|$d)            t	        |%      t	         |(|%d)            d~}6	 t         j7                  d      }7|6j9                         D ]   \  }8}9|7j!                  |8t	        |9            }7" |dz  }:|:j;                  |7d       |:S # t<        $ r};t        d|;        Y d};~;yd};~;ww xY w)u   
    Gera o HTML do dossiê v2 (template oxblood/dourado/ivory) preenchido
    com dados do lead. Retorna o path do HTML salvo, ou None se falhar.
    u'   [analisador] template não encontrado: NTr  r   rj   rf  rl   r   rF   r   lead_enderecorh  rk   rg  r   r  r   r   rm   bior@  u   Presença digital do negócio
seguidoresr   postsseguindo)Janeiro	Fevereirou   MarçoAbrilMaioJunhoJulhoAgostoSetembroOutubroNovembroDezembrou    · r
   rG   r  )z
foto_1.jpgz
foto_1.pngz
foto_0.jpgz
foto_0.pngfile://zdata:image/svg+xml;base64,ss   <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect fill="#8a6535" width="100" height="100"/></svg>screenshot.pngr   r   r0  r      r  r   ro  d   r   \   7   c                 V    	 t        t        | |z  dz              S # t        $ r Y yw xY w)NrH  r   )r  roundr?   )r   tots     r   pctzgerar_dossie_html.<locals>.pct  s1    	ua#g_-.. 		s    	((r  r  Clientez&#9733;r   r
        z...zi
        <div class="review">
          <div class="review-head">
            <div class="review-author">z-</div>
            <div class="review-stars">z<</div>
          </div>
          <div class="review-text">"z"</div>
        </div>uo   <div class="review"><div class="review-text">Sem avaliações públicas registradas até o momento.</div></div>g      @u(   Avaliação Google acima de 4.5 estrelasu   Endereço visível no perfilu   Presença ativa no Instagramr   z'Bio descreve especialidades com clarezau   Telefone de contato disponívelu   Sem site profissional própriou+   Site atual não capta leads com eficiênciau*   Sem chamada para ação (CTA) clara na biou    Sem presença ativa no Instagramu+   Link da bio não direciona para agendamentozSem uso estruturado de hashtags   u   Negócio consolidado localmentec              3   (   K   | ]
  }d | d  ywz            <li>z</li>
NrK   rL   rM   s     r   rO   z$gerar_dossie_html.<locals>.<genexpr>        O1#3A3g!> Or  c              3   (   K   | ]
  }d | d  ywrT  rK   rU  s     r   rO   z$gerar_dossie_html.<locals>.<genexpr>  rV  r  uS   Frequência de postagem irregular, com uso baixo de Reels. O benchmark do setor de u	   serviçosu    para tráfego orgânico está em 30 a 50% de Reels. A bio traz informações relevantes, mas o link atual não direciona para uma página que capture contato ou faça agendamento.u   Perfil de Instagram ainda não identificado publicamente. Presença digital concentrada em ferramentas passivas (Google Meu Negócio), sem canal ativo de captação e relacionamento com potenciais clientes.aF      <div class="strategy-block">
      <div class="strategy-head">
        <div class="strategy-title">Presenca <em>Digital</em></div>
        <div class="strategy-week">Semana 1-2</div>
      </div>
      <ul class="strategy-items">
        <li><strong>Site profissional com agendamento online.</strong> Clientes que buscam "u   seu serviçou  " no Google hoje encontram concorrentes primeiro.</li>
        <li><strong>Link ativo na bio</strong> direcionando para agendamento ou WhatsApp com resposta rápida.</li>
      </ul>
    </div>

    <div class="strategy-block">
      <div class="strategy-head">
        <div class="strategy-title"><em>Conteudo</em></div>
        <div class="strategy-week">Semana 1-4</div>
      </div>
      <ul class="strategy-items">
        <li><strong>3 posts por semana:</strong> 1 educativo, 1 resultado (antes e depois), 1 depoimento de cliente.</li>
        <li><strong>Reels curtos (15-30s)</strong> têm 4x mais alcance orgânico que fotos estáticas.</li>
        <li><strong>Stories diários</strong> mantêm o perfil ativo no algoritmo.</li>
      </ul>
    </div>

    <div class="strategy-block">
      <div class="strategy-head">
        <div class="strategy-title"><em>Atendimento</em></div>
        <div class="strategy-week">Semana 2-3</div>
      </div>
      <ul class="strategy-items">
        <li><strong>Respostas automáticas inteligentes no WhatsApp.</strong> Clientes esperam retorno em menos de 1 hora, reduzindo perda de leads fora do horário.</li>
        <li><strong>Acompanhamento pós-atendimento</strong> aumenta a taxa de retorno em até 60%.</li>
      </ul>
    </div>

    <div class="strategy-block">
      <div class="strategy-head">
        <div class="strategy-title"><em>Fidelizacao</em></div>
        <div class="strategy-week">Semana 3-4</div>
      </div>
      <ul class="strategy-items">
        <li><strong>Histórico de clientes centralizado</strong> permite lembrar aniversários, retornos e indicações.</li>
        <li><strong>Programa de indicação</strong> ("traga uma amiga") digitalizado multiplica o boca-a-boca.</li>
      </ul>
    </div>zPresenca Digitalz{{NOME}}z{{SUBTITULO}}z{{INSTAGRAM_HANDLE}}z{{ENDERECO}}z{{TELEFONE}}z{{CIDADE_DATA}}z{{IG_SEGUIDORES}}z{{IG_POSTS}}z{{IG_SEGUINDO}}z{{GOOGLE_RATING}}r'  z	{{SCORE}}z{{SCORE_POTENCIAL}}z{{FOTO_PERFIL}}z{{SCREENSHOT_SITE}}z{{SITE_URL}}z
{{IG_BIO}}z{{DIAGNOSTICO_INSTAGRAM}}z{{REVIEWS_HTML}}z{{PONTOS_FORTES_HTML}}z{{PONTOS_FRACOS_HTML}}z{{ESTRATEGIA_HTML}}z{{SCORE_GOOGLE}}z{{SCORE_GOOGLE_PCT}}z{{SCORE_SITE}}z{{SCORE_SITE_PCT}}z{{SCORE_INSTAGRAM}}z{{SCORE_INSTAGRAM_PCT}}r   z{{SCORE_BIO}}z{{SCORE_BIO_PCT}}z{{SCORE_LINK}}z{{SCORE_LINK_PCT}}z{{SCORE_AGENDAMENTO}}z{{SCORE_AGENDAMENTO_PCT}}z{{SCORE_ATENDIMENTO}})z{{SCORE_ATENDIMENTO_PCT}}z{{SCORE_CRM}}z{{SCORE_CRM_PCT}}r;   r<   zdossie.htmlz%[analisador] erro gerar_dossie_html: )TEMPLATE_DOSSIE_PATHr   r@   BASE_ANALISESr[   r  rQ   r2  r,  r   ro   monthr  r  r  r   r)  r*  r~  minr   r  r  rS   floatrR   r   r   r   r  r?   )<ru   rD   rb  rx   r3  analise_dirrj   rl   rF   r   rk   r   rn   reviews_rawinstagram_urlr  r6  ig_seguidoresig_postsig_seguindomesesagoracidade_datafoto_perfilimgs_dircandfpscreenshot_sitess_pathsite_url_cleanscore_google
score_sitescore_instagram	score_bio
score_linkscore_agendamentoscore_atendimento	score_crmscore_totalscore_potencialrN  reviews_partsr   authorstarsr   r   fortesfracospontos_fortes_htmlpontos_fracos_htmldiagnosticoestrategia_html	subtituloreplacementsr   r   r   r   rB   s<                                                               r   gerar_dossie_htmlr    s/	     &&(78L7MNO#)rN#j/1KdT2 99]#Fuyy'8FJDYYx &BF		+&,"Iyy$K		/(BKeHyy$K		/(BKeHYYx F,-O=1IORJ))I&,"KIIk*0bM*7Z&UF


U
#
muyy'=
m
mNmC^//=BCM**738q9H>--j9>Q?KOELLNEJPVHDu{{Q!7 8%**FY^_d_j_jmn_nYoXppqrwr|r|q}V~K KV#HL 	DDByy{ 'tn		
 2V5E5E C6

&( O,,G~~#G9-%%j"5==iLSSTWXN  2QLJ(aaOc#c(mb0qI aJI*,>J "346GHJSTK <ORc;#34 Ra 	AeeM*7i>>@FAEE(A$6 77EEE&M'R..088sCD4y3DSzE)   &( )/x 0'',g .%%)F +" 	 ww}- I FF%-3&@AH%4545
s3s8}r!?@H%7867CD
MM>?89CD
MM34 BQZ>=>FBQZF O OOVVX O OOVVX ''0'8'GK&H IXX 	F 	] ^g]l]l]n  ^A  sA  ]B  BC  DJ  CK %K+O\ 00779I'D'' 	' 		'
 	' 	;' 	]' 	' 	;' 	vfc25' 	S%' 	s?3' 	;' 	' 	'  	c#h!'" 	$[#'$ 	L%'& 	!"4''( 	!"4)'* 	+'. 	C-/'0 	Cb$9 :1'2 	#j/3'4 	c#j""565'6 	s?37'8 	"3s?B'?#@9': 	Y;'< 	SY!34='> 	#j/?'@ 	c#j""56A'B 	 %6!7C'D 	$S->)C%DE'F 	 %6!7G'H &)->)C%DY Y!34M'LR
#--w-? &&( 	+DAq<<3q6*D	+ ]*w/ 5aS9:s   4A"^ 	^8 ^33^8	html_pathry   c                    	 ddl m}  |       5 }|j                  j                  d      }|j	                         }|j                  d|  dd       |j                  d	       |j                  t        |      d
dddddd       |j                          ddd       y# 1 sw Y   yxY w# t        $ r}t        d|        Y d}~yd}~ww xY w)z5Gera PDF a partir de HTML usando Playwright/Chromium.r   r  Tr  rE  i0u  r  r  rZ  A4r&  )topbottomleftright)r7   formatprint_backgroundmarginNz"[analisador] erro playwright pdf: F)r  r  r  r	  r
  r  wait_for_timeoutpdfr[   re   r?   r@   )r  ry   r  rM   r  r  rB   s          r   gerar_pdf_playwrightr    s    7 	!jj'''6G##%DII	{+U}IU!!$'HH]!%"c3M	   MMO	 	  21#67s5   B, BB B,  B)%B, )B, ,	C5CCc           
         	 t        | d       t        |j                  dd      |j                  dd            }t        |j                  d      xs |j                  d      xs d      }|j                  d      xs, t	        |j                  dd      |j                  dd            }i |||d|i}t        |      }t        t        |       z  }|d	z  }|d
z  }	|	d	z  }
|	j                  dd       t        ||j                  dd      |      }|
j                  dd       |D ]  }	 t        j                  ||z  |
|z         ! t        |      }t        ||||      }|	dz  j                  |d       t!        |j                  dd            }| d|  }t#               }	 t%        | |	||       d}	 t)        ||      }	 t+        |       |rd| nd| }|dz  }d| }t-        j.                  d       t1        ||       |dz  }d}t2        j5                         rt7        | |||i       }|rt9        ||      }|s-t'        d       t;        | ||||j5                         r|nd|       ||j=                         D ci c]  \  }}|dvr|| c}}|j                  d g       ||||d!}t        | d"||j5                         rt        |      ndt?        j@                  |d#      tC        jD                         jG                         $       y# t        $ r Y w xY w# t        $ r}t'        d|        Y d}~d}~ww xY w# t        $ r}t'        d|        Y d}~d}~ww xY w# t        $ r}t'        d|        Y d}~d}~ww xY wc c}}w # t        $ rm}d%dl$}|jK                         }t'        d&|  d'| d(|        t        | d)t        |      dd* tC        jD                         jG                         +       Y d}~yd}~ww xY w),u'   Roda a análise completa em background.em_andamento)rw   rj   r   rl   rn   r   rm   r  siteTr  rF   z
index.htmlr;   r<   r   r   z$[analisador] erro subindo servidor: Nz[analisador] erro traefik: z[analisador] erro cloudflare: r   zhttp://127.0.0.1:rF  ro  z
dossie.pdfF)r3  z7[analisador] fallback pra gerar_pdf_dossie (WeasyPrint))r   r   )rb  rD   r   rc  rx   r  r  	concluido)rq  )rw   rx   ry   rz   r|   r   z[analisador] ERRO id=r>   r
  r{   i  )rw   r{   r|   )&r   r   rQ   r   r  ra  rY  r[   r  r  shutilrb  r?   rW   r  r  r   r   r  r@   r  r  r  sleepr  rX  r   r  r  r$  r   r   r}  r   ro   rp   	traceback
format_exc)ru   rg   place	site_infoinsta
dados_fullrb  r]  rg  r  	site_imgsrc  r  rd  r   	slug_baser  r  rB   r  rx   r  	local_urlry   pdf_okr  r   r   r  r  tbs                                  r   run_analise_leadr    sI   r@z.9 &immFB&?xY[A\]&y}}\'B'deiiP]F^'dbde	k*v.>y}}VUW?XZcZgZghprtZu.v


 
 	

 #:. $c*o5''v%	td3 	k2(FQt4 	AHqL)a-8	 %Z0dJB	L	 ,,TG,DIMM&&9:	Aj\*	> XudC 	5$T51D
	8 & )-XdV$4EeW2M &(88'w/	

1O4- &&()JhrI -iB KMZT80?0F0F0H_d%' !+!1!1!3AL( 1 "~~i4 
 	&.oo&7S]TG%@!113	
M    	>8<==	>  	5/s344	5
  	821#677	8B&  @!!#%j\A3b=>z&s1vds|$,LLN$<$<$>	@ 	@	@s   D)N ,LAN &L  4N 7M M* B3N NA<N 	LN LN  	M)L=7N =MN 	M'M"N "M''N *	N3NN N	N 	PA#PPrJ   )i#  i%  )i  )i N  )P__doc__r   r   ior   r  r  r  r   rY   r   r  pathlibr   r   urllib.parser   r   r)   rY  r  r\   r  r  r   r   rQ   r   r   r    r+   r"   r#   r$   r-   r{  r|  ry  rz  rU   r  r[   rC   r   rW   ra   rf   rt   r   r   r   r   r   r   r   r   boolr   r   r   r  r;  r/  rW  ra  r  r  r  rx  r  r  r  r  r$  rX  r,  r2  r  r  r  rK   r   r   <module>r     s,  	 
 	 	           #   23   T  "
=
>AB   JJNN#67d;d  0"5JJNN#6; 

'@"E zz~~&<bA ZZ^^$8"= jjnn%:B?  PQ LM LM #$_`  	d 	3: 	 	T c 4T C C 0s &C &D4K &#S #T #%# %# %3# 3S # #* ,C D &C t s VZ   S T 4+C +D +*3   *N%T N%d N%b$ 4 FT%t T% T%p]%t ]% ]%Bv5 v5d v5T#Y v5RU v5Z] v5tF5 F5d F5T#Y F5# F5RU F5T   c <D$ Dt Dd3i DC DPTS TD T TC TTX T6'C ' ' 'T2s 2t 2l# T s t  f fT f f f&*Tkf=AfFJfT `a 	3 	
/c 
/c 
/ DH# d $  #59D[LPSWKDD D T .t@ t@ t@$ t@r   