diff --git a/lotto-runner/lotto_auto_buy.py b/lotto-runner/lotto_auto_buy.py index 364e0e6..65b13b7 100644 --- a/lotto-runner/lotto_auto_buy.py +++ b/lotto-runner/lotto_auto_buy.py @@ -13,7 +13,9 @@ import os import sys import time import json +import shutil import logging +import tempfile import urllib.request from datetime import datetime @@ -69,15 +71,28 @@ def create_driver(): options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-gpu") options.add_argument("--disable-software-rasterizer") - options.add_argument("--remote-debugging-port=9222") - options.add_argument("--user-data-dir=/tmp/chrome-user-data") + # 고정 포트(9222)는 CI/병렬 실행 시 충돌 가능성이 커서 pipe 모드 사용 + options.add_argument("--remote-debugging-pipe") + # 고정 user-data-dir은 lock 충돌(session not created) 유발 가능 -> 매 실행 고유 경로 사용 + chrome_user_data_dir = os.environ.get("CHROME_USER_DATA_DIR") + auto_created_profile = False + if not chrome_user_data_dir: + chrome_user_data_dir = tempfile.mkdtemp(prefix="chrome-user-data-") + auto_created_profile = True + options.add_argument(f"--user-data-dir={chrome_user_data_dir}") options.add_argument("--window-size=1920,1080") + options.add_argument("--no-first-run") + options.add_argument("--no-default-browser-check") + options.add_argument("--disable-extensions") # 자동화 탐지 우회 options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) driver = webdriver.Chrome(options=options) + # 종료 시 정리할 수 있도록 임시 프로필 경로 저장 + driver._chrome_user_data_dir = chrome_user_data_dir + driver._chrome_user_data_dir_auto_created = auto_created_profile driver.execute_cdp_cmd( "Page.addScriptToEvaluateOnNewDocument", {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"}, @@ -447,6 +462,15 @@ def main(): if driver: driver.quit() logger.info("브라우저 종료") + # 자동 생성한 Chrome profile 디렉토리 정리 + try: + if getattr(driver, "_chrome_user_data_dir_auto_created", False): + profile_dir = getattr(driver, "_chrome_user_data_dir", "") + if profile_dir and os.path.isdir(profile_dir): + shutil.rmtree(profile_dir, ignore_errors=True) + logger.info(f"임시 Chrome 프로필 정리: {profile_dir}") + except Exception as e: + logger.warning(f"임시 Chrome 프로필 정리 실패: {e}") if __name__ == "__main__":