Files
baseball-automation/lineup_only_playwright.py
2026-05-02 11:12:13 +09:00

108 lines
3.7 KiB
Python

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/<game_id>_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()