
    Ci                        d Z ddlm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	Z	ddl
mZ  ed      Z ed      Zedz  Zed	z  Zed
z  Zedz  Zedz  ZdZdZdZddZddZddZddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZddZedk(  r e        yy)u   서울대보험쌤 × 영업지원 Google 광고 배너 생성 스크립트
파이프라인:
  1. Gemini API → 배경 이미지 생성
  2. HTML 템플릿 + Playwright → PNG 합성
    )annotationsN)Path)sync_playwrightz&/home/jay/workspace/tools/ai-image-genz-/home/jay/workspace/output/google-ads/bannerszbg_snu_support.jpgzoverlay_snu_1200x628.htmlzoverlay_snu_1080x1080.htmlzsnu-support-1200x628.pngzsnu-support-1080x1080.pnga(  Bright warm cafe-style workspace, large window with green garden view outside. Morning light, golden hour atmosphere. One person sitting at a laptop, seen from the side, half face visible, gentle warm smile. Coffee cup and planner on the wooden table. Clean minimal interior, warm cream and gold tones. Feeling of a fresh new beginning, bright and welcoming. Photorealistic scene, high quality photography, natural lighting. No dark office, no technical equipment or server rooms, no diplomas or certificates. Soft bokeh background, warm color palette.z0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languagec                    t         j                  j                  dt        t                     ddl} 	 | j                  t              }t        d       |S # t        $ r)}t        d| d       | j                         cY d}~S d}~ww xY w)u*   gcloud_auth 모듈로 인증 토큰 획득r   Nu    [인증] SA 토큰 획득 성공u   [인증] SA 토큰 실패: u   , ADC 시도...)syspathinsertstrTOOL_DIRgcloud_authget_service_account_tokenGEMINI_SCOPEprint	Exceptionget_access_token)r   tokenes      @/home/jay/workspace/output/google-ads/banners/gen_snu_support.pyget_auth_tokenr   /   so    HHOOAs8}%.55lC02 .+A3o>?++--.s   !A 	BB<BBc                T   g d}|D ]n  }t        d|        	 |j                  d      rt        | ||      }nt        | ||      }|r/t        d| d|j	                         j
                  dd       |c S p t        d      # t        $ r}t        d| d	|        Y d
}~d
}~ww xY w)u%   Gemini API로 배경 이미지 생성)z)gemini-2.0-flash-preview-image-generationz%gemini-2.0-flash-exp-image-generationzgemini-3-pro-image-previewzgemini-3.1-flash-image-previewzimagen-3.0-generate-002u   [배경생성] 모델 시도: imagenu   [배경생성] 성공:  (, bytes)u   [배경생성] u	    실패: Nu"   모든 Gemini 모델 호출 실패)r   
startswith_call_imagen_call_gemini_generatestatst_sizer   RuntimeError)r   output_pathmodels_to_trymodel_idresultr   s         r   generate_backgroundr%   <   s    M " .xj9:
	""8,%eX{C.uhL/}B{?O?O?Q?Y?YZ[>\\cde""  ;
<<	  	OH:Yqc:;	s   AB	B'B""B'c                P   t          d| d}d|  dd}ddt        igigdd	d
gid}t        j                  |||d      }|j                  dv r(t        d|j                   d|j                  dd        |j                          |j                         }|j                  dg       }|s$t        dt        j                  |      dd        |d   j                  di       j                  dg       }	|	D ]  }
d|
v s|
d   j                  dd      }t        j                  |
d   d         }|j                  d      }|j                  |       ||k7  rE|j                  j!                  dd       ddl}|j%                  t'        |      t'        |              y t        d      ) u!   Gemini generateContent API 호출/models/z:generateContentBearer application/jsonAuthorizationzContent-TypepartstextresponseModalitiesIMAGETEXT)contentsgenerationConfig   headersjsontimeouti  i  HTTP z: N   
candidatesu   응답에 candidates 없음: i,  r   content
inlineDatamimeTypez
image/jpegdataz.jpgTparentsexist_oku.   이미지 데이터 없음 (inlineData 없음))GEMINI_API_BASE	BG_PROMPTrequestspoststatus_coder    r-   raise_for_statusr6   getdumpsbase64	b64decodewith_suffixwrite_bytesparentmkdirshutilcopyr
   )r   r#   r!   urlr5   payloadrespr?   r;   r,   partmime	img_bytes	save_pathrQ   s                  r   r   r   W   s   XhZ/?
