
    iZ                         d Z ddlZddlZddlZ ej                  ej
                  d        ej                  e      Zej                  j                  dd       ddlmZ ddlmZ ddlmZ dd	lmZ d
Zd Zd ZddZd Zedk(  r e        yy)uf   보험저널 뉴스 기반 텍스트 콘텐츠 생성 및 Threads 업로드 스크립트 (task-1047.1)    Nz'%(asctime)s [%(levelname)s] %(message)s)levelformatz/home/jay/projects/ThreadAuto)validate_numbers)TextContentGenerator)ensure_line_breaks)ThreadsPublisherz5/home/jay/projects/ThreadAuto/content/news_cache.jsonc                     t        t        d      5 } t        j                  |       }ddd       D cg c]  }|j	                  d      dk(  s| }}|st        d      |j                  d d	       |d
   }t        j                  d|j	                  d      |j	                  d             t        j                  d|j	                  d             ||j                  |      fS # 1 sw Y   xY wc c}w )uR   news_cache.json에서 보험저널 기사 중 relevance_score 최고 기사 선택zutf-8)encodingNsourceu   보험저널u$   보험저널 기사가 없습니다.c                 &    | j                  dd      S )Nrelevance_scorer   )get)as    7/home/jay/workspace/teams/dev1/task-1047.1_news_post.py<lambda>z.load_best_insjournal_article.<locals>.<lambda>   s    1551BA+F     T)keyreverser   u   선택된 기사: %s (score=%s)titler   u   기사 URL: %surl)
openNEWS_CACHE_PATHjsonloadr   
ValueErrorsortloggerinfoindex)farticlesr   insjournal_articlesbests        r   load_best_insjournal_articler$      s    	o	0  A99Q<  '/T!%%/^2S1TT?@@!FPTUq!D
KK1488G3DdhhO`Fab
KK $((5/2$**4000    Us   C'C3C3'C0c           	          d| d| d   | d   d| j                  di       j                  dg       dd	d
}t        j                  d|d   |d          |S )u4   기사를 topic_selector 호환 topic dict로 변환znews-insjournal-u   업계동향r   summaryTmatched_keywordsprimaryr   N)idcategoryr   description	card_typekeywords
used_count	last_usedu,   topic dict 생성 완료: id=%s, category=%sr*   r+   )r   r   r   )articlearticle_idxtopics      r   build_topicr4   $   so     !."!y)KK 2B7;;IrJ	E KK>dUS]M^_Lr   c                    | j                  ||      }t        |d         }|j                  dg       }t        |dz         D ]  }t	        |      }|d   rt
        j                  d|dz          ||fc S t
        j                  d|dz   |dz   |d          ||k  rIt
        j                  d	       | j                  ||      }t        |d         }|j                  dg       }d
|d    }	t
        j                  d       d|	fc S  ||fS )uR   텍스트 생성 후 fact_guard 검증, 실패 시 최대 max_retries회 재시도)r3   	text_typetexthashtags   passedu!   수치 검증 통과 (attempt %d)u'   수치 검증 실패 (시도 %d/%d): %s
violationsu   재생성 시도...u   FactGuard 검증 실패: u.   수치 검증 최종 실패. 업로드 중단.N)	generater   r   ranger   r   r   warningerror)
	generatorr3   r6   max_retriesresultr7   r8   attemptguard_result	error_msgs
             r   generate_text_with_retryrF   4   s    eyAFfVn-Dzz*b)Hq) ''-!KK;Wq[I>!NN9!a\*	 $12"++%9+M)&.9!::j"57\8R7ST	MNY&)', >r   c                  X   t               \  } }t        | |      }t        j                  d       t	               }t        ||dd      \  }}|add d d g d| d   | d   |d		}t        d
       t        d       t        t        j                  |dd             t        d       t        d       |S |}|}t        j                  d|       t        j                  d|       t        j                  dt        |             t               }	|}
|r|dz   dj                  |      z   }
|
|
ddd d}t        j                  d       |	j                  |      }|d   r&t        j                  d|j                  d             n%t        j                  d|j                  d             |d   |j                  d      ||
|t        |      | d   | d   |j                  d      d		}t        d
       t        d       t        t        j                  |dd             t        d       t        d       |S )Nu0   텍스트 생성 시작 (text_type=text_insight)text_insight   )r6   rA   Fr   r   r   )	successpost_idr7   full_text_with_hashtagsr8   
char_countarticle_titlearticle_urlr?   z=
============================================================RESULT_JSON_START)ensure_asciiindentRESULT_JSON_ENDz<============================================================u   생성된 텍스트:
%su   해시태그: %su   글자수: %dz

 )r7   caption )content
image_pathrK   u   Threads 업로드 시작...rJ   u%   Threads 업로드 성공! post_id: %sthreads_post_idu   Threads 업로드 실패: %sr?   )r$   r4   r   r   r   rF   printr   dumpslenr   joinpublishr   r?   )r1   r2   r3   r@   text_resulthashtags_or_errorr&   r7   r8   	publisher	full_text	post_datapublish_results                r   mainre   S   s   79G[ -E KKBC$&I%=iZhvw%x"K" '+$W-"5>&

 	o!"djjuQ?@ hD H
KK*D1
KK"H-
KKT+ !"II6MCHHX$66	 &)<I KK-.&&y1Ni ;^=O=OPa=bc3^5G5G5PQ "),!%%&78#,$i )u~##G,
G 
/	
	$**W5
;<	
	(ONr   __main__)rI   )__doc__r   loggingsysbasicConfigINFO	getLogger__name__r   pathinsertcontent.fact_guardr   content.text_generatorr   content.text_utilsr   publisher.threads_publisherr   r   r$   r4   rF   re    r   r   <module>ru      s    l   
   ',,/X Y			8	$ 2 3 / 7 1 8I1  >Od zF r   