
    i$'                    J   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Zddlm	Z	 ddl
Z
ddlmZ ej                  j                  d e e	e      j"                               ddlZ e	d      Zedz  Zedz  Zed	z  Zed
z  ZdZdZdZdZddZddZddZddZe dk(  r e        yy)uy   컨셉 #19 타겟 페르소나 카드 v2 생성 스크립트
Gemini AI 배경 + HTML 오버레이 하이브리드 방식
    )annotationsN)Path)sync_playwrightzC/home/jay/workspace/output/meta-ads/concept-catalog/19-persona-cardz	bg_v2.jpgzoverlay_v2.htmlzsample-v2.pngz19-persona-card-v2.pngz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languagea  Three diverse Korean business professionals standing together in a row, young woman in her 20s on left wearing light blue blouse, confident man in his 30s in middle wearing navy blazer, professional woman in her 40s on right wearing beige jacket, all smiling warmly, bright warm studio background, team portrait, friendly corporate atmosphere, waist-up shot, 1080x1080, no text, no watermark, clean professional photou  <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  @import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css');

  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1080px;
    height: 1080px;
    overflow: hidden;
    background: #f4f6fa;
    font-family: 'Pretendard', 'Apple SD Gothic Neo', 'Noto Sans KR', sans-serif;
  }

  .container {
    position: relative;
    width: 1080px;
    height: 1080px;
    overflow: hidden;
  }

  /* 배경 이미지 */
  .bg-image {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center top;
  }

  /* 상단 오버레이 그라디언트 (상위 38%) */
  .top-overlay {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 38%;
    background: linear-gradient(
      to bottom,
      rgba(244, 246, 250, 0.97) 0%,
      rgba(244, 246, 250, 0.90) 55%,
      rgba(244, 246, 250, 0.0) 100%
    );
  }

  /* 하단 오버레이 그라디언트 (하위 38%) */
  .bottom-overlay {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 38%;
    background: linear-gradient(
      to top,
      rgba(244, 246, 250, 0.97) 0%,
      rgba(244, 246, 250, 0.90) 55%,
      rgba(244, 246, 250, 0.0) 100%
    );
  }

  /* 상단 텍스트 영역 */
  .top-content {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    padding: 48px 64px 0;
    display: flex;
    flex-direction: column;
    gap: 8px;
  }

  .label-text {
    font-size: 40px;
    font-weight: 600;
    color: #3B82F6;
    letter-spacing: -0.5px;
    line-height: 1.2;
  }

  .headline-text {
    font-size: 84px;
    font-weight: 800;
    color: #0F1F4B;
    letter-spacing: -2px;
    line-height: 1.1;
  }

  /* 하단 텍스트 영역 */
  .bottom-content {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    padding: 0 64px 48px;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
  }

  .sub-headline {
    font-size: 64px;
    font-weight: 700;
    color: #0F1F4B;
    letter-spacing: -1.5px;
    line-height: 1.15;
  }

  .benefit-text {
    font-size: 48px;
    font-weight: 700;
    color: #0F1F4B;
    letter-spacing: -1px;
    line-height: 1.2;
  }

  .urgent-text {
    font-size: 40px;
    font-weight: 500;
    color: #DC2626;
    letter-spacing: -0.5px;
    line-height: 1.2;
  }

  /* CTA 버튼 */
  .cta-button {
    display: inline-block;
    font-size: 40px;
    font-weight: 800;
    color: #ffffff;
    background: #FF6B35;
    padding: 16px 48px;
    border-radius: 50px;
    letter-spacing: -0.5px;
    line-height: 1.2;
    margin-top: 6px;
  }

  .brand-text {
    font-size: 40px;
    font-weight: 400;
    color: #9CA3AF;
    letter-spacing: -0.3px;
    line-height: 1.2;
    margin-top: 2px;
  }
</style>
</head>
<body>
<div class="container">
  <!-- 배경 이미지 -->
  <img class="bg-image" src="__BG_PATH__" alt="background" />

  <!-- 그라디언트 오버레이 -->
  <div class="top-overlay"></div>
  <div class="bottom-overlay"></div>

  <!-- 상단 텍스트 -->
  <div class="top-content">
    <div class="label-text">T.O.P 사업단 리크루팅</div>
    <div class="headline-text">소득이 제자리걸음?</div>
  </div>

  <!-- 하단 텍스트 -->
  <div class="bottom-content">
    <div class="sub-headline">신입 · 경력직 · 전직</div>
    <div class="benefit-text">정착지원금 최대 1,000만원</div>
    <div class="urgent-text">2026년 7월 조건 변경 예정</div>
    <div class="cta-button">지금 상담 신청하기 →</div>
    <div class="brand-text">T.O.P 사업단 | 인카금융서비스</div>
  </div>
</div>
</body>
</html>
c                   t        d       dD ]o  }t        d|        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                          |j                         }d}d}d|v r6|d   d   d   d	   D ]%  }	d|	v s|	d   d   }|	d   j                  dd      } n |rpd|v rdnd}
t        j                  |
      }|j                  t        j                  |             t        d| d |j                         j                  d!d"       |c S t        d#t!        |j#                                       r t1        d)      # t$        $ rv}t        d$t'        |      j(                   d%|        t+        |d&      r;t+        |j,                  d
      r%t        d'|j,                  j.                  dd(         Y d}~d}~ww xY w)*u%   Gemini API로 배경 이미지 생성u$   [1/3] 배경 이미지 생성 중...)zgemini-2.5-flash-imagezgemini-3.1-flash-image-previewzgemini-3-pro-image-previewu     모델 시도: z/models/z:generateContentzBearer zapplication/json)AuthorizationzContent-TypepartstextresponseModalitiesIMAGETEXT)contentsgenerationConfigx   )headersjsontimeout)i  i  u     접근 불가 (HTTP u   ), 다음 모델 시도...Nz
