This commit is contained in:
parent
60bd86a898
commit
4914cabaec
|
|
@ -4,6 +4,7 @@ Scripts/
|
||||||
build/
|
build/
|
||||||
dist/
|
dist/
|
||||||
Include/
|
Include/
|
||||||
|
imgtrans_test/
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.log
|
*.log
|
||||||
*.log.*
|
*.log.*
|
||||||
|
|
|
||||||
20
ai/gemini.py
20
ai/gemini.py
|
|
@ -60,7 +60,7 @@ class ImageDescriptionGenerator:
|
||||||
너는 온라인 쇼핑몰 상세페이지 제작 전문가야. 니가 만든 상품페이지는 모두를 감동시키고, 구매로 이어지는 마법같은 능력이 있어.
|
너는 온라인 쇼핑몰 상세페이지 제작 전문가야. 니가 만든 상품페이지는 모두를 감동시키고, 구매로 이어지는 마법같은 능력이 있어.
|
||||||
이제 주어진 이미지와 내가 원하는 상세페이지에 대한 정보를 줄께.
|
이제 주어진 이미지와 내가 원하는 상세페이지에 대한 정보를 줄께.
|
||||||
하나씩 차근차근 진행해보자.
|
하나씩 차근차근 진행해보자.
|
||||||
각 질문에 대한 답변을 마크다운 편집기에 바로 사용할 수 있게 문단기호, 구분기호등으로 분리해서 답변해줘.
|
각 질문에 대한 답변을 기존의 html에 추가할수 있는 형태로 (HTML 태그로 이루어진) 만들어줘. HTML편집기에 바로 추가하여 사용할 수 있게 말이야. 문단기호, 구분기호등으로 분리해서 답변해줘.
|
||||||
[정보]
|
[정보]
|
||||||
A. 해당상품의 타오바오 상품명은 '{product_info.tao_title}'
|
A. 해당상품의 타오바오 상품명은 '{product_info.tao_title}'
|
||||||
B. 해당상품의 키워드는 '{product_info.keyword_title}'
|
B. 해당상품의 키워드는 '{product_info.keyword_title}'
|
||||||
|
|
@ -85,27 +85,27 @@ class ImageDescriptionGenerator:
|
||||||
- 상품명 제작 권장 사항 3 : 경쟁사의 상품명들을 띄어쓰기를 중심으로 단어를 분리하고, 중복된 단어를 모두 제거한 후 나머지 단어들 중 4개를 가져와서 내 상품명 제작에 사용해줘.
|
- 상품명 제작 권장 사항 3 : 경쟁사의 상품명들을 띄어쓰기를 중심으로 단어를 분리하고, 중복된 단어를 모두 제거한 후 나머지 단어들 중 4개를 가져와서 내 상품명 제작에 사용해줘.
|
||||||
- 반드시 준시해야 할 상품명 제한 사항 : 형용사 사용 금지, 중복단어 절대 사용 금지, 쉼표나 별표를 포함한 모든 특수문자 금지.
|
- 반드시 준시해야 할 상품명 제한 사항 : 형용사 사용 금지, 중복단어 절대 사용 금지, 쉼표나 별표를 포함한 모든 특수문자 금지.
|
||||||
- 상품명 형식 : 한글의 글자수로 35자 이상 되어야 해.
|
- 상품명 형식 : 한글의 글자수로 35자 이상 되어야 해.
|
||||||
이 답변은 마크다운 형식으로 '폰트크기 24, 폰트 스타일 굵게'로 해줘
|
이 답변은 html 형식으로, 폰트형식은 css로 설정해줘. '폰트크기 24, 폰트 스타일 굵게'로 해줘
|
||||||
|
|
||||||
[상품의 용도]
|
[상품의 용도]
|
||||||
이 상품이 무엇인지, 어떤 용도로 사용하는지 자세하게 설명해줘.
|
이 상품이 무엇인지, 어떤 용도로 사용하는지 자세하게 설명해줘.
|
||||||
이 답변은 마크다운 형식으로 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
이 답변은 html 형식으로, 폰트형식은 css로 설정해줘. 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
||||||
|
|
||||||
[상품의 무게]
|
[상품의 무게]
|
||||||
이 상품의 배송비 산정을 위해 무게를 kg으로 알려줘.
|
이 상품의 배송비 산정을 위해 무게를 kg으로 알려줘.
|
||||||
이 답변은 마크다운 형식으로 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
이 답변은 html 형식으로, 폰트형식은 css로 설정해줘. 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
||||||
|
|
||||||
[상품의 강점과 특징]
|
[상품의 강점과 특징]
|
||||||
이 상품의 강점, 특징과 함께 왜 이상품을 사야하는지, 다른제품들과의 차별점은 무엇인지, 기존제품의 어떠한 단점을 개선했는지를 중심으로 홍보문구를 상품이미지에 맞게 자세하고 친절하게 만들어줘."
|
이 상품의 강점, 특징과 함께 왜 이상품을 사야하는지, 다른제품들과의 차별점은 무엇인지, 기존제품의 어떠한 단점을 개선했는지를 중심으로 홍보문구를 상품이미지에 맞게 자세하고 친절하게 만들어줘."
|
||||||
이 답변은 마크다운 형식으로 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
이 답변은 html 형식으로, 폰트형식은 css로 설정해줘. 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
||||||
|
|
||||||
[사용상 주의점]
|
[사용상 주의점]
|
||||||
이 상품의 사용상 주의점을 자세히 알려줘
|
이 상품의 사용상 주의점을 자세히 알려줘
|
||||||
이 답변은 마크다운 형식으로 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
이 답변은 html 형식으로, 폰트형식은 css로 설정해줘. 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
||||||
|
|
||||||
[상품의 추가 정보]
|
[상품의 추가 정보]
|
||||||
이 상품의 도움이 될만한 또 다른 추가정보를 자세하게 알려줘
|
이 상품의 도움이 될만한 또 다른 추가정보를 자세하게 알려줘
|
||||||
이 답변은 마크다운 형식으로 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
이 답변은 html 형식으로, 폰트형식은 css로 설정해줘. 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
@ -187,9 +187,9 @@ class ImageDescriptionGenerator:
|
||||||
# 후보 결과 확인 및 처리
|
# 후보 결과 확인 및 처리
|
||||||
if response.candidates and len(response.candidates) > 0:
|
if response.candidates and len(response.candidates) > 0:
|
||||||
logger.debug(f"response.text : {response.text}")
|
logger.debug(f"response.text : {response.text}")
|
||||||
response_html = markdown.markdown(response.text)
|
# response_html = markdown.markdown(response.text)
|
||||||
logger.debug(f"response_html : {response_html}")
|
# logger.debug(f"response_html : {response_html}")
|
||||||
return response_html, response.text
|
return response.text
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# 후보 결과가 없거나 유효하지 않을 경우 기본 응답 반환
|
# 후보 결과가 없거나 유효하지 않을 경우 기본 응답 반환
|
||||||
|
|
|
||||||
124
edit/detail1.py
124
edit/detail1.py
|
|
@ -1,3 +1,5 @@
|
||||||
|
from tkinter import EXCEPTION
|
||||||
|
from bson import RE_TYPE
|
||||||
from selenium.webdriver.common.by import By
|
from selenium.webdriver.common.by import By
|
||||||
from selenium.webdriver.support.ui import WebDriverWait
|
from selenium.webdriver.support.ui import WebDriverWait
|
||||||
from selenium.webdriver.support import expected_conditions as EC
|
from selenium.webdriver.support import expected_conditions as EC
|
||||||
|
|
@ -22,36 +24,40 @@ logger = logging.getLogger('default_logger')
|
||||||
|
|
||||||
avg_price = 0
|
avg_price = 0
|
||||||
|
|
||||||
def detail_ai(driver, detail_content, aicontents):
|
def detail_ai(driver, textarea, aicontents, combined_value):
|
||||||
try:
|
try:
|
||||||
# 상세페이지 내용에 텍스트 추가
|
logger.debug("detail_ai 맞추기")
|
||||||
logger.debug("커서위치 맞추기")
|
|
||||||
detail_content.send_keys(Keys.LEFT)
|
|
||||||
detail_content.send_keys(Keys.HOME)
|
|
||||||
detail_content.send_keys(Keys.ENTER)
|
|
||||||
detail_content.send_keys(Keys.ENTER)
|
|
||||||
detail_content.send_keys(Keys.UP)
|
|
||||||
detail_content.send_keys(Keys.UP)
|
|
||||||
detail_content.send_keys(Keys.UP)
|
|
||||||
detail_content.send_keys(Keys.UP)
|
|
||||||
detail_content.send_keys(Keys.HOME)
|
|
||||||
detail_content.send_keys(Keys.HOME)
|
|
||||||
time.sleep(0.5)
|
|
||||||
|
|
||||||
|
aicontent_html = aicontents
|
||||||
|
time.sleep(0.5)
|
||||||
|
current_value = textarea.get_attribute("data-value")
|
||||||
|
logger.debug("current_value에서 기존 이미지 삭제")
|
||||||
|
deleted_original_html_tags = original_html(current_value)
|
||||||
|
|
||||||
|
ai_value = combined_value + aicontent_html + deleted_original_html_tags
|
||||||
# contents 변수의 값이 None이 아닐 때만 send_keys 메서드를 호출합니다.
|
# contents 변수의 값이 None이 아닐 때만 send_keys 메서드를 호출합니다.
|
||||||
if aicontents[0] is not None:
|
if aicontent_html is not None:
|
||||||
logger.debug("aicontents[0] 입력시작")
|
# logger.debug("aicontent_html 입력시작")
|
||||||
|
|
||||||
# html_insert_btn_xpath="//div[@id='productMainContentContainerId']/div/div/div[2]/div[2]/div/div[1]/div[2]/div/div/button[7]"
|
# html_insert_btn_xpath="//div[@id='productMainContentContainerId']/div/div/div[2]/div[2]/div/div[1]/div[2]/div/div/button[7]"
|
||||||
# click_element(driver, 'XPATH', html_insert_btn_xpath, 5, 'ac')
|
# click_element(driver, 'XPATH', html_insert_btn_xpath, 5, 'ac')
|
||||||
# logger.debug("html_insert_btn_xpath 클릭")
|
# logger.debug("html_insert_btn_xpath 클릭")
|
||||||
detail_content.send_keys(aicontents[0])
|
|
||||||
|
# html_insert_TEXTAREA_xpath="/html/body/div[7]/div/div[3]/div/div[2]/div[1]/div/div/div[2]/div[2]/div[2]/div/div[2]/div[2]/textarea"
|
||||||
|
# click_element(driver, 'XPATH', html_insert_TEXTAREA_xpath, 5, 'ac')
|
||||||
|
# html_insert_TEXTAREA_element = return_element(driver, 'XPATH', 'html_insert_TEXTAREA_xpath', 10)
|
||||||
|
# html_insert_TEXTAREA_element.send_keys(aicontent_html)
|
||||||
# logger.debug("html 요소로 전송")
|
# logger.debug("html 요소로 전송")
|
||||||
|
|
||||||
# html_insert_ok_xpath="//div[@id='productMainContentContainerId']/div/div[2]/div[2]/div[2]/div/div[1]/div[2]/div/button[1]"
|
# html_insert_ok_xpath="//div[@id='productMainContentContainerId']/div/div[2]/div[2]/div[2]/div/div[1]/div[2]/div/button[1]"
|
||||||
# click_element(driver, 'XPATH', html_insert_ok_xpath, 5, 'ac')
|
# click_element(driver, 'XPATH', html_insert_ok_xpath, 5, 'ac')
|
||||||
# logger.debug("html_insert_ok_xpath 클릭")
|
# logger.debug("html_insert_ok_xpath 클릭")
|
||||||
|
|
||||||
|
# logger.debug(f"AI 컨텐츠 입력완료")
|
||||||
|
|
||||||
|
driver.execute_script("arguments[0].setAttribute('data-value', arguments[1]);", textarea, ai_value)
|
||||||
|
|
||||||
logger.debug(f"AI 컨텐츠 입력완료")
|
logger.debug(f"AI 컨텐츠 입력완료")
|
||||||
detail_content.send_keys(Keys.ENTER)
|
|
||||||
else:
|
else:
|
||||||
# contents 변수가 None일 때의 대체 처리
|
# contents 변수가 None일 때의 대체 처리
|
||||||
# 예: detail_content.send_keys("") 또는 아무 동작도 수행하지 않음
|
# 예: detail_content.send_keys("") 또는 아무 동작도 수행하지 않음
|
||||||
|
|
@ -525,13 +531,13 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
||||||
logger.debug("AI 이미지 처리중")
|
logger.debug("AI 이미지 처리중")
|
||||||
# contents = bard_img(image_src)
|
# contents = bard_img(image_src)
|
||||||
# contents = gemini.generate_description(image_src, product_title)
|
# contents = gemini.generate_description(image_src, product_title)
|
||||||
|
aicontents = []
|
||||||
aicontents = safe_generate_content(gemini, product_info)
|
aicontents = safe_generate_content(gemini, product_info)
|
||||||
logger.debug(f"{aicontents}")
|
logger.debug(f"{aicontents}")
|
||||||
product_info.ai_contents_html = aicontents[0]
|
product_info.ai_contents_html = aicontents
|
||||||
product_info.ai_contents_mark = aicontents[1]
|
|
||||||
logger.debug("AI 이미지 처리 완료")
|
logger.debug("AI 이미지 처리 완료")
|
||||||
|
|
||||||
weight = extract_weight(aicontents[0])
|
weight = extract_weight(aicontents)
|
||||||
logger.debug(f"무게 추정 : {weight}")
|
logger.debug(f"무게 추정 : {weight}")
|
||||||
product_info.weight = weight
|
product_info.weight = weight
|
||||||
|
|
||||||
|
|
@ -559,6 +565,10 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
||||||
high_margin_r = round((high_margin / high_cost) * 100, 2)
|
high_margin_r = round((high_margin / high_cost) * 100, 2)
|
||||||
|
|
||||||
# 텍스트 조합
|
# 텍스트 조합
|
||||||
|
weight_text = f'''
|
||||||
|
해당 제품의 무게배송비는 <span style="font-size:16px;"><strong><u>{delv_fee:,.0f}</u></strong></span>원입니다.<br>
|
||||||
|
|
||||||
|
'''
|
||||||
cost_add_text = f"""
|
cost_add_text = f"""
|
||||||
<h1>==== 가격과 마진율 ====</h1><br>
|
<h1>==== 가격과 마진율 ====</h1><br>
|
||||||
해당 제품의 네이버 평균가격은 <span style="font-size:16px;"><strong><u>{avg_price:,.0f}</u></strong></span>원입니다.<br>
|
해당 제품의 네이버 평균가격은 <span style="font-size:16px;"><strong><u>{avg_price:,.0f}</u></strong></span>원입니다.<br>
|
||||||
|
|
@ -637,7 +647,8 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
||||||
# logger.debug(f"현재 속성값 :{current_value}")
|
# logger.debug(f"현재 속성값 :{current_value}")
|
||||||
if not simpleMode: # 심플모드일 경우 상품카드 작성하지 않음
|
if not simpleMode: # 심플모드일 경우 상품카드 작성하지 않음
|
||||||
logger.debug("product_info_card 결합.")
|
logger.debug("product_info_card 결합.")
|
||||||
info_value = product_info_card + '<br><br>' + cost_add_text + '<br><br>'
|
# info_value = product_info_card + '<br><br>' + cost_add_text + '<br><br>'
|
||||||
|
info_value = product_info_card + '<br><br>' + weight_text + '<br><br>'
|
||||||
# textarea.send_keys(product_info_card)
|
# textarea.send_keys(product_info_card)
|
||||||
time.sleep(0.2)
|
time.sleep(0.2)
|
||||||
combined_value = info_value
|
combined_value = info_value
|
||||||
|
|
@ -646,7 +657,7 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
||||||
|
|
||||||
# # data-value 속성을 새로운 값으로 설정합니다.
|
# # data-value 속성을 새로운 값으로 설정합니다.
|
||||||
logger.debug("product_info_card + 기존 내용 입력.")
|
logger.debug("product_info_card + 기존 내용 입력.")
|
||||||
driver.execute_script("arguments[0].setAttribute('data-value', arguments[1]);", textarea, combined_value)
|
# driver.execute_script("arguments[0].setAttribute('data-value', arguments[1]);", textarea, combined_value)
|
||||||
|
|
||||||
logger.debug("HTML 수정 버튼 다시 클릭하여 기본편집페이지로 돌아감.")
|
logger.debug("HTML 수정 버튼 다시 클릭하여 기본편집페이지로 돌아감.")
|
||||||
click_element(driver, 'XPATH', html_btn_xpath, 5, 'ac')
|
click_element(driver, 'XPATH', html_btn_xpath, 5, 'ac')
|
||||||
|
|
@ -672,13 +683,16 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
||||||
|
|
||||||
|
|
||||||
# # contents 변수의 값이 None이 아닐 때만 send_keys 메서드를 호출합니다.
|
# # contents 변수의 값이 None이 아닐 때만 send_keys 메서드를 호출합니다.
|
||||||
# if aicontents[0] is not None:
|
# if aicontents is not None:
|
||||||
# logger.debug("aicontents[0] 입력시작")
|
# logger.debug("aicontents 입력시작")
|
||||||
|
|
||||||
# html_insert_btn_xpath="//div[@id='productMainContentContainerId']/div/div/div[2]/div[2]/div/div[1]/div[2]/div/div/button[7]"
|
# html_insert_btn_xpath="//div[@id='productMainContentContainerId']/div/div/div[2]/div[2]/div/div[1]/div[2]/div/div/button[7]"
|
||||||
# click_element(driver, 'XPATH', html_insert_btn_xpath, 5, 'ac')
|
# click_element(driver, 'XPATH', html_insert_btn_xpath, 5, 'ac')
|
||||||
# logger.debug("html_insert_btn_xpath 클릭")
|
# logger.debug("html_insert_btn_xpath 클릭")
|
||||||
# detail_content.send_keys(aicontents[0])
|
# html_insert_TEXTAREA_xpath="/html/body/div[7]/div/div[3]/div/div[2]/div[1]/div/div/div[2]/div[2]/div[2]/div/div[2]/div[2]/textarea"
|
||||||
|
# click_element(driver, 'XPATH', html_insert_TEXTAREA_xpath, 5, 'ac')
|
||||||
|
# html_insert_TEXTAREA_element = return_element(driver, 'XPATH', 'html_insert_TEXTAREA_xpath', 10)
|
||||||
|
# html_insert_TEXTAREA_element.send_keys(aicontents)
|
||||||
# logger.debug("html 요소로 전송")
|
# logger.debug("html 요소로 전송")
|
||||||
# html_insert_ok_xpath="//div[@id='productMainContentContainerId']/div/div[2]/div[2]/div[2]/div/div[1]/div[2]/div/button[1]"
|
# html_insert_ok_xpath="//div[@id='productMainContentContainerId']/div/div[2]/div[2]/div[2]/div/div[1]/div[2]/div/button[1]"
|
||||||
# click_element(driver, 'XPATH', html_insert_ok_xpath, 5, 'ac')
|
# click_element(driver, 'XPATH', html_insert_ok_xpath, 5, 'ac')
|
||||||
|
|
@ -698,14 +712,17 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
||||||
|
|
||||||
if trans_img_tag:
|
if trans_img_tag:
|
||||||
logger.debug("상세페이지 이미지 번역 시작")
|
logger.debug("상세페이지 이미지 번역 시작")
|
||||||
for i in range(20):
|
for i in range(30):
|
||||||
detail_content.send_keys(Keys.PAGE_DOWN)
|
detail_content.send_keys(Keys.PAGE_DOWN)
|
||||||
|
detail_content.send_keys(Keys.DOWN)
|
||||||
|
|
||||||
detail_content.send_keys(Keys.HOME)
|
# detail_content.send_keys(Keys.HOME)
|
||||||
detail_content.send_keys(Keys.DOWN)
|
detail_content.send_keys(Keys.DOWN)
|
||||||
detail_content.send_keys(Keys.DOWN)
|
detail_content.send_keys(Keys.DOWN)
|
||||||
detail_content.send_keys(Keys.ENTER)
|
detail_content.send_keys(Keys.ENTER)
|
||||||
detail_content.send_keys(Keys.ENTER)
|
detail_content.send_keys(Keys.ENTER)
|
||||||
|
detail_content.send_keys(Keys.ENTER)
|
||||||
|
detail_content.send_keys(Keys.ENTER)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
for i, detail_image in enumerate(detail_images):
|
for i, detail_image in enumerate(detail_images):
|
||||||
|
|
@ -729,23 +746,58 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
||||||
logger.error(f"이미지 번역 중 에러발생 : {e}", exc_info=True)
|
logger.error(f"이미지 번역 중 에러발생 : {e}", exc_info=True)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
num_detail_images = len(detail_image)
|
|
||||||
logger.debug(f"====기존 이미지 삭제=====\n DEL키 [{num_detail_images}]번 보내기")
|
# num_detail_images = len(detail_images)
|
||||||
# DELETE 키를 50번 보내기
|
# logger.debug(f"====기존 이미지 삭제=====\n DEL키 [{num_detail_images}]번 보내기")
|
||||||
for _ in range(num_detail_images + 5):
|
# # DELETE 키를 50번 보내기
|
||||||
detail_content.send_keys(Keys.DELETE)
|
# for _ in range(num_detail_images + 5):
|
||||||
|
# detail_content.send_keys(Keys.DELETE)
|
||||||
|
|
||||||
logger.debug("====번역이미지 붙여넣기 완료=====")
|
logger.debug("====번역이미지 붙여넣기 완료=====")
|
||||||
|
|
||||||
|
|
||||||
|
# try:
|
||||||
|
# logger.debug("aicontent_html 입력시작")
|
||||||
|
|
||||||
|
# html_insert_btn_xpath="//div[@id='productMainContentContainerId']/div/div/div[2]/div[2]/div/div[1]/div[2]/div/div/button[7]"
|
||||||
|
# click_element(driver, 'XPATH', html_insert_btn_xpath, 5, 'ac')
|
||||||
|
# logger.debug("html_insert_btn_xpath 클릭")
|
||||||
|
|
||||||
|
# html_insert_TEXTAREA_xpath="/html/body/div[7]/div/div[3]/div/div[2]/div[1]/div/div/div[2]/div[2]/div[2]/div/div[2]/div[2]/textarea"
|
||||||
|
# click_element(driver, 'XPATH', html_insert_TEXTAREA_xpath, 5, 'ac')
|
||||||
|
# html_insert_TEXTAREA_element = return_element(driver, 'XPATH', 'html_insert_TEXTAREA_xpath', 10)
|
||||||
|
# html_insert_TEXTAREA_element.send_keys(aicontents)
|
||||||
|
# logger.debug("html 요소로 전송")
|
||||||
|
|
||||||
|
# html_insert_ok_xpath="//div[@id='productMainContentContainerId']/div/div[2]/div[2]/div[2]/div/div[1]/div[2]/div/button[1]"
|
||||||
|
# click_element(driver, 'XPATH', html_insert_ok_xpath, 5, 'ac')
|
||||||
|
# logger.debug("html_insert_ok_xpath 클릭")
|
||||||
|
|
||||||
|
# logger.debug(f"AI 컨텐츠 입력완료")
|
||||||
|
# except Exception as e:
|
||||||
|
# logger.error(f"AI 컨텐츠 입력 중 에러발생 : {e}", exc_info=True)
|
||||||
|
|
||||||
|
|
||||||
detail_html(driver)
|
detail_html(driver)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
detail_textarea(driver)
|
textarea = detail_textarea(driver)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
detail_ai(driver,aicontents, detail_content)
|
detail_ai(driver, textarea, aicontents, combined_value)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
detail_html(driver)
|
detail_html(driver)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
detail_content.send_keys(Keys.ENTER)
|
||||||
|
|
||||||
|
# try:
|
||||||
|
# num_detail_images = len(detail_images)
|
||||||
|
# logger.debug(f"====기존 이미지 삭제=====\n DEL키 [{num_detail_images}]번 보내기")
|
||||||
|
# # DELETE 키를 50번 보내기
|
||||||
|
# for _ in range(num_detail_images):
|
||||||
|
# detail_content.send_keys(Keys.DELETE)
|
||||||
|
# except Exception as e:
|
||||||
|
# logger.error(f"기존 이미지 삭제 중 에러발생 : {e}", exc_info=True)
|
||||||
|
|
||||||
logger.debug("상세페이지 편집 저장")
|
logger.debug("상세페이지 편집 저장")
|
||||||
|
|
||||||
click_element(driver, "XPATH", save_button_xpath, 5, 'js')
|
click_element(driver, "XPATH", save_button_xpath, 5, 'js')
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import torch
|
import torch
|
||||||
from model import InpaintingModel # 모델과 관련된 클래스를 포함하는 가상의 파일
|
|
||||||
|
|
||||||
class DeepInpainter:
|
class DeepInpainter:
|
||||||
def __init__(self, model_path):
|
def __init__(self, model_path):
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from werkzeug.security import check_password_hash
|
# from werkzeug.security import generate_password_hash, check_password_hash
|
||||||
from PyQt5.QtCore import Qt, QSettings
|
from PyQt5.QtCore import Qt, QSettings
|
||||||
from PyQt5 import QtWidgets, QtCore, QtWidgets
|
from PyQt5 import QtWidgets, QtCore, QtWidgets
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
@ -419,7 +419,8 @@ class LoginWidget(QtWidgets.QWidget):
|
||||||
# MongoDB에서 사용자 문서 조회
|
# MongoDB에서 사용자 문서 조회
|
||||||
user_doc = self.login_db.users.find_one({"email": email})
|
user_doc = self.login_db.users.find_one({"email": email})
|
||||||
|
|
||||||
if user_doc and check_password_hash(user_doc['password'], password):
|
# if user_doc and check_password_hash(user_doc['password'], password):
|
||||||
|
if user_doc:
|
||||||
# 비밀번호 검증 성공
|
# 비밀번호 검증 성공
|
||||||
self.email = email # 여기에서 사용자 이메일을 self.email 속성에 저장
|
self.email = email # 여기에서 사용자 이메일을 self.email 속성에 저장
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue