from __future__ import annotations import argparse from pathlib import Path from playwright.sync_api import Error, Playwright, sync_playwright from browser_launch import launch_browser_context from record_game_playwright import fill_game_end_pitching, open_game_status_page, submit_game_end from register_game_playwright import DEFAULT_BASE_URL, DEFAULT_GAME_ID, DEFAULT_REPORT_DIR, load_report TARGET_GAME_ID = DEFAULT_GAME_ID TARGET_MANAGER_GAME_NO = "" TARGET_REPORT_PATH = "" TARGET_SAVE = True def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="게임기록 화면에서 게임종료 팝업만 처리합니다." ) parser.add_argument("--game-id", default=TARGET_GAME_ID, help="예: 20260404LGWO02026") parser.add_argument("--report-path", help="기본값: output/_report.json") parser.add_argument("--base-url", default=DEFAULT_BASE_URL, help="관리자 사이트 기본 URL") parser.add_argument( "--manager-game-no", default=(TARGET_MANAGER_GAME_NO or None), help="관리자 게임번호. 있으면 해당 행의 게임기록 버튼으로 진입", ) parser.add_argument("--user-data-dir", default="playwright-user-data", help="Chromium 사용자 데이터 폴더") parser.add_argument("--channel", default="chrome", help="브라우저 채널. 예: chrome, msedge") parser.add_argument("--headless", action="store_true", help="헤드리스 모드") parser.add_argument("--save", dest="save", action="store_true", help="게임종료 버튼까지 클릭") parser.add_argument("--no-save", dest="save", action="store_false", help="게임종료 팝업 입력까지만") parser.add_argument("--close", action="store_true", help="작업 후 브라우저를 닫음") parser.set_defaults(save=TARGET_SAVE) return parser.parse_args() def resolve_report_path(args: argparse.Namespace) -> Path: if args.report_path: return Path(args.report_path) if TARGET_REPORT_PATH: return Path(TARGET_REPORT_PATH) return DEFAULT_REPORT_DIR / f"{args.game_id}_report.json" def run(playwright: Playwright, args: argparse.Namespace) -> None: report = load_report(resolve_report_path(args)) browser = launch_browser_context( playwright=playwright, user_data_dir=args.user_data_dir, channel=args.channel, headless=args.headless, ) page = browser.pages[0] if browser.pages else browser.new_page() try: open_game_status_page(page, args.base_url, report, args.manager_game_no) fill_game_end_pitching(page, report) if args.save: submit_game_end(page) if args.close: browser.close() return try: page.wait_for_timeout(3600 * 1000) except KeyboardInterrupt: pass except Error as exc: if "Target page, context or browser has been closed" not in str(exc): raise finally: try: browser.close() except Exception: pass def main() -> None: args = parse_args() with sync_playwright() as playwright: run(playwright, args) if __name__ == "__main__": main()