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, load_report, normalize_game_type, normalize_stadium_name, normalize_team_name, open_create_page, select_by_label, split_time, ) TARGET_GAME_ID = DEFAULT_GAME_ID 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("--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 fill_basic_game_form(page, report: dict) -> None: game_info = report["game_info"] season_label = f"{game_info['season']} 프로야구" game_type_label = normalize_game_type(game_info["game_type"]) stadium_label = normalize_stadium_name(game_info["stadium"]) home_team_label = normalize_team_name(game_info["home_team"]) away_team_label = normalize_team_name(game_info["away_team"]) start_hour, start_minute = split_time(game_info["start_time"]) select_by_label(page, "#season_id", season_label) select_by_label(page, "#gameType", game_type_label) select_by_label(page, "#stadium_id", stadium_label) page.locator("#gameDate").fill(game_info["date"]) select_by_label(page, "#startH", start_hour) select_by_label(page, "#startM", start_minute) select_by_label(page, "#homeTeam_id", home_team_label) select_by_label(page, "#awayTeam_id", away_team_label) 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_create_page(page, args.base_url) fill_basic_game_form(page, report) if args.save: page.evaluate("""() => { window.confirm = () => true; window.alert = () => {}; }""") page.locator("#gameWriteBtn").click() page.wait_for_timeout(1000) 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 pass 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()