
    8hj,                        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mZmZ ddlm	Z	 ddl
Z
dZdZdZdZd	Zd
ZdZdZdZ e	d      Zedz  Zedz  Zedz  ZdZdefdZdedefdZdefdZdefdZdefdZdededed e fd!Z!defd"Z"defd#Z#dedefd$Z$ded%ede%de fd&Z&ded'edefd(Z'd) Z(e)d*k(  r		  e(        yy# e*$ r1Z+d+e+ Z, ee,        ee,        ejZ                  d,       Y dZ+[+ydZ+[+ww xY w)-u   
Hotmart -> Meta Custom Audience
Busca compradores do produto Passo a Passo da Radiestesia na Prática (Hotmart)
e sobe como Custom Audience no Meta Ads, gerando também Lookalike BR 1%.
    N)datetimetimezone)Pathz$089991ef-4eee-40f3-b72f-3d8d0299b763z$946a2012-5ac0-405e-92d9-97a61466da35zjBasic MDg5OTkxZWYtNGVlZS00MGYzLWI3MmYtM2Q4ZDAyOTliNzYzOjk0NmEyMDEyLTVhYzAtNDA1ZS05MmQ5LTk3YTYxNDY2ZGEzNQ==z4https://api-sec-vlc.hotmart.com/security/oauth/tokenz<https://developers.hotmart.com/payments/api/v1/sales/history1437935z%/opt/mia/config/meta_token_renato.txt517468148842987zv21.0z$/opt/mia/workspace/clientes/borrellozaudience_compradores.txtzaudience_lal_compradores.txtzcompradores_radiestesia.jsonz/opt/mia-bot/outboxmsgc                 p    t        j                         j                  d      }t        d| d|  d       y )Nz%H:%M:%S[z] T)flush)r   nowstrftimeprint)r   tss     @/opt/mia/workspace/clientes/borrello/hotmart_to_meta_audience.pylogr   -   s.    		 	 	,B	AbTC5/&    valorreturnc                     | syt        j                  | j                         j                         j	                  d            j                         S )N utf-8)hashlibsha256striplowerencode	hexdigest)r   s    r   	hash_metar   2   s:    >>%++---/66w?@JJLLr   nome_completoc                     | xs dj                         j                         }|r|d   nd}t        |      dkD  rdj                  |dd        nd}||fS )Nr   r       )r   splitlenjoin)r   partesfirstlasts       r   
split_namer)   8   sU    !r((*002FF1IRE#&v;?388F12JD$;r   textc                 R   	 t        j                  t        d       t         dt        t	        j                         dz         d}t        |dd      5 }t        j                  d	| i|d
       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)NT)exist_ok/g    eAz.jsonwr   encodingr*   F)ensure_asciizFalha ao enviar outbox: )
osmakedirs
OUTBOX_DIRinttimeopenjsondump	Exceptionr   )r*   fnamefes       r   send_outboxr>   ?   s    ,
J.,aDIIK#$5 67u=%w/ 	=1IIvtnae<	= 	= 	= ,&qc*++,s6   AB A90B 9B>B B 	B&B!!B&c                  "   t        d       t        j                  t        dt        idt
        t        dd      } | j                          | j                         j                  d      }|st        d| j                         t        d	       |S )
NzAutenticando na Hotmart...Authorizationclient_credentials)
grant_type	client_idclient_secret   headersparamstimeoutaccess_tokenzSem access_token: zAuth Hotmart OK.)r   requestspostHOTMART_AUTH_URLHOTMART_BASICHOTMART_CLIENT_IDHOTMART_CLIENT_SECRETraise_for_statusr8   getRuntimeErrorr*   )rtoks     r   hotmart_tokenrV   L   s    $% -0.*2

 		A 
&&(,,~
&C/x899Jr   tokenstatusbuyersstart_date_msc           
         dd|  i}d}d}d}d}	 |dz  }||t         |d}	|r||	d<   t        d	| d
| d|rdnd d       t        j                  t        ||	d      }
|
j
                  dk7  r;t        d	| d|
j
                   d|
j                  dd         |
j                          |
j                         }|j                  dg       }|t        |      z  }t        dt        |       d| d| d       |D ]  }|j                  d      xs i }|j                  d      xs dj                         j                         }|j                  d      xs dj                         }|j                  d      }|s||vs|||d||<    |j                  d      xs i }|j                  d       }|snt        d!t        |       d"       t        d	| d#| d$       y)%u=   Busca vendas com um status específico, paginando até o fim.r@   zBearer Nr     r!   )max_resultstransaction_status
product_id
start_date
page_tokenr
   u
   ] página z (page_token=simu   nãoz)...<   rF      z] Erro Hotmart : i  itemsz  -> u(    vendas nesta página (acumulado status )buyeremailr   nameucode)ri   rj   rk   	page_infonext_page_tokenz  Paginando... u    compradores únicos até agoraz] Fim. z vendas processadas.)
