forked from ckh08045/AutoPercenty
html fetch 중 이미지URL 순서 유지
This commit is contained in:
parent
546de5fb5f
commit
5e3ac7e812
211
edit/detail1.py
211
edit/detail1.py
|
|
@ -22,6 +22,27 @@ logger = logging.getLogger('default_logger')
|
|||
|
||||
avg_price = 0
|
||||
|
||||
def detail_textarea(driver):
|
||||
try:
|
||||
# textarea_css = "ck-source-editing-area"
|
||||
# click_element(driver, 'CSS_SELECTOR', textarea_css, 10, 'js')
|
||||
textarea = WebDriverWait(driver, 5).until(
|
||||
EC.presence_of_element_located((By.CLASS_NAME, "ck-source-editing-area"))
|
||||
)
|
||||
logger.debug("textarea버튼을 성공적으로 찾았습니다.")
|
||||
time.sleep(0.2)
|
||||
actions = ActionChains(driver)
|
||||
actions.move_to_element(textarea).perform() # 요소로 스크롤
|
||||
logger.debug("'textarea' 요소로 스크롤 실행")
|
||||
time.sleep(0.2)
|
||||
actions.click(textarea).perform()
|
||||
logger.debug("'textarea' 요소 클릭 실행")
|
||||
|
||||
return textarea
|
||||
# textarea.click()
|
||||
except Exception as e:
|
||||
logger.debug(f"textarea버튼 요소를 찾을 수 없습니다. : {e}", exc_info=True)
|
||||
|
||||
|
||||
def paste_image_in_editor(driver, editor_element):
|
||||
action = ActionChains(driver)
|
||||
|
|
@ -48,7 +69,7 @@ def image_to_clipboard(image):
|
|||
|
||||
def fetch_image_urls(html_content):
|
||||
"""
|
||||
HTML 콘텐츠에서 모든 <img> 태그의 URL을 추출합니다.
|
||||
HTML 콘텐츠에서 모든 <img> 태그의 URL을 "순서대로" 추출합니다.
|
||||
이 함수는 class="image_resized"를 가진 <img> 태그와
|
||||
<figure class="image"> 내부의 <img> 태그 모두를 포함합니다.
|
||||
"""
|
||||
|
|
@ -58,21 +79,18 @@ def fetch_image_urls(html_content):
|
|||
# class="image_resized"를 가진 모든 <img> 태그 찾기
|
||||
images_resized = soup.find_all('img', class_='image_resized')
|
||||
for img in images_resized:
|
||||
if img and 'src' in img.attrs:
|
||||
if img and 'src' in img.attrs and img['src'] not in image_urls:
|
||||
image_urls.append(img['src'])
|
||||
|
||||
# <figure class="image"> 내부의 모든 <img> 태그 찾기
|
||||
figures = soup.find_all('figure', class_='image')
|
||||
for figure in figures:
|
||||
img_tag = figure.find('img')
|
||||
if img_tag and 'src' in img_tag.attrs:
|
||||
if img_tag and 'src' in img_tag.attrs and img_tag['src'] not in image_urls:
|
||||
image_urls.append(img_tag['src'])
|
||||
|
||||
# 중복 제거
|
||||
image_urls = list(set(image_urls))
|
||||
return image_urls
|
||||
|
||||
|
||||
def safe_generate_content(gemini, product_info, max_retries=3, initial_wait=1):
|
||||
retry_count = 0
|
||||
wait_time = initial_wait
|
||||
|
|
@ -549,110 +567,35 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
|||
try:
|
||||
# # data-value 속성 값을 가져옵니다.
|
||||
current_value = textarea.get_attribute("data-value")
|
||||
original_html_tags = original_html(current_value)
|
||||
|
||||
detail_images = fetch_image_urls(original_html_tags)
|
||||
product_info.detail_image_urls = detail_images
|
||||
|
||||
# logger.debug(f"현재 속성값 :{current_value}")
|
||||
product_info.current_value = original_html_tags
|
||||
|
||||
product_info.current_value = current_value
|
||||
logger.debug("현재 속성값 수집 완료")
|
||||
# original_html_tags = original_html(current_value)
|
||||
|
||||
detail_images = fetch_image_urls(current_value)
|
||||
product_info.detail_image_urls = detail_images
|
||||
logger.debug(f"원본 이미지 URLs [{len(detail_images)}]개 수집 완료")
|
||||
logger.debug(f"detail_images List : {detail_images}")
|
||||
# logger.debug(f"현재 속성값 :{current_value}")
|
||||
|
||||
logger.debug("product_info_card 결합.")
|
||||
info_value = product_info_card + '<br><br>' + cost_add_text + '<br><br>'
|
||||
# textarea.send_keys(product_info_card)
|
||||
time.sleep(0.2)
|
||||
combined_value = info_value
|
||||
|
||||
# logger.debug("product_info_card 결합.")
|
||||
# new_value = product_info_card +'<br><br>' + cost_add_text +'<br><br>' +original_html_tags
|
||||
# # textarea.send_keys(product_info_card)
|
||||
# time.sleep(0.2)
|
||||
logger.debug(f"{combined_value}")
|
||||
|
||||
# logger.debug("결합.")
|
||||
# # 결합된 값을 다시 textarea에 설정
|
||||
# # # data-value 속성을 새로운 값으로 설정합니다.
|
||||
# driver.execute_script("arguments[0].setAttribute('data-value', arguments[1]);", textarea, new_value)
|
||||
|
||||
# # driver.execute_script("arguments[0].innerHTML = arguments[1]", textarea, new_value)
|
||||
# # driver.execute_script("arguments[0].innerHTML = arguments[1]", detail_content, new_value);
|
||||
# # data-value 속성을 새로운 값으로 설정합니다.
|
||||
logger.debug("product_info_card + 기존 내용 입력.")
|
||||
driver.execute_script("arguments[0].setAttribute('data-value', arguments[1]);", textarea, combined_value)
|
||||
|
||||
# # JavaScript를 사용하여 textarea 값 설정
|
||||
# script = "arguments[0].value = arguments[1];"
|
||||
# driver.execute_script(script, textarea, new_value)
|
||||
#time.sleep(0.5)
|
||||
#logger.debug("새로운 값이 성공적으로 설정됨.")
|
||||
|
||||
#time.sleep(0.2)
|
||||
|
||||
# textarea.send_keys(Keys.ENTER)
|
||||
# textarea.send_keys(Keys.ENTER)
|
||||
# logger.debug("엔터키 전송.")
|
||||
|
||||
#click_element(driver, 'XPATH', save_button_xpath, 5, 'js')
|
||||
#time.sleep(0.2)
|
||||
#logger.debug("저장버튼 전송.")
|
||||
|
||||
# html_btn.click()
|
||||
logger.debug("HTML 수정 버튼 다시 클릭하여 기본편집페이지로 돌아감.")
|
||||
click_element(driver, 'XPATH', html_btn_xpath, 5, 'js')
|
||||
click_element(driver, 'XPATH', html_btn_xpath, 5, 'ac')
|
||||
|
||||
time.sleep(0.2)
|
||||
except Exception as e:
|
||||
logger.debug(f"HTML 전환 수정 중 에러발생 : {e}", exc_info=True)
|
||||
logger.debug(f"product_info_card 수정 중 에러발생 : {e}", exc_info=True)
|
||||
|
||||
|
||||
trans_img_tag = login_info["whether_modifyImageTanslation"]
|
||||
logger.debug(f"whether_modifyImageTanslation : {trans_img_tag}")
|
||||
|
||||
if trans_img_tag:
|
||||
logger.debug("상세페이지 이미지 번역 시작")
|
||||
|
||||
logger.debug("HTML 수정 버튼을 클릭하여 원본 URL 수집 및 삭제")
|
||||
click_element(driver, 'XPATH', html_btn_xpath, 5, 'js')
|
||||
|
||||
# # ============번역을 위한 사전작업============
|
||||
# 이미지 Url 수집
|
||||
# translated_image_urls = [] # 번역된 이미지 URL들을 저장할 리스트
|
||||
|
||||
#current_value = textarea.get_attribute("data-value")
|
||||
#original_html_tags = original_html(current_value)
|
||||
|
||||
# logger.debug(f"detail_images URLs \n {detail_images}")
|
||||
|
||||
# 원본 URL을 빈문자열로 대체
|
||||
logger.debug("원본 URL을 빈 문자열로 대체")
|
||||
for original_url in detail_images:
|
||||
renwed_current_value = current_value.replace(original_url, "")
|
||||
|
||||
# data-value 속성을 새로운 값으로 설정합니다.
|
||||
driver.execute_script("arguments[0].setAttribute('data-value', arguments[1]);", textarea, renwed_current_value)
|
||||
logger.debug("새로운 data-value 값으로 설정되었습니다.")
|
||||
# # ============번역을 위한 사전작업============
|
||||
|
||||
logger.debug("HTML 수정 버튼을 다시 클릭하여 에디터로 돌아오기")
|
||||
click_element(driver, 'XPATH', html_btn_xpath, 5, 'js')
|
||||
|
||||
try:
|
||||
for i, detail_image in enumerate(detail_images):
|
||||
logger.debug(f"상세페이지 {i+1}번째 이미지 번역 시작")
|
||||
logger.debug(f"이미지 타입 : {type(detail_image)}")
|
||||
returned_img = image_trans(detail_image, translator, 'translate')
|
||||
image_to_clipboard(returned_img)
|
||||
logger.debug("번역 완료 및 부텨넣기")
|
||||
detail_content.send_keys(Keys.CONTROL, 'v')
|
||||
detail_content.send_keys(Keys.ENTER)
|
||||
|
||||
logger.debug(f"{i}번째 이미지 붙여넣기 완료")
|
||||
|
||||
# translated_image_urls.append(returned_img_path)
|
||||
|
||||
logger.debug("이미지 번역 완료")
|
||||
except Exception as e:
|
||||
logger.error(f"이미지 번역 중 에러발생 : {e}", exc_info=True)
|
||||
|
||||
logger.debug("====번역이미지 붙여넣기 완료=====")
|
||||
|
||||
logger.debug("HTML 수정 버튼을 클릭하여 텍스트 정보 삽입 준비")
|
||||
click_element(driver, 'XPATH', html_btn_xpath, 5, 'js')
|
||||
time.sleep(0.5)
|
||||
try:
|
||||
# 상세페이지 내용에 텍스트 추가
|
||||
logger.debug("커서위치 맞추기")
|
||||
|
|
@ -668,34 +611,6 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
|||
detail_content.send_keys(Keys.HOME)
|
||||
time.sleep(0.5)
|
||||
|
||||
|
||||
logger.debug("product_info_card 결합.")
|
||||
new_value = product_info_card +'<br><br>' + cost_add_text +'<br><br>' + original_html_tags
|
||||
# textarea.send_keys(product_info_card)
|
||||
time.sleep(0.2)
|
||||
|
||||
logger.debug("product_info_card 입력")
|
||||
# 결합된 값을 다시 textarea에 설정
|
||||
# # data-value 속성을 새로운 값으로 설정합니다.
|
||||
driver.execute_script("arguments[0].setAttribute('data-value', arguments[1]);", textarea, new_value)
|
||||
|
||||
logger.debug("HTML 수정 버튼을 다시 클릭하여 기본편집페이지로 돌아오기")
|
||||
click_element(driver, 'XPATH', html_btn_xpath, 5, 'js')
|
||||
|
||||
# 상세페이지 내용에 텍스트 추가
|
||||
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)
|
||||
|
||||
|
||||
# contents 변수의 값이 None이 아닐 때만 send_keys 메서드를 호출합니다.
|
||||
if aicontents is not None:
|
||||
|
|
@ -706,11 +621,47 @@ def modify_detail_page(driver, product_info, gemini, translator, delv_collection
|
|||
# contents 변수가 None일 때의 대체 처리
|
||||
# 예: detail_content.send_keys("") 또는 아무 동작도 수행하지 않음
|
||||
pass
|
||||
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"AI 컨텐츠 입력 중 에러발생 : {e}", exc_info=True)
|
||||
logger.debug(f"AI 컨텐츠 수정 중 에러발생 : {e}", exc_info=True)
|
||||
|
||||
|
||||
trans_img_tag = login_info["whether_modifyImageTanslation"]
|
||||
logger.debug(f"whether_modifyImageTanslation : {trans_img_tag}")
|
||||
|
||||
if trans_img_tag:
|
||||
logger.debug("상세페이지 이미지 번역 시작")
|
||||
for i in range 20:
|
||||
detail_content.send_keys(Keys.PAGE_DOWN)
|
||||
|
||||
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)
|
||||
|
||||
try:
|
||||
for i, detail_image in enumerate(detail_images):
|
||||
logger.debug(f"상세페이지 {i+1}번째 이미지 번역 시작")
|
||||
logger.debug(f"이미지 타입 : {type(detail_image)}")
|
||||
returned_img = image_trans(detail_image, translator, 'translate')
|
||||
image_to_clipboard(returned_img)
|
||||
logger.debug("번역 완료 및 부텨넣기")
|
||||
detail_content.send_keys(Keys.CONTROL, 'v')
|
||||
detail_content.send_keys(Keys.ENTER)
|
||||
|
||||
logger.debug(f"{i+1}번째 이미지 붙여넣기 완료")
|
||||
|
||||
# translated_image_urls.append(returned_img_path)
|
||||
|
||||
logger.debug("이미지 번역 완료")
|
||||
detail_content.send_keys(Keys.ENTER)
|
||||
time.sleep(0.5)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"이미지 번역 중 에러발생 : {e}", exc_info=True)
|
||||
|
||||
logger.debug("====번역이미지 붙여넣기 완료=====")
|
||||
|
||||
|
||||
logger.debug("상세페이지 편집 저장")
|
||||
|
||||
|
|
|
|||
|
|
@ -20,8 +20,12 @@ logger = logging.getLogger('default_logger')
|
|||
|
||||
def image_trans(image_url, translator, convert_type):
|
||||
# 이미지를 URL로부터 읽어옵니다.
|
||||
image = read_image_from_url(image_url)
|
||||
|
||||
try:
|
||||
# image = read_image_from_url(image_url)
|
||||
image = read_image_from_url_with_requests(image_url)
|
||||
except Exception as e:
|
||||
logger.error(f"image_url 처리 중 에러발생 : {e}")
|
||||
|
||||
if image is None:
|
||||
return None # 이미지 로드에 실패한 경우, 추가 처리를 중단하고 None을 반환
|
||||
try:
|
||||
|
|
@ -70,10 +74,14 @@ def image_trans(image_url, translator, convert_type):
|
|||
logger.debug(f"원본 텍스트: {texts_to_translate}")
|
||||
logger.debug(f"DEEPL 번역시작")
|
||||
# translated_texts = translate_texts_deepl(texts_to_translate)
|
||||
translated_texts = translator.translate(texts_to_translate)
|
||||
if not translated_texts: # 빈 리스트 체크
|
||||
logger.debug(f"DEEPL 번역실패로 translatepy 시작")
|
||||
try:
|
||||
translated_texts = translator.translate(texts_to_translate)
|
||||
if not translated_texts: # 빈 리스트 체크
|
||||
logger.debug(f"DEEPL 번역실패로 translatepy 시작")
|
||||
translated_texts = translate_texts_translatepy(texts_to_translate)
|
||||
except Exception as e:
|
||||
translated_texts = translate_texts_translatepy(texts_to_translate)
|
||||
|
||||
logger.debug(f"번역 텍스트: {texts_to_translate}")
|
||||
# translated_image = insert_text(inpainted_image_path, translated_texts, detected_texts)
|
||||
translated_image = insert_text(inpainted_image, translated_texts, detected_texts)
|
||||
|
|
@ -104,6 +112,29 @@ def read_image_from_url(image_url):
|
|||
logger.error(f"이미지 로딩 중 오류 발생: {e}")
|
||||
return None
|
||||
|
||||
def read_image_from_url_with_requests(image_url):
|
||||
if not image_url: # URL이 비어있는지 확인
|
||||
logger.error("빈 URL이 제공되었습니다.")
|
||||
return None
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36",
|
||||
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
|
||||
"Accept-Language": "en-US,en;q=0.9",
|
||||
"Accept-Encoding": "gzip, deflate, br",
|
||||
"DNT": "1", # Do Not Track 요청 헤더
|
||||
"Connection": "keep-alive",
|
||||
"Upgrade-Insecure-Requests": "1", # https로의 업그레이드를 요청
|
||||
"Cache-Control": "max-age=0" # 캐시된 콘텐츠를 재사용하지 않도록 요청
|
||||
}
|
||||
try:
|
||||
response = requests.get(image_url, headers=headers)
|
||||
image = np.asarray(bytearray(response.content), dtype="uint8")
|
||||
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
|
||||
return image
|
||||
except Exception as e:
|
||||
logger.error(f"이미지 로딩 중 오류 발생: {e}")
|
||||
return None
|
||||
|
||||
# 외부에서 함수를 사용하는 예
|
||||
# 이미지 URL과 원하는 변환 유형('thumbnail' 또는 'translate')을 인자로 넘깁니다.
|
||||
# result = image_trans('http://example.com/image.jpg', 'thumbnail')
|
||||
|
|
|
|||
Loading…
Reference in New Issue