188 lines
7.6 KiB
Python
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() |