절전모드 방지 추가 및 중간저장

This commit is contained in:
R5600U_PC 2024-04-05 01:37:49 +09:00
parent f6731c06c8
commit e27b2ee3b1
8 changed files with 114 additions and 75 deletions

10
.gitignore vendored
View File

@ -1,3 +1,8 @@
!baseDB.db
!baseXLS.xlsx
!baseXLS_backup.xlsx
!baseXLS_Percenty.xlsx
!test*.xlsx
__pycache__/
dist/
build/
@ -17,8 +22,3 @@ Scripts/
*.log.*
*.xlsx
pyvenv.cfg
!base.db
!baseXLS.xlsx
!baseXLS_backup.xlsx
!baseXLS_Percenty.xlsx
!test*.xlsx

BIN
libpq.dll Normal file

Binary file not shown.

View File

@ -32,14 +32,17 @@ def automatch(db, item_count, sort_order, progress_callback=None):
df_NS = pd.read_sql_query(query, conn)
logger.debug(f"df_NS : {df_NS}")
# keyword_id별로 그룹화
# df_NS.sort_values('keyword_id', inplace=True) # keyword_id 기준으로 정렬
grouped = df_NS.groupby('keyword_id')
logger.debug(f"grouped_df_NS : {grouped}")
# 전체 keyword_id 그룹의 수
total_groups = len(grouped)
logger.debug(f"total_groups Number : {total_groups}")
driver = setup_driver()
logger.debug("셀레니움 드라이버 설정 완료")

View File

