from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service #웨일 # from webdriver_manager.chrome import ChromeDriverManager #웨일 import time from datetime import datetime import ctypes import atexit import platform, os, sys from login import login from navigate import navigate_to_new_product_registration from modify_products import modify_products from database import setup_database from utils import log from config import WEBSITE_URL from credentials import load_credentials, save_credentials from ai.gemini import ImageDescriptionGenerator from ai.deepl_class import DeepLTranslator from login_widget import LoginWidget from mongo_config import MongoConfig from PyQt5 import QtCore, QtWidgets from logger_module import setup_logger import logging def set_playwright_path(): # 패킹된 애플리케이션의 임시 디렉터리 경로를 확인 if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): # PyInstaller 패킹 후 실행 시 base_path = sys._MEIPASS playwright_path = os.path.join(base_path, 'playwright', 'browsers') else: # 로컬 개발 환경 base_path = os.path.dirname(__file__) playwright_path = os.path.join(base_path, 'Lib', 'site-packages', 'playwright', 'browsers') # Playwright 브라우저 경로 설정 os.environ['PLAYWRIGHT_BROWSERS_PATH'] = playwright_path print(f"Playwright browsers path set to: {playwright_path}") # Windows SetThreadExecutionState API를 사용하여 절전 모드 방지 def prevent_sleep_mode(): """ 이 함수는 시스템이 자동으로 화면을 끄거나 절전 모드로 들어가는 것을 방지합니다. """ # 실행 상태를 설정하는 데 사용되는 플래그 ES_CONTINUOUS = 0x80000000 ES_SYSTEM_REQUIRED = 0x00000001 # SetThreadExecutionState 함수 호출 ctypes.windll.kernel32.SetThreadExecutionState( ES_CONTINUOUS | ES_SYSTEM_REQUIRED ) # 시스템 절전 모드 방지 해제 def restore_sleep_mode(): ES_CONTINUOUS = 0x80000000 ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS) logger.info("시스템의 절전 모드 설정이 원래대로 복원되었습니다.") # 사용자 로그아웃 시간 기록 def record_logout_time(): # 이 함수에서는 사용자 로그아웃 시간을 데이터베이스에 기록하는 로직을 구현해야 합니다. # 여기서는 예시로 현재 시간을 로깅합니다. logout_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') logger.info(f"사용자의 로그아웃 시간을 기록했습니다: {logout_time}") # 프로그램 종료 메시지 보내기 def send_exit_message(): # 이 함수에서는 사용자에게 프로그램 종료 메시지를 보내는 로직을 구현해야 합니다. # 여기서는 예시로 로깅만 수행합니다. logger.info("프로그램이 종료되었습니다. 안녕히 가세요.") def shutdown_system(): """ 시스템을 종료시키는 메서드. 운영 체제를 확인하고 적절한 종료 명령을 실행합니다. """ logger.info("프로그램이 종료되었습니다. 1초 후 컴퓨터가 종료됩니다. 안녕히 가세요.") try: operating_system = platform.system() if operating_system == "Windows": os.system("shutdown /s /t 1") # Windows에서 시스템 종료 elif operating_system == "Linux" or operating_system == "Darwin": os.system("shutdown -h now") # Linux와 macOS에서 시스템 종료 else: print("Unsupported operating system.") sys.exit(1) print("System shutdown command executed.") except Exception as e: print(f"Failed to shutdown the system: {e}") sys.exit(1) def DB_setting(): QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts) app = QtWidgets.QApplication(sys.argv) # MongoDB 설정 및 연결 시도 mongo_config = MongoConfig() if not mongo_config.try_connect(*mongo_config.load_config()): logger.debug("MongoDB에 연결할 수 없습니다. 설정을 확인해주세요.") sys.exit(-1) # MongoDB 연결 실패 시, 애플리케이션 종료 login_widget = LoginWidget(mongo_config, CURRENT_VERSION) # MongoDB 설정을 인자로 전달하려면 여기에 추가하세요. login_widget.show() result = app.exec_() # 이벤트 루프를 실행하고 종료 코드를 반환 # login_widget에서 필요한 값을 딕셔너리로 패킹하여 반환 login_info = { "per_email": login_widget.per_email, "per_password": login_widget.per_password, "per_em_email": login_widget.per_em_email, "per_em_password": login_widget.per_em_password, "per_mode": login_widget.per_mode, "set_num_modify": login_widget.set_num_modify, "alwaysOnTopSwitch": login_widget.alwaysOnTopSwitch, "whether_shutdownAfterComplete" : login_widget.whether_shutdownAfterComplete, "whether_modifyProductName": login_widget.whether_modifyProductName, "whether_modifyProductOptions": login_widget.whether_modifyProductOptions, "whether_modifyProductTag": login_widget.whether_modifyProductTag, "whether_modifyProductPrice": login_widget.whether_modifyProductPrice, "whether_modifyProductThumb": login_widget.whether_modifyProductThumb, "whether_modifyProductDetail": login_widget.whether_modifyProductDetail, "whether_modifyImageTanslation": login_widget.whether_modifyImageTanslation, "whether_uploadToMarket": login_widget.whether_uploadToMarket, "whether_simpleMode": login_widget.whether_simpleMode, "login_result": login_widget.result, } tag = login_info["whether_modifyImageTanslation"] logger.debug(f"whether_modifyImageTanslation : {tag}") return login_info, result, mongo_config def main(): login_info, app_result, mongo_config = DB_setting() # 로그인 정보와 QApplication 실행 결과를 받음 # 화면 꺼짐과 절전 모드 방지 기능 활성화 prevent_sleep_mode() # 프로그램 종료 시 호출될 함수 등록 atexit.register(restore_sleep_mode) atexit.register(record_logout_time) if login_info["whether_shutdownAfterComplete"]: atexit.register(shutdown_system) atexit.register(send_exit_message) if not login_info["login_result"]: logger.debug("사용자 인증 실패로 프로그램을 종료합니다.") sys.exit(app_result) # QApplication의 종료 코드와 함께 프로그램 종료 # 로그인 정보 사용 per_email = login_info["per_email"] logger.debug(f'per_email : {per_email}') per_password = login_info["per_password"] # logger.debug(f'per_password : {per_password}') per_em_email = login_info["per_em_email"] logger.debug(f'per_em_email : {per_em_email}') per_em_password = login_info["per_em_password"] # logger.debug(f'per_em_password : {per_em_password}') per_mode = login_info["per_mode"] logger.debug(f'per_mode : {per_mode}') set_num_modify = login_info["set_num_modify"] logger.debug(f'set_num_modify : {set_num_modify}') # 사용자로부터 로그인 정보를 받거나 저장된 정보 사용 gemini = ImageDescriptionGenerator('AIzaSyCER9mD617P5OGaoHCK7drsTkmXUIzFn4U') translator = DeepLTranslator() # # username, password, employeeID = load_credentials() # if not username or not password or not employeeID: # username = input("Username: ") # password = input("Password: ") # employeeID = input("employeeID: ") # save_credentials(username, password, employeeID) # 크롬 옵션 설정 chrome_options = Options() #chrome_options.binary_location = "C:\\Program Files\\Naver\\Naver Whale\\Application\\whale.exe" # 네이버 웨일 브라우저의 설치 경로 chrome_options.add_argument("--disable-notifications") # 팝업 알림 비활성화 chrome_options.add_argument("--disable-popup-blocking") # 팝업 차단 비활성화 chrome_options.add_experimental_option("prefs", { "credentials_enable_service": False, # 자격 증명 서비스 비활성화 "profile.password_manager_enabled": False # 암호 저장 기능 비활성화 }) # 크롬 드라이버에 옵션 추가 driver = webdriver.Chrome(options=chrome_options) # 웨일 WebDriver 서비스 #service = Service(ChromeDriverManager().install()) # 웨일 WebDriver를 사용하여 네이버 웨일 브라우저 실행 #driver = webdriver.Chrome(service=service, options=chrome_options) # # 데이터베이스 설정 # setup_database() # 로그인 driver.get(WEBSITE_URL) driver.set_window_size(1280, 800) login(driver, login_info) # login 함수에 로그인 정보를 전달하여 호출 #상품 수정 작업 수행 modify_products(driver, gemini, translator, mongo_config, login_info, set_num_modify) #웹 드라이버 종료 driver.quit() translator.close() QtWidgets.QMessageBox.information("알림", "작업이 완료되었습니다.") if __name__ == "__main__": CURRENT_VERSION = "1.0.0" set_playwright_path() logger = setup_logger('default_logger', 'application.log', level=logging.DEBUG) main()