image/jpeg
candidatesr   content
inlineDatadatamimeTypepngz.pngz.jpgu     배경 이미지 저장:  (, bytes)u*     이미지 데이터 없음. 응답 키: u
     오류: z: responseu
     응답: i,  u9   모든 Gemini 모델에서 배경 이미지 생성 실패)printGEMINI_API_BASE	BG_PROMPTrequestspoststatus_coderaise_for_statusr   getBG_PATHwith_suffixwrite_bytesbase64	b64decodestatst_sizelistkeys	Exceptiontype__name__hasattrr   r	   RuntimeError)tokenmodel_idurlr   payloadrespr   	image_b64	mime_typepartextout_pathes                Y/home/jay/workspace/.worktrees/task-2116-dev1/tools/ai-image-gen/generate_concept19_v2.pygenerate_backgroundr?      s?   	
01n -!(,- !(3CD&ug..
 "VY$7#89:!57H I

 	==gGSQD:-.t/?/?.@@Z[\!!#99;D I$It# .q1)<WE D#t+$($6v$>	$($6$:$::|$T		  % 2f"..s3$$V%5%5i%@A3H:R@W@WXY?ZZabc>tDIIK?P>QRSO-^ R
SS  	JtAw//01#67q*%'!**f*E
1::??4C#8"9:;		s-   A F	=FBF%F	HA+HHc                    t        d       t        j                  dd| j                                }t        j                  |d       t        dt                t        S )u@   HTML 오버레이 파일 생성 (배경 이미지 경로 주입)u%   [2/3] HTML 오버레이 생성 중...__BG_PATH__file://zutf-8)encodingu     HTML 저장: )r   HTML_TEMPLATEreplaceresolve	HTML_PATH
write_text)bg_pathhtml_contents     r>   
build_htmlrK     sT    	
12 ((''//BSAT8UVL8	OI;
'(    c                6   t        d       t               5 }|j                  j                         }	 |j	                  ddd      }|j                  d| j                          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    [3/3] 스크린샷 캡처 중...i8  )widthheight)viewportrB   networkidle)
wait_untili	  T)parentsexist_okr   )pathr/   u     캡처 완료: r   r   r   N)r   r   chromiumlaunchnew_pagegotorF   wait_for_timeoutparentmkdir
screenshotstrr*   r+   close)	html_pathoutput_pathpbrowserpages        r>   capture_screenshotre      s    	
,-		 a**##%		##tt-L#MDII	 1 1 345-IP!!$'$$TD$AOO[!1O>%k]"[5E5E5G5O5OPQ4RRYZ[MMO  MMO s#   DB.C: D:DDDc                 @   t        j                          } t        d       t        d       t        d       t        d       t        d       	 t        j                  t              }t        dt        |       d       t        |      }t        |      }t        |t               t        j                  t        t               t        dt                t        j                          | z
  }t        dd        t        d|dd       t        dt                t        dt                t        d       y # t        $ r[}t        d| d       	 t        j                         }t        d	       n # t        $ r}t        d
|       |d }~ww xY wY d }~d }~ww xY w)Nz<============================================================u/   컨셉 #19 타겟 페르소나 카드 v2 생성u<   방식: Gemini AI 배경 + HTML 오버레이 하이브리드u)   
[인증] Gemini API 토큰 획득 중...u      토큰 획득 성공 (길이: z chars)u     SA 토큰 실패: u   , ADC 시도...u     ADC 토큰 획득 성공u   인증 실패: u   
  복사본 저장: 
u   완료! 총 소요 시간: z.1fu   초z  sample-v2.png       : z  19-persona-card-v2.png: )timer   gcloud_authget_service_account_tokenGEMINI_SCOPElenr.   get_access_token
SystemExitr?   rK   re   SAMPLE_V2_PATHshutilcopy2PERSONA_CARD_V2_PATH)
start_timer3   r=   e2rI   r`   elapseds          r>   mainrv   1  so   J	(O	
;<	
HI	(O 

67	=55lC0UGDE "%(G 7#I y.1 LL!56	"#7"8
9:iikJ&G	Bxj/	'}C
89	$^$4
56	&';&<
=>	(O5  =$QC78	=002E./ 	=rd34"<	= 0	=s<   1D9 9	FFE21F2	F;F

FFF__main__)r3   r^   returnr   )rI   r   rx   r   )r`   r   ra   r   rx   None)rx   ry   )!__doc__
__future__r   r(   r   rp   sysrh   pathlibr   r    playwright.sync_apir   rU   insertr^   __file__r[   ri   
OUTPUT_DIRr%   rG   ro   rr   r   rk   r   rD   r?   rK   re   rv   r0    rL   r>   <module>r      s    #    
    / 3tH~,,- .  WX

{
"**	o-!$<< DD6 
tn3Tl"&R zF rL   