@ -44,7 +44,8 @@ def setup_logger(name, log_file, level=logging.DEBUG, max_bytes=10*1024*1024, ba
------------------------------------------------------------
"""
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)d - %(name)s - %(levelname)s - %(message)s')
# RotatingFileHandler를 사용하여 로그 파일 설정
handler = RotatingFileHandler(log_file, maxBytes=max_bytes, backupCount=backup_count, encoding='utf-8')

View File

@ -12,6 +12,7 @@ from time import sleep
import time
import pyperclip
import win32clipboard
import traceback
from random import randint
import random
@ -68,33 +69,44 @@ def setup_driver():
"""
드라이버 설정 selenium-stealth 적용
"""
logger.debug("웹드라이버 설정")
options = webdriver.ChromeOptions()
ua = UserAgent()
options.add_argument(f"--user-agent={ua.random}") # 랜덤 user_agent 사용
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ssl-protocol=any')
options.add_argument('--disable-cache')
options.add_argument("--allow-insecure-localhost") # 로컬 SSL 인증서 오류 무시
driver = webdriver.Chrome(options=options)
# selenium-stealth 설정 적용
logger.debug("selenium-stealth 설정 적용")
stealth(driver,
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
current_user_agent = driver.execute_script("return navigator.userAgent;")
logger.debug(f"현재 사용 중인 User-Agent: {current_user_agent}")
try:
logger.debug("웹드라이버 설정")
options = webdriver.ChromeOptions()
ua = UserAgent()
ua.user_agent_list = ua.pc_browsers
return driver
# 랜덤 PC Agent 선택
random_PC_UA = ua.random
logger.debug(f"UserAgent : {random_PC_UA}")
options.add_argument(f"--user-agent={random_PC_UA}") # 랜덤 user_agent 사용
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ssl-protocol=any')
options.add_argument('--disable-cache')
options.add_argument("--allow-insecure-localhost") # 로컬 SSL 인증서 오류 무시
driver = webdriver.Chrome(options=options)
# selenium-stealth 설정 적용
logger.debug("selenium-stealth 설정 적용")
stealth(driver,
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
current_user_agent = driver.execute_script("return navigator.userAgent;")
logger.debug(f"현재 사용 중인 User-Agent: {current_user_agent}")
return driver
except Exception as e:
logger.debug(f"셀레니움 드라이버 설정 중 에러 발생 : {e}")
logger.error(traceback.format_exc()) # traceback 모듈을 사용하여 예외 정보를 문자열로 변환하여 로그에 출력
def login_and_manage_session(driver):
@ -161,8 +173,9 @@ def fetch_and_save_taobao_products(driver, imgurl, cursor, db, item_count=5, sor
if response.status_code == 200 and 'image' in response.headers['Content-Type']:
img = Image.open(BytesIO(response.content))
phash = imagehash.phash(img)
return phash
# phash = imagehash.phash(img)
# return phash
return 1
else:
logger.debug("이미지 로드 실패 또는 잘못된 콘텐츠 타입")
logger.debug(response.status_code)

View File

@ -1,26 +0,0 @@
from setuptools import setup
setup(
name='taoseller',
version='0.0.1',
packages=['taoseller'], # 애플리케이션의 코드가 들어있는 패키지 명을 기입하세요.
install_requires=[
# 필요한 종속성이 있으면 여기에 목록을 만드세요.
],
entry_points={
'console_scripts': [
'taoseller = taoseller.taoseller:main', # your_package는 코드의 패키지 이름이며, taoseller는 메인 모듈 이름입니다.
]
},
options={
'app': {
'formal_name': '타오셀러',
'bundle': 'com.sourcing.taoseller' # 유니크한 번들 ID를 설정하세요.
},
'windows': {
'app_requires': [
# Windows 플랫폼에 필요한 종속성을 기입하세요.
],
},
},
)

View File

@ -32,7 +32,8 @@ from modules.tao_card import TaoCard
from modules.full_auto import FullAuto
from modules.logger_module import setup_logger, QTextEditLogger
import logging
import ctypes
import atexit
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5 import QtCore, QtGui, QtWidgets, uic
@ -223,13 +224,16 @@ class Ui_Dialog(QtWidgets.QDialog):
def __init__(self, logger=None): # logger 매개변수 추가, 기본값은 None으로 설정
super(Ui_Dialog, self).__init__()
UI_PATH = os.path.join(BASE_PATH, 'outline10.ui')
uic.loadUi(UI_PATH, self)
self.logger = logger # logger 인스턴스를 클래스 속성으로 저장
# 화면 꺼짐과 절전 모드 방지 기능 활성화
prevent_sleep_mode()
if self.logger: # logger 인스턴스가 제공되었는지 확인
self.logger.debug("Ui_Dialog 초기화 시작")
@ -2135,8 +2139,9 @@ class Ui_Dialog(QtWidgets.QDialog):
# 이미지 저장 폴더 설정 ('DB이름_save_images')
self.conndb = sqlite3.connect(self.db_name, check_same_thread=False)
image_save_folder = f"{self.db_name}_tao_save_images"
ori_image_save_folder = f"{self.db_name}_tao_save_images"
image_save_folder = os.path.join(BASE_PATH, ori_image_save_folder)
# 폴더가 없으면 생성
if not os.path.exists(image_save_folder):
os.makedirs(image_save_folder)
@ -2193,8 +2198,9 @@ class Ui_Dialog(QtWidgets.QDialog):
self.conndb = sqlite3.connect(self.db_name, check_same_thread=False)
# 이미지 저장 폴더 설정 ('DB이름_save_images')
image_save_folder = f"{self.db_name}_save_images"
ori_image_save_folder = f"{self.db_name}_save_images"
image_save_folder = os.path.join(BASE_PATH, ori_image_save_folder)
# 폴더가 없으면 생성
if not os.path.exists(image_save_folder):
os.makedirs(image_save_folder)
@ -2208,8 +2214,10 @@ class Ui_Dialog(QtWidgets.QDialog):
def start_image_save_thread(self):
# 이미지 저장 폴더 설정 ('DB이름_save_images')
image_save_folder = f"{self.db_name}_save_images"
ori_image_save_folder = f"{self.db_name}_save_images"
image_save_folder = os.path.join(BASE_PATH, ori_image_save_folder)
# 폴더가 없으면 생성
if not os.path.exists(image_save_folder):
os.makedirs(image_save_folder)
@ -2291,8 +2299,9 @@ class Ui_Dialog(QtWidgets.QDialog):
def imageSave_ori(self):
# 이미지 저장 폴더 설정 ('DB이름_save_images')
image_save_folder = f"{self.db_name}_save_images"
ori_image_save_folder = f"{self.db_name}_save_images"
image_save_folder = os.path.join(BASE_PATH, ori_image_save_folder)
# DB 연결 및 cursor 생성
conn = sqlite3.connect(self.db_name) # 이 부분은 self.db_name이 정의되어 있어야 합니다.
cursor = conn.cursor()
@ -2707,6 +2716,43 @@ def initialize_resource_paths():
# 스크립트가 직접 실행되는 경우
BASE_PATH = os.path.dirname(os.path.abspath(__file__))
# 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("프로그램이 종료되었습니다. 안녕히 가세요.")
if __name__ == "__main__":
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)

View File

@ -7,16 +7,18 @@ spec_dir = os.getcwd()
a = Analysis(
['taoseller.py'],
pathex=[],
binaries=[('C:\\path\\to\\postgresql\\bin\\LIBPQ.dll', '.')],
binaries=[],
datas=[
(os.path.join(spec_dir, 'baseDB.db'), '.'),
(os.path.join(spec_dir, 'baseXLS.xlsx'), '.'),
(os.path.join(spec_dir, 'baseXLS_Percenty.xlsx'), '.'),
(os.path.join(spec_dir, 'outline10.ui'), '.'),
(os.path.join(spec_dir, 'Percenty_SS_Code.json'), '.')
(os.path.join(spec_dir, 'papago_api_keys.txt'), '.')
(os.path.join(spec_dir, 'Percenty_SS_Code.json'), '.'),
(os.path.join(spec_dir, 'papago_api_keys.txt'), '.'),
(os.path.join(spec_dir,'Lib', 'site-packages', 'fake_useragent'), 'fake_useragent'),
(os.path.join(spec_dir,'Lib', 'site-packages', 'selenium_stealth'), 'selenium_stealth'),
],
hiddenimports=['translatepy'],
hiddenimports=['translatepy', 'fake_useragent', 'selenium_stealth'],
hookspath=[],
hooksconfig={},
runtime_hooks=[],