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 register_game_playwright import ( DEFAULT_BASE_URL, DEFAULT_GAME_ID, DEFAULT_REPORT_DIR, fill_lineup_form, load_report, open_edit_page, ) # 직접 수정해서 쓰는 기본값 TARGET_GAME_ID = "20260404NCHT02026" TARGET_MANAGER_GAME_NO = "11078" TARGET_REPORT_PATH = "" TARGET_SAVE = True TARGET_CLOSE = True def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="기존 경기 수정 화면에서 라인업만 자동 입력하고 저장 직전에서 멈춥니다." ) parser.add_argument("--game-id", default=TARGET_GAME_ID, help="예: 20250425LTOB02025") 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.add_argument("--no-close", dest="close", action="store_false", help="작업 후 브라우저를 유지") parser.set_defaults(save=TARGET_SAVE, close=TARGET_CLOSE) 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_edit_page(page, args.base_url, report, args.manager_game_no) fill_lineup_form(page, report) if args.save: page.evaluate("""() => { window.confirm = () => true; window.alert = () => {}; }""") page.locator("#lineupWriteBtn").click() page.wait_for_timeout(1000) print("라인업 입력 완료") if args.close: browser.close() print("라인업 작업 종료") 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()