AutoPercenty/main.py

188 lines
7.6 KiB
Python

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
import ctypes
import atexit
import platform, os, sys
from login import login
import sys
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 login_widget import LoginWidget
from mongo_config import MongoConfig
from PyQt5 import QtCore, QtWidgets
from logger_module import setup_logger
import logging
# 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,
"login_result": login_widget.result # 로그인 결과도 함께 반환
}
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')
# # 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, mongo_config, login_info, set_num_modify)
#웹 드라이버 종료
driver.quit()
if __name__ == "__main__":
CURRENT_VERSION = "1.0.0"
logger = setup_logger('default_logger', 'application.log', level=logging.DEBUG)
main()