
    i9                         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mZ dZ	 d dlZdej                  vrej                  j!                  d d       dZd dlmZ d dlmZ  ee      ZdZg d	Z G d
 d      Zy# e$ r Y ,w xY w)    N)AnyOptionalFz/home/jay/workspaceT)load_env_keys)
get_loggerzhttps://api.searchad.naver.com)impCntclkCntsalesAmtctrcpcccntc                       e Zd ZddeddfdZdedededefdZdededefd	Z	 ddeded
ee   de	fdZ
defdZddee   defdZdedefdZ	 	 	 	 ddedee   dee   dee   dee   defdZy)NaverSAClientenv_keys_pathreturnNc                    t        |       t        j                  j                  dd      | _        t        j                  j                  dd      | _        t        j                  j                  dd      | _        t        | j                  | j
                  | j                  g      st        j                  d       t        j                  d| j                         y )NNAVER_SEARCHAD_CUSTOMER_ID NAVER_SEARCHAD_API_KEYNAVER_SEARCHAD_SECRET_KEYu)   NAVER_SEARCHAD 환경변수 일부 누락u/   NaverSAClient 초기화 완료 (customer_id=%s))r   osenvironget_customer_id_api_key_secret_keyallloggerwarninginfo)selfr   s     N/home/jay/workspace/.worktrees/task-2116-dev1/tools/naver-ads/sa_api_client.py__init__zNaverSAClient.__init__!   s    m$JJNN+GL

'?D::>>*ErJD%%t}}d6F6FGHNNFGEtGXGXY    	timestampmethoduric                    | d| d| }t        j                  | j                  j                  d      |j                  d      t        j
                        }t        j                  |j                               j                  d      S )N.utf-8)
hmacnewr   encodehashlibsha256base64	b64encodedigestdecode)r    r$   r%   r&   messagehs         r!   _generate_signaturez!NaverSAClient._generate_signature*   sq    Kq#/HH##G,NN7#NN

 
+227;;r#   c                     t        t        t        j                         dz              }|| j                  | j                  | j                  |||      ddS )Ni  zapplication/json; charset=UTF-8)zX-Timestampz	X-API-KEYz
X-CustomerzX-SignaturezContent-Type)strinttimer   r   r5   )r    r%   r&   r$   s       r!   _build_headerszNaverSAClient._build_headers3   sN    DIIK$./0	$++33IvsK=
 	
r#   paramsc           	         t         |z   }|r'|dt        j                  j                  |d      z   z  }d}t	        |      D ]  }| j                  ||      }t        j                  j                  |||      }	 t        j                  j                  |d      5 }	|	j                         j                  d      }
|
rt        j                  |
      ni cd d d        c S  t+        d| d|       # 1 sw Y   nxY w# t        j                  j                  $ r}|j                  d	k(  r:d
|z  }t         j#                  d||dz          t%        j&                  |       Y d }~"|j                         j                  dd      }
t         j                  d|j                  |||
        d }~wt(        $ rH}t         j                  d|dz   |||       ||dz
  k  rt%        j&                  d
|z         Y d }~ d }~ww xY w)N?T)doseq   )headersr%      )timeoutr)   i     u2   Rate limit (429), %d초 후 재시도 (attempt=%d)   replace)errorszHTTP %d %s %s: %su(   요청 실패 (attempt=%d): %s %s — %su   최대 재시도 초과:  )	_BASE_URLurllibparse	urlencoderanger:   requestRequesturlopenreadr2   jsonloadserror	HTTPErrorcoder   r   r9   sleep	ExceptionRuntimeError)r    r%   r&   r;   urlmax_retriesattemptr@   reqrespbodyewaits                r!   _requestzNaverSAClient._request=   s    #o3//d/CCCC[) 	G))&#6G..((gf(MC^^++C+< <99;--g6D/34::d+< <		, 6vhauEFF%< < < <<)) 66S=g:DNN#WY]_fij_jkJJt$vvxwyA0!&&&#tL GSTV\^acde[1_,JJq'z*sJ   8!C<8C/	C</C8	4C<<G;AF'"AF''G;3<G65G66G;c                     | j                  dd      }t        |t              r|S t        |t              r|j	                  d|g      S g S )NGETz/ncc/campaignsitemsra   
isinstancelistdictr   )r    results     r!   get_campaignszNaverSAClient.get_campaigns`   sF    u&67#FD1vxXbcikoXpvzz'F87Txvxxr#   campaign_idc                     i }|r||d<   | j                  dd|xs d       }t        |t              r|S t        |t              r|j	                  d|g      S g S )NnccCampaignIdrc   z/ncc/adgroupsr;   rd   re   )r    rk   r;   ri   s       r!   get_adgroupszNaverSAClient.get_adgroupsd   s_    &1F?#uofnM#FD1vxXbcikoXpvzz'F87Txvxxr#   
adgroup_idc                     | j                  ddd|i      }t        |t              r|S t        |t              r|j	                  d|g      S g S )Nrc   z/ncc/keywordsnccAdgroupIdrn   rd   re   )r    rp   ri   s      r!   get_keywordszNaverSAClient.get_keywordsk   sN    uo~z>Z[#FD1vxXbcikoXpvzz'F87Txvxxr#   idsfieldsdate_preset
time_range	breakdownc                 F   |t        j                  ||nt              d}|r||d<   |rt        j                  |      |d<   |r||d<   | j                  dd|      }t	        |t
              r|S t	        |t              r"|j                  d|j                  d	g             S g S )
N)rt   ru   
datePreset	timeRangerx   rc   z/statsrn   datard   )rQ   dumps_DEFAULT_FIELDSra   rf   rg   rh   r   )r    rt   ru   rv   rw   rx   r;   ri   s           r!   	get_statszNaverSAClient.get_statso   s     jj6+=?S"
 #.F< "&**Z"8F;"+F;uhv>fd#Mfd#::ffjj"&=>>	r#   )z/home/jay/workspace/.env.keys)N)NNNN)__name__
__module____qualname__r7   r"   r5   rh   r:   r   r   ra   rg   rj   ro   rs   r    r#   r!   r   r       s)   Zc ZPT Z<S <# <C <C <
S 
s 
t 
 "&	!G!G !G 	!G
 
!GFyt yy y yys yt y "&%)%)#'  c]	
 TN C= 
r#   r   )r/   r-   r*   rQ   r   r9   urllib.errorrI   urllib.parseurllib.requesttypingr   r   sys_path_insertedsyspathinsertrW   utils.env_loaderr   utils.loggerr   r   r   rH   r~   r   r   r#   r!   <module>r      s        	       	CHH,01 + #	H	,	Hg g  		s   0B BB