
    RiG1                        d Z ddlZddlZddlZddlmZ ej                  j                  dd       ddlm	Z	 de
de
fdZd	e
defd
ZddZde	dej                  ddfdZde	dej                  ddfdZde	dej                  ddfdZde	dej                  ddfdZde	dej                  ddfdZde	dej                  ddfdZde	dej                  ddfdZde	dej                  ddfdZde	dej                  ddfdZde	dej                  ddfdZdej2                  fdZde	dej                  ddfdZddZedk(  r e        yy)-   Google Ads CLI - Google Ads API 관리 도구    N)NoReturnz/home/jay/workspace)GoogleAdsClienttokenreturnc                 \    | syt        |       dk  rdt        |       z  S | dd dz   | dd z   S )u,   토큰 앞 8자 + '...' + 뒤 4자 마스킹z(empty)   *N   z...)len)r   s    G/home/jay/workspace/.worktrees/task-2117-dev1/scripts/google_ads_cli.py
mask_tokenr      s?    
5zRSZ!9uuRSz))    messagec                 j    t        d|  t        j                         t        j                  d       y)u1   에러 메시지를 stderr로 출력하고 exit 1zError: file   N)printsysstderrexit)r   s    r   
error_exitr      s"    	GG9
CJJ/HHQKr   c                 P    t        t        j                  | ddt                     y)u   JSON 형식으로 출력   F)indentensure_asciidefaultN)r   jsondumpsstr)datas    r   
print_jsonr$       s    	$**T!%
EFr   client_argsc                     	 | j                         }t        di       y# t        $ r}t        d|        Y d}~*d}~ww xY w)u   status: 계정 정보 출력u   계정 정보 조회 실패: Naccount)get_account_info	Exceptionr   r$   )r%   r&   account_infoes       r   
cmd_statusr-   *   sI    8..0 	<()  821#6778s     	A<Aargsc                     t        |dd      }	 | j                  |      }t	               y# t        $ r}t        d|        Y d}~(d}~ww xY w)u'   campaigns list: 캠페인 목록 출력limit   )r0   u    캠페인 목록 조회 실패: N)getattrlist_campaignsr*   r   r$   )r%   r.   r0   	campaignsr,   s        r   cmd_campaigns_listr5   7   sW    w+E;)))6	 y  ;5aS9::;s   - 	AA		Ac                     	 | j                  |j                  |j                  d      }t               y# t        $ r}t	        d|        Y d}~(d}~ww xY w)u9   campaigns create: 캠페인 생성 (status=PAUSED 고정)PAUSED)namebudget_amountstatusu   캠페인 생성 실패: N)create_campaignr8   budgetr*   r   r$   r%   r.   resultr,   s       r   cmd_campaigns_creater?   B   s\    4''++ ( 
 v  4.qc2334   (6 	AAAc                     	 | j                  |j                        }t	               y# t        $ r}t        d|        Y d}~(d}~ww xY w)u&   campaigns get: 단일 캠페인 조회campaign_idu   캠페인 조회 실패: N)get_campaignidr*   r   r$   r=   s       r   cmd_campaigns_getrF   P   sM    4$$$9 v  4.qc2334s   * 	AAAc                     	 | j                  |j                        }t	        |j                  d       y# t        $ r}t        d|        Y d}~5d}~ww xY w)u3   campaigns delete: 캠페인 삭제 (REMOVED 상태)rB   u   캠페인 삭제 실패: N)successrC   )delete_campaignrE   r*   r   r$   )r%   r.   rH   r,   s       r   cmd_campaigns_deleterJ   Z   sV    4((TWW(= 7477;<  4.qc2334s   7 	A AAc                     	 | j                  |j                  |j                  |j                        }t               y# t        $ r}t        d|        Y d}~(d}~ww xY w)u(   insights: 광고 성과 리포트 조회)	entity_identity_type