PRODUCT_IDr   rK   rR   HOTMART_SALES_URLstatus_coder*   rQ   r8   r$   r   r   )rW   rX   rY   rZ   rG   ra   pager]   total_items_statusrH   rT   datarf   itrh   ri   rj   rk   rl   s                      r   _fetch_statusru   `   s   '% 12GJDK
	&"($'	
 #-F< axz$}jUf4UUYZ[LL*GFTVW==C!F8?1==/AFF4CL>JK vvx"%c%j(eCJ<GxrRdQeefgh 	OBFF7O)rEYYw'-2446<<>EIIf%+224DIIg&EF"*/ Nu	O HH[)/R	]]#45
oc&k]*IJKM P !F87-..BCDr   c                 @   t        t        dddt        j                        j	                         dz        }t        d| d       i }	 t        | d||       t        |      }t        d
| d       	 t        | d||       t        dt        |       dt        |      |z
   d       t        dt        |              t        |j                               S # t        $ r}t        d|        Y d	}~d	}~ww xY w# t        $ r}t        d|        Y d	}~d	}~ww xY w)zPagina sales/history desde 2019-01-01 e retorna lista de dicts com email + nome.

    Faz duas passadas: uma com transaction_status=COMPLETE e outra com APPROVED,
    porque vendas antigas na Hotmart podem estar em status diferentes.
    i  r!   )tzinfoi  zstart_date = z ms (2019-01-01 UTC)COMPLETEzFalha na passada COMPLETE: Nu   Após COMPLETE: u    compradores únicos.APPROVEDzFalha na passada APPROVED: u   Após APPROVED: u    compradores únicos (+z novos).u   Total de compradores únicos: )r5   r   r   utc	timestampr   ru   r:   r$   listvalues)rW   rZ   rY   r=   	completess        r   hotmart_fetch_buyersr      s    q!HLLAKKMPTTUM-&:;<F/eZ? FI
9+%:;</eZ? 
3v;-'>s6{Y?V>WW_`a
(V67    /)!-../  /)!-../s0   
C 3C< 	C9!C44C9<	DDDc                      t        t        d      5 } | j                         j                         cd d d        S # 1 sw Y   y xY w)NrT   )r7   META_TOKEN_PATHreadr   )r<   s    r   
meta_tokenr      s3    	os	#  qvvx~~     s	   9Ac           	      D   t        d       t        j                  dt         dt         dd| idddd	d
d      }|j
                  dk\  r5t        d|j
                   d|j                          |j                          |j                         d   }t        d|        |S )Nz"Criando Custom Audience no Meta...https://graph.facebook.com//act_/customaudiencesrJ   u*   Compradores Radiestesia Prática - HotmartCUSTOMuP   Lista de compradores do curso Passo a Passo da Radiestesia na Prática (Hotmart)USER_PROVIDED_ONLY)rj   subtypedescriptioncustomer_file_sourcerc   rH   r8   rI   ,  zErro criar audience: r"   idzCustom Audience criada: )	r   rK   rL   META_API_VERSIONMETA_ACCOUNT_IDrp   r*   rQ   r8   )rW   rT   aids      r   meta_create_custom_audiencer      s    ,-
%&6%7u_<MM]^&@m$8	
 
	A 	}}#AMM?!AFF8<=	
&&(4.C
"3%()Jr   audience_idc                 J   t        dt        |       d       d}d}d}t        t        j                               }t        |      |z   dz
  |z  }t	        dt        |      |      D ]&  }||||z    }	||z  dz   }
|	D cg c]  }t        |d         g }}t        |t              r|gn||d}|||
|
|k(  t        |      d	d
}t        j                  dt         d| dd| i|d      }|j                  dk\  r;t        d|
 d|j                   d|j                  d d         |j                          |j                         }|j                  dt        |	            }|j                  dd      }||z  }t        d|
 d| d| d|        ) t        d|        |S c c}w )NzFazendo upload de u    usuários em lotes de 10k...EMAIL_SHA256r   i'  r!   ri   )schemars   )
session_id	batch_seqlast_batch_flagestimated_num_total)payloadsessionr   r-   z/usersrJ   x   r   r   zErro upload batch re   r"   r\   num_receivednum_invalid_entriesz  Batch z: recebidos=u    inválidos=u"   Upload concluído. Total enviado: )r   r$   r5   r6   ranger   
isinstancestrrK   rL   r   rp   r*   rQ   r8   rR   )rW   r   rY   r   total
batch_sizer   total_batchesichunk	batch_numbrs   r   bodyrT   respreceivedinvalids                      r   meta_upload_usersr      s   
S[M)FGH FEJTYY[!J[:-1j@M1c&k:. "_q1z>*Oa'	167A1W:&'77 #-VS"9vhv
 (&#,#='*6{	
 MM)*:);1[MP"E*	
 ==C$YKr!--!&&#,PQ vvx88NCJ7((0!4hyk=/hZ|T[S\]^E"_H 
,UG45LE 8s   >F source_audience_idc                 t   t        d       t        j                  dt         dt         dd| idd|t        j                  dd	d
dd      dd      }|j                  dk\  r5t        d|j                   d|j                          |j                          |j                         d   }t        d|        |S )NzCriando Lookalike BR 1%...r   r   r   rJ   z#LAL Compradores Radiestesia - BR 1%	LOOKALIKE
similarityg        g{Gz?BR)typestarting_ratioratiocountry)rj   r   origin_audience_idlookalike_specrc   r   r   zErro criar LAL: r"   r   zLookalike criada: )
r   rK   rL   r   r   r8   dumpsrp   r*   rQ   )rW   r   rT   lids       r   meta_create_lookaliker     s    $%
%&6%7u_<MM]^&9""4"jj$"%	* 	

 	A  	}}q}}oQqvvh78	
&&(4.C
SE"#Jr   c                     t         j                  dd       t               } t        |       }|s0d}t	        |       t        d|        t        j                  d       t        t        dd      5 }t        j                  ||d	d
       d d d        t	        dt                t               }t        j                         rTt        j                         j!                         r2t        j                         j!                         }t	        d| d       n t#        |      }t        j%                  |       t'        |||      }d }t(        j                         rTt(        j                         j!                         r2t(        j                         j!                         }t	        d| d       n"	 t+        ||      }t(        j%                  |       dt/        |       d| d| d}|r	|d| dz  }|dt/        |       dz  }t        |       t	        d       y # 1 sw Y   xY w# t,        $ r}t	        d|        Y d }~rd }~ww xY w)NT)parentsr,   z>Nenhum comprador encontrado no Hotmart para o produto 1437935.u   ⚠️ r!   r.   r   r/   F   )r1   indentzBackup salvo em z#Reaproveitando audience existente: z (novo upload acumulativo)u   Lookalike já existente: u    (não recriando)z6Falha ao criar LAL (pode exigir audience preenchida): uP   ✅ *Audience atualizada — lista completa*

• Total de compradores subidos: u!   
• Usuários enviados ao Meta: u   
• Audience ID: `z`
u   • Lookalike BR 1%: `z
Com z> pessoas na base, o Lookalike agora tem musculatura pra rodar.zFim.)
OUTPUT_DIRmkdirrV   r   r   r>   sysexitr7   BUYERS_JSONr8   r9   r   AUDIENCE_ID_FILEexists	read_textr   r   
write_textr   LAL_ID_FILEr   r:   r$   )	ht_tokenrY   r   r<   m_tokenr   
total_sentlal_idr=   s	            r   mainr      s   TD1 H!(+FNCgcUO$ 
k3	1 ;Q		&!%:;
;-() lG %5%?%?%A%G%G%I&00288:1+>XYZ1':##K0"7K@J F 5 5 7 = = ?&&(..0'x/@AB	N*7K@F""6*	--0[M :++5, 7(M	.  'xs33VCK= ^__CKO; ;0  	NHLMM	Ns$   1H/!H& H#&	I/II__main__u&   ❌ Erro no hotmart_to_meta_audience: r!   ).__doc__r   r8   r2   r   r6   r   r   pathlibr   rK   rO   rP   rN   rM   ro   rn   r   r   r   r   r   r   r   r4   r   r   r   r)   r>   rV   dictr5   ru   r   r   r   r|   r   r   r   __name__r:   r=   errr    r   r   <module>r      s     	 
  '  
 ; > |I R 
9# 89
 :: 9999"
'S '
MS MS Mc ,c ,s (0E 0Ec 0E4 0E 0Ef! !H C  
s s */S /s /D /S /d # # :5p z   6qc:CC	s   3B< <C2'C--C2