This commit is contained in:
Envy_PC 2024-04-24 14:11:12 +09:00
parent 60bd86a898
commit 4914cabaec
5 changed files with 102 additions and 49 deletions

1
.gitignore vendored
View File

@ -4,6 +4,7 @@ Scripts/
build/
dist/
Include/
imgtrans_test/
__pycache__/
*.log
*.log.*

View File

@ -60,7 +60,7 @@ class ImageDescriptionGenerator:
너는 온라인 쇼핑몰 상세페이지 제작 전문가야. 니가 만든 상품페이지는 모두를 감동시키고, 구매로 이어지는 마법같은 능력이 있어.
이제 주어진 이미지와 내가 원하는 상세페이지에 대한 정보를 줄께.
하나씩 차근차근 진행해보자.
질문에 대한 답변을 마크다운 편집기에 바로 사용할 있게 문단기호, 구분기호등으로 분리해서 답변해줘.
질문에 대한 답변을 기존의 html에 추가할수 있는 형태로 (HTML 태그로 이루어진) 만들어줘. HTML편집기에 바로 추가하여 사용할 있게 말이야. 문단기호, 구분기호등으로 분리해서 답변해줘.
[정보]
A. 해당상품의 타오바오 상품명은 '{product_info.tao_title}'
B. 해당상품의 키워드는 '{product_info.keyword_title}'
@ -85,27 +85,27 @@ class ImageDescriptionGenerator:
- 상품명 제작 권장 사항 3 : 경쟁사의 상품명들을 띄어쓰기를 중심으로 단어를 분리하고, 중복된 단어를 모두 제거한 나머지 단어들 4개를 가져와서 상품명 제작에 사용해줘.
- 반드시 준시해야 상품명 제한 사항 : 형용사 사용 금지, 중복단어 절대 사용 금지, 쉼표나 별표를 포함한 모든 특수문자 금지.
- 상품명 형식 : 한글의 글자수로 35 이상 되어야 .
답변은 마크다운 형식으로 '폰트크기 24, 폰트 스타일 굵게' 해줘
답변은 html 형식으로, 폰트형식은 css로 설정해줘. '폰트크기 24, 폰트 스타일 굵게' 해줘
[상품의 용도]
상품이 무엇인지, 어떤 용도로 사용하는지 자세하게 설명해줘.
답변은 마크다운 형식으로 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
답변은 html 형식으로, 폰트형식은 css로 설정해줘. 제목을 '폰트크기 20, 폰트 스타일 굵게', 내용은 '폰트크기 16, 들여쓰기'로해줘
[상품의 무게]
상품의 배송비 산정을 위해 무게를 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:
logger.debug(f"response.text : {response.text}")
response_html = markdown.markdown(response.text)
logger.debug(f"response_html : {response_html}")
return response_html, response.text
# response_html = markdown.markdown(response.text)
# logger.debug(f"response_html : {response_html}")
return response.text
else:
# 후보 결과가 없거나 유효하지 않을 경우 기본 응답 반환

View File

@ -1,3 +1,5 @@
from tkinter import EXCEPTION
from bson import RE_TYPE
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
@ -22,36 +24,40 @@ logger = logging.getLogger('default_logger')
avg_price = 0
def detail_ai(driver, detail_content, aicontents):
def detail_ai(driver, textarea, aicontents, combined_value):
try:
# 상세페이지 내용에 텍스트 추가
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)
logger.debug("detail_ai 맞추기")
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 메서드를 호출합니다.
if aicontents[0] is not None:
logger.debug("aicontents[0] 입력시작")
if aicontent_html is not None:
# 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 클릭")
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 요소로 전송")
# 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 컨텐츠 입력완료")
driver.execute_script("arguments[0].setAttribute('data-value', arguments[1]);", textarea, ai_value)
logger.debug(f"AI 컨텐츠 입력완료")
detail_content.send_keys(Keys.ENTER)
else:
# contents 변수가 None일 때의 대체 처리
# 예: detail_content.send_keys("") 또는 아무 동작도 수행하지 않음
@ -525,13 +531,13 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
logger.debug("AI 이미지 처리중")
# contents = bard_img(image_src)
# contents = gemini.generate_description(image_src, product_title)
aicontents = []
aicontents = safe_generate_content(gemini, product_info)
logger.debug(f"{aicontents}")
product_info.ai_contents_html = aicontents[0]
product_info.ai_contents_mark = aicontents[1]
product_info.ai_contents_html = aicontents
logger.debug("AI 이미지 처리 완료")
weight = extract_weight(aicontents[0])
weight = extract_weight(aicontents)
logger.debug(f"무게 추정 : {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)
# 텍스트 조합
weight_text = f'''
해당 제품의 무게배송비는 <span style="font-size:16px;"><strong><u>{delv_fee:,.0f}</u></strong></span>원입니다.<br>
'''
cost_add_text = f"""
<h1>==== 가격과 마진율 ====</h1><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}")
if not simpleMode: # 심플모드일 경우 상품카드 작성하지 않음
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)
time.sleep(0.2)
combined_value = info_value
@ -646,7 +657,7 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
# # data-value 속성을 새로운 값으로 설정합니다.
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 수정 버튼 다시 클릭하여 기본편집페이지로 돌아감.")
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 메서드를 호출합니다.
# if aicontents[0] is not None:
# logger.debug("aicontents[0] 입력시작")
# if aicontents is not None:
# 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]"
# click_element(driver, 'XPATH', html_insert_btn_xpath, 5, 'ac')
# 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 요소로 전송")
# 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')
@ -698,14 +712,17 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
if trans_img_tag:
logger.debug("상세페이지 이미지 번역 시작")
for i in range(20):
for i in range(30):
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.ENTER)
detail_content.send_keys(Keys.ENTER)
detail_content.send_keys(Keys.ENTER)
detail_content.send_keys(Keys.ENTER)
try:
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)
finally:
num_detail_images = len(detail_image)
logger.debug(f"====기존 이미지 삭제=====\n DEL키 [{num_detail_images}]번 보내기")
# DELETE 키를 50번 보내기
for _ in range(num_detail_images + 5):
detail_content.send_keys(Keys.DELETE)
# num_detail_images = len(detail_images)
# logger.debug(f"====기존 이미지 삭제=====\n DEL키 [{num_detail_images}]번 보내기")
# # DELETE 키를 50번 보내기
# for _ in range(num_detail_images + 5):
# detail_content.send_keys(Keys.DELETE)
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)
time.sleep(0.5)
detail_textarea(driver)
textarea = detail_textarea(driver)
time.sleep(0.5)
detail_ai(driver,aicontents, detail_content)
detail_ai(driver, textarea, aicontents, combined_value)
time.sleep(0.5)
detail_html(driver)
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("상세페이지 편집 저장")
click_element(driver, "XPATH", save_button_xpath, 5, 'js')

View File

@ -1,5 +1,4 @@
import torch
from model import InpaintingModel # 모델과 관련된 클래스를 포함하는 가상의 파일
class DeepInpainter:
def __init__(self, model_path):

View File

@ -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 import QtWidgets, QtCore, QtWidgets
from datetime import datetime
@ -419,7 +419,8 @@ class LoginWidget(QtWidgets.QWidget):
# MongoDB에서 사용자 문서 조회
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 속성에 저장