절전모드 방지 추가 및 중간저장
This commit is contained in:
parent
f6731c06c8
commit
e27b2ee3b1
|
|
@ -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
|
||||
|
|
@ -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("셀레니움 드라이버 설정 완료")
|
||||
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
26
setup.py
26
setup.py
|
|
@ -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 플랫폼에 필요한 종속성을 기입하세요.
|
||||
],
|
||||
},
|
||||
},
|
||||
)
|
||||
66
taoseller.py
66
taoseller.py
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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=[],
|
||||
|
|
|
|||
Loading…
Reference in New Issue