date_rangeu   인사이트 조회 실패: N)get_insightsrL   rM   rN   r*   r   r$   )r%   r.   resultsr,   s       r   cmd_insightsrQ   g   sb    7%%nn(( & 
 w  71!5667s   2A   	A!	AA!c                     	 | j                  |j                  t        |dd            }t               y# t        $ r}t	        d|        Y d}~(d}~ww xY w)u&   keywords list: 키워드 목록 출력r0   r1   )ad_group_idr0   u    키워드 목록 조회 실패: N)list_keywordsrS   r2   r*   r   r$   )r%   r.   keywordsr,   s       r   cmd_keywords_listrV   x   s`    ;''(($, ( 
 x  ;5aS9::;r@   c                 :   	 t        j                  |j                        }	 | j                  |j                        }t               y# t         j                  $ r}t	        d|        Y d}~Pd}~ww xY w# t        $ r}t	        d|        Y d}~Vd}~ww xY w)u   keywords add: 키워드 추가

    --keywords 인자는 JSON 배열 문자열로 전달.
    예: '[{"text": "보험", "match_type": "BROAD"}]'
    u   --keywords JSON 파싱 실패: N)rS   rU   u   키워드 추가 실패: )	r    loadsrU   JSONDecodeErrorr   add_keywordsrS   r*   r$   )r%   r.   keywords_datar,   r>   s        r   cmd_keywords_addr\      s    :

4==14$$((" % 
 v  :4QC899:  4.qc2334s.   A A9 A6A11A69	BBBc                     t        |dd      }t        |dd      }	 | j                  ||      }t	               y# t        $ r}t        d|        Y d}~(d}~ww xY w)u*   ad-groups list: 광고그룹 목록 출력rC   Nr0   r1   )rC   r0   u#   광고그룹 목록 조회 실패: )r2   list_ad_groupsr*   r   r$   )r%   r.   rC   r0   	ad_groupsr,   s         r   cmd_ad_groups_listr`      sg    %dM4@Kw+E>))k)O	 y  >8<==>s   ; 	AAAc                     	 | j                  |j                  |j                  |j                  d      }t               y# t        $ r}t        d|        Y d}~(d}~ww xY w)u<   ad-groups create: 광고그룹 생성 (status=PAUSED 고정)r7   )rC   r8   cpc_bidr:   u   광고그룹 생성 실패: N)create_ad_grouprC   r8   rb   r*   r   r$   r=   s       r   cmd_ad_groups_createrd      se    7''((LL	 ( 
 v  71!5667s   3A 	A"
AA"c                     t        j                  dt         j                        } | j                  dd      }|j	                  dd       |j	                  d	d
      }|j                  dd      }|j	                  dd      }|j                  dt        dd       |j	                  dd      }|j                  ddd       |j                  dt        dd       |j	                  dd      }|j                  ddd       |j	                  d d!      }|j                  ddd       |j	                  d"d#      }|j                  d$d%dd&'       |j                  d(d)d*g d+d,-       |j                  d.d/d0d12       |j	                  d3d4      }	|	j                  dd      }
