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_ori(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 process_tags(self, forbidden_word_manager, 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) # 금지어 필터링: 각 태그에 대해 forbidden_word_manager의 메서드로 검사 filtered_tags = [ tag for tag in keyword_tags if not forbidden_word_manager.is_word_forbidden(tag) ] self.logger.log(f"Filtered keyword_tags List : {filtered_tags}", level=logging.DEBUG) # 태그 입력 await self.enter_tags(filtered_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)