@C"5'**G
  34561GV3DEG ==gGSID:%U4#3#3"4Btyy#6GHII99;D,+J:4::d;KDS;Q:RSTTqMi,00"=E 4%))*lCD((l);F)CDI#//7I!!),K'""(((EC	NC,<= G
HH    c                   t          d| d}d|  dd}dt        igddd	d
}t        j                  |||d      }|j                  dv rt        d|j                         |j                          |j                         }|j                  dg       }|st        d      |d   j                  dd      }	|	st        d      t        j                  |	      }
|j                  |
       y)u   Imagen API 호출r'   z:predictr(   r)   r*   prompt   z1:1)sampleCountaspectRatio)	instances
parametersr3   r4   r8   r9   predictionsu   predictions 없음r   bytesBase64Encoded u   이미지 데이터 없음T)rC   rD   rE   rF   rG   r    rH   r6   rI   rK   rL   rN   )r   r#   r!   rS   r5   rT   rU   r?   rb   img_b64rX   s              r   r   r   }   s   XhZx
8C"5'**G
  +, 
G ==gGSID:%U4#3#3"456699;D((="-K/00!n  !5r:G788  )II&rZ   c                   | j                         st        d|        |j                         st        d|       d| j                          }d|j                          }t               5 }|j                  j                         }	 |j                  ||d      }	|	j                  |d       |	j                  d| d	       |	j                  d
       |j                  j                  dd       |	j                  t        |      d       t        d| d|j                         j                   dd       |j#                          	 ddd       y# |j#                          w xY w# 1 sw Y   yxY w)u-   Playwright로 HTML 템플릿을 PNG로 캡처u   템플릿 없음: u   배경 이미지 없음: zfile://)widthheight)viewportnetworkidle)
wait_untilz0() => {
                window.BG_IMAGE_PATH = "z";
                window.SCENARIO_DATA = {};
                if (typeof render === 'function') {
                    render(window.SCENARIO_DATA, window.BG_IMAGE_PATH);
                }
            }i  Tr@   png)r   typeu	   [캡처] r   r   r   N)existsFileNotFoundErrorresolver   chromiumlaunchnew_pagegotoevaluatewait_for_timeoutrO   rP   
screenshotr
   r   r   r   close)
template_pathbg_pathr!   rg   rh   template_urlbg_file_urlpbrowserpages
             r   capture_bannerr      sh    !"4]O DEE>>";G9 EFF]22456LGOO-./K		 a**##%	##u-O#PDIIl}I=MM ))4 6  !!$'$$TD$AOO[!1O>Ik]"[-=-=-?-G-G,J'RSMMO% $ MMO% s%   -E*	B2E;E*E''E**E3c                 .   t        d       t        d       t        d       t        j                         } t        d       t               }t        d       t        |t              }t        d       t        d       t        t        |t        dd       t        d	       t        t        |t        d
d
       t        j                         | z
  }t        d       t        d|dd       t        dt                t        dt                t        d       y )Nz<============================================================u>   서울대보험쌤 × 영업지원 Google 광고 배너 생성u"   
[1/3] 인증 토큰 획득 중...u,   
[2/3] Gemini 배경 이미지 생성 중...u&   
[3/3] HTML 오버레이 합성 중...u     → 1200x628 배너 캡처...i  it  u      → 1080x1080 배너 캡처...i8  z=
============================================================u   완료! 총 소요: z.1fu   초z  [1] z  [2] )
r   timer   r%   BG_PATHr   TEMPLATE_1200OUT_1200TEMPLATE_1080OUT_1080)total_startr   rz   elapseds       r   mainr      s    	(O	
JK	(O))+K 

/0E 

9:!%1G 

34 

+,='8T3? 

,-='8T4@iikK'G	/	 S
12	F8*
	F8*
	(OrZ   __main__)returnr
   )r   r
   r!   r   r   r   )r   r
   r#   r
   r!   r   r   bool)ry   r   rz   r   r!   r   rg   intrh   r   r   None)r   r   )__doc__
__future__r   rK   r6   r   r   pathlibr   rE   playwright.sync_apir   r   
OUTPUT_DIRr   r   r   r   r   rD   rC   r   r   r%   r   r   r   r   __name__ rZ   r   <module>r      s    #   
    / 89AB

+
+889922331 
 ED
.=6#ILB""" " 	"
 " 
"JB zF rZ   