|
j	                  dd5      }|j                  d6d7dd8'       |j                  dt        dd       |
j	                  d9d:      }|j                  d6d7dd8'       |j                  d;dd<       |j	                  d=d>      }|j                  dd      }|j	                  dd?      }|j                  d@dAd dB2       |j                  dt        dd       |j	                  ddC      }|j                  d@dAddD'       |j                  dddE       |j                  dFdGt        ddHI       | S )JNr   )descriptionformatter_classcommandCOMMAND)destmetavarr:   u   계정 정보 확인)helpr4   u   캠페인 관리actionACTIONlistu   캠페인 목록 조회z--limitr1   u   최대 결과 수 (기본: 25))typer   rl   createu    캠페인 생성 (PAUSED 상태)z--nameTu   캠페인 이름)requiredrl   z--budgetu8   일일 예산 (마이크로 단위, 예: 1000000 = 1원))rp   rr   rl   getu   단일 캠페인 조회z--idu   캠페인 IDdeleteu   캠페인 삭제 (REMOVED)insightsu   광고 성과 리포트 조회z--entity-idrL   u-   조회할 캠페인/광고그룹/키워드 ID)rj   rr   rl   z--entity-typerM   campaign)rv   ad_groupkeywordu#   엔티티 타입 (기본: campaign))rj   r   choicesrl   z--date-rangerN   LAST_7_DAYSuS   날짜 범위 프리셋 (기본: LAST_7_DAYS). LAST_30_DAYS, THIS_MONTH 등 지원.)rj   r   rl   rU   u   키워드 관리u   키워드 목록 조회z--ad-group-idrS   u   광고그룹 IDaddu   키워드 추가z
--keywordsuI   JSON 배열 문자열. 예: '[{"text": "보험", "match_type": "BROAD"}]'	ad-groupsu   광고그룹 관리u   광고그룹 목록 조회z--campaign-idrC   u;   캠페인 ID (생략 시 계정 전체 광고그룹 반환)u#   광고그룹 생성 (PAUSED 상태)u   상위 캠페인 IDu   광고그룹 이름z	--cpc-bidrb   u8   CPC 입찰가 (마이크로 단위, 예: 1000000 = 1원))rj   rp   rr   rl   )argparseArgumentParserRawDescriptionHelpFormatteradd_subparsers
add_parseradd_argumentint)parser
subparserscampaigns_parsercampaigns_sublist_pcreate_pget_pdelete_pinsights_parserkeywords_parserkeywords_sub	kw_list_pkw_add_pad_groups_parserad_groups_sub	ag_list_pag_create_ps                    r   build_parserr      s   $$C <<F
 &&Iy&IJ #   ",, -  %3383TM %%f3L%MF
	R>^_ ''7Y'ZH(T8JKG	   $$U1J$KE	v>B ''7S'TH&4nE !++- , O   <	 !    32 !    b	 !  !++ , O #11x1RL ''5N'OI	   93Aab &&u3E&FH	   Z   ",," -  %3383TM ((6R(SIJ	   93Aab  **8:_*`K"	   X;PQG   Mr   c                 v   |j                   }|dk(  rt        | |       y |dk(  rt        |dd       }|dk(  rt        | |       y |dk(  rt	        | |       y |dk(  rt        | |       y |dk(  rt        | |       y t        dt        j                  	       t        j                  d
       y |dk(  rt        | |       y |dk(  rbt        |dd       }|dk(  rt        | |       y |dk(  rt        | |       y t        dt        j                  	       t        j                  d
       y |dk(  rbt        |dd       }|dk(  rt        | |       y |dk(  rt        | |       y t        dt        j                  	       t        j                  d
       y t        dt        j                  	       t        j                  d
       y )Nr:   r4   rm   ro   rq   rs   rt   uK   campaigns 서브 명령어를 지정하세요: list | create | get | deleter   r   ru   rU   r{   u8   keywords 서브 명령어를 지정하세요: list | addr|   u<   ad-groups 서브 명령어를 지정하세요: list | createuF   명령어를 지정하세요. --help 로 도움말을 확인하세요.)rh   r-   r2   r5   r?   rF   rJ   r   r   r   r   rQ   rV   r\   r`   rd   )r%   r.   rh   rm   s       r   dispatchr   K  sw   llG(64 	K	x.Vvt,x .u_fd+x .]ZZ HHQK	J	VT"	J	x.Vfd+u_VT*LSVS]S]^HHQK	K	x.Vvt,x .PWZWaWabHHQK 	V]`]g]ghr   c                  p   t               } | j                         }|j                  s%| j                          t	        j
                  d       	 t               }t        |       y # t        $ rH}t        |      }t        d| t        j                         t	        j
                  d       Y d }~Yd }~ww xY w)Nr   u*   Error: GoogleAdsClient 초기화 실패 - r   r   )r   
parse_argsrh   
print_helpr   r   r   r*   r"   r   r   r   )r   r.   r%   r,   msgs        r   mainr     s    ^FD<< " VT  !f:3%@szzRs   
A$ $	B5->B00B5__main__)r   N)__doc__r}   r    r   typingr   pathinsertutils.google_ads_clientr   r"   r   r   r$   	Namespacer-   r5   r?   rF   rJ   rQ   rV   r\   r`   rd   r~   r   r   r   __name__ r   r   <module>r      s   3   
  ( ) 3*c *c *  G* *x/A/A *d * h6H6H T  8J8J t o X5G5G D = =8J8J =t = 0B0B t "
o 
X5G5G 
D 
_ H4F4F 4 2	 	h6H6H 	T 	 8J8J t (Eh-- EZ0_ 0H,>,> 04 0p$ zF r   