AutoPercenty3/tags.py

120 lines
5.3 KiB
Python

import re
from playwright.async_api import TimeoutError
from typing import List
import logging
class TagsHandler:
def __init__(self, locator_manager, browser_controller, logger, toggle_states):
self.locator_manager = locator_manager
self.browser_controller = browser_controller
self.page = self.browser_controller.page
self.logger = logger
self.toggle_states = toggle_states
# Locator들을 미리 로드하여 초기화
self.tags_input_locator = self.locator_manager.get_locator('TagsLocators', 'tags_input_locator')
self.tags_input_button_locator = self.locator_manager.get_locator('TagsLocators', 'tags_input_Button_locator')
self.delete_warning_tags_button_locator = self.locator_manager.get_locator('TagsLocators', 'delete_warning_tags_button_locator')
def update_page(self, page1):
self.page = page1
self.logger.log(f"page 객체 업데이트 : {page1}", level=logging.DEBUG)
async def process_tags(self, title_infos={}):
"""
태그 입력, 입력 버튼 클릭, 경고 키워드 삭제를 처리하는 메서드.
"""
self.logger.log(f"process_tags - title_infos : {title_infos}", level=logging.DEBUG)
try:
# 태그 키워드 리스트 추출
keyword_tags = title_infos.get("keyword_tags", [])
if not keyword_tags:
self.logger.log("키워드 태그가 비어 있습니다.", level=logging.WARNING)
return
self.logger.log(f"keyword_tags List : {keyword_tags}", level=logging.DEBUG)
# 태그 입력
await self.enter_tags(keyword_tags)
# 입력 버튼 클릭
await self.click_input_button()
# 경고 키워드 삭제
await self.delete_warning_tags()
except TimeoutError as te:
self.logger.log(f"태그 처리 중 타임아웃 오류 발생: {te}", level=logging.ERROR, exc_info=True)
except Exception as e:
self.logger.log(f"태그 처리 중 예외 발생: {e}", level=logging.ERROR, exc_info=True)
async def enter_tags(self, tags_list: List[str], exclude_list: List[str] = None):
"""
태그 입력칸에 키워드 태그를 입력.
주어진 리스트의 콤마로 구분된 문자열을 개별 태그로 분리하여 입력.
제외리스트에 있는 단어는 제외.
"""
try:
# 기본 제외리스트 설정
if exclude_list is None:
exclude_list = ['오늘출발', '오늘발송', '당일배송', '오늘도착'] # 제외할 기본 단어
self.logger.log(f"태그 입력: {tags_list}", level=logging.DEBUG)
self.logger.log(f"제외 리스트: {exclude_list}", level=logging.DEBUG)
# 태그 분리 및 정리
all_tags = []
for tags in tags_list:
all_tags.extend(tags.split(",")) # 콤마로 분리하여 추가
all_tags = [tag.strip() for tag in all_tags] # 공백 제거
# 제외 리스트에 있는 단어 제거
filtered_tags = [tag for tag in all_tags if tag not in exclude_list]
# 중복 제거
unique_tags = list(set(filtered_tags))
self.logger.log(f"정리된 태그 리스트: {unique_tags}", level=logging.DEBUG)
# 최종 태그를 하나의 문자열로 변환
tags_str = ", ".join(unique_tags)
# 태그 입력
tags_input = await self.page.query_selector(self.tags_input_locator)
if tags_input is None:
raise Exception("태그 입력칸을 찾을 수 없습니다.")
await tags_input.fill(tags_str) # 정리된 태그 입력
self.logger.log(f"태그 입력 완료: {tags_str}", level=logging.INFO)
except Exception as e:
self.logger.log(f"태그 입력 중 오류 발생: {e}", level=logging.ERROR, exc_info=True)
async def click_input_button(self):
"""태그 입력 버튼 클릭."""
try:
self.logger.log("태그 입력 버튼 클릭 시도", level=logging.DEBUG)
input_button = await self.page.query_selector(self.tags_input_button_locator)
if input_button is None:
raise Exception("태그 입력 버튼을 찾을 수 없습니다.")
await input_button.click()
self.logger.log("태그 입력 버튼 클릭 완료", level=logging.INFO)
except Exception as e:
self.logger.log(f"태그 입력 버튼 클릭 중 오류 발생: {e}", level=logging.ERROR, exc_info=True)
async def delete_warning_tags(self):
"""경고 키워드 삭제 버튼 클릭."""
try:
self.logger.log("경고 키워드 삭제 버튼 클릭 시도", level=logging.DEBUG)
delete_button = await self.page.query_selector(self.delete_warning_tags_button_locator)
if delete_button is None:
raise Exception("경고 키워드 삭제 버튼을 찾을 수 없습니다.")
await delete_button.click()
self.logger.log("경고 키워드 삭제 버튼 클릭 완료", level=logging.INFO)
except Exception as e:
self.logger.log(f"경고 키워드 삭제 버튼 클릭 중 오류 발생: {e}", level=logging.ERROR, exc_info=True)