k-skill/docs/features/intercity-bus-booking.md
Jeffrey (Dongkyu) Kim 34127550fa Let intercity booking helper create temporary seat holds
Extend the Tmoney intercity helper from read-only timetable lookup to the browser-equivalent seat-stage and temporary hold flow, saving the official card-information page and cancel/back fields while still avoiding card submission.

Constraint: readPcpySats.do creates a live sats_Pcpy_Id hold, so abandoned test holds must be released with the official pcpyCanc=C back flow.

Rejected: Automating final payment | card submission is irreversible and remains a manual user action.

Confidence: high

Scope-risk: narrow

Directive: Treat holds as short-lived; hand off immediately and cancel abandoned holds.

Tested: python3 -m py_compile intercity-bus-booking/scripts/intercity_bus_search.py ~/.agents/skills/intercity-bus-booking/scripts/intercity_bus_search.py; live --hold-first-seat for 동서울→속초 20260520 produced sats_Pcpy_Id and card-info page; posted cancel/back fields and verified timetable remained 24/28; ./scripts/validate-skills.sh; node --test scripts/skill-docs.test.js; npm run lint

Not-tested: card info entry, final payment, mixed passenger hold payloads
2026-05-13 15:43:26 +09:00

3.3 KiB

시외버스 예매 가이드

이 기능으로 할 수 있는 일

  • 티머니 시외버스 터미널/노선 후보 확인
  • 배차 시간표, 운수사, 잔여석, 요금 확인
  • 좌석/요금 단계 진입 가능 여부 확인
  • 공식 카드정보 입력 페이지로 handoff

먼저 필요한 것

  • 별도 사용자 계정/비밀번호는 기본 조회·좌석 단계에서 필요하지 않음
  • 결제는 공식 티머니 시외버스 페이지에서 사용자가 직접 진행
  • 브라우저 자동화보다 https://intercitybus.tmoney.co.kr 공식 HTTP 흐름을 우선 사용

입력값

  • 출발 터미널
  • 도착 터미널
  • 날짜: YYYYMMDD
  • 희망 시간대
  • 인원 수와 좌석 선호

기본 흐름

  1. 쿠키 jar를 만들고 티머니 시외버스 페이지를 열어 세션을 시작한다.
  2. POST /otck/readAlcnList.do 로 배차를 조회한다. 이때 브라우저 JS가 붙이는 bef_Aft_Dvs=D, req_Rec_Num=10을 반드시 같이 보낸다.
  3. 결과의 readSasFeeInf(...) 인자를 파싱해 후보를 정리한다.
  4. 선택 후보는 POST /otck/readSatsFee.do 로 좌석/요금 단계 진입을 확인한다.
  5. 사용자가 원하면 POST /otck/readPcpySats.do 로 공식 카드정보 입력 페이지에 진입하도록 handoff한다.
  6. 뒤로가기/취소성 이동으로 좌석 선택 단계에 복귀해 임시 선점을 해제할 수 있는지 확인한다.

read-only 조회 helper

python3 intercity-bus-booking/scripts/intercity_bus_search.py \
  --depart-code 0511601 \
  --arrive-code 2482701 \
  --depart-name 동서울 \
  --arrive-name 속초 \
  --date 20260520

이 helper는 쿠키 세션을 시작하고 공식 배차 조회 POST를 수행한 뒤 출발시각, 운수사, 등급, 요금, 잔여/총 좌석을 JSON으로 출력한다. 기본은 read-only이며, --hold-seat 또는 --hold-first-seat를 주면 좌석/요금 단계에 진입해 readPcpySats.do로 임시 좌석 선점을 만들고 공식 카드정보 입력 HTML과 cancel/back 필드를 저장한다. 결제 정보 입력·제출은 수행하지 않는다.

임시 선점 예시

python3 intercity-bus-booking/scripts/intercity_bus_search.py \
  --depart-code 0511601 \
  --arrive-code 2482701 \
  --depart-name 동서울 \
  --arrive-name 속초 \
  --date 20260520 \
  --select-index 1 \
  --hold-first-seat \
  --output-dir /tmp/tmoney-hold

성공 조건은 JSON의 hold.success=true, hold.hold_id 존재, 저장된 HTML에 카드정보 입력 표시가 있는 것이다. 라이브 응답 페이지에는 정확한 만료 카운트다운 문구가 노출되지 않았으므로, 선점 후 결제는 즉시 진행하게 안내하고 방치된 선점은 저장된 cancel/back 필드로 해제한다.

주의할 점

  • 결제 자동화는 포함하지 않는다. 공식 페이지의 결제 직전 단계까지 보조하는 assisted checkout 흐름이다.
  • 티머니 시외버스 터미널 코드는 KOBUS 고속버스 코드와 다르므로 혼용하지 않는다.
  • 일부 표면은 txbus 계열 URL과 연결될 수 있지만, 검증된 기본 URL은 intercitybus.tmoney.co.kr 이다.
  • stateless POST보다 쿠키와 referer를 유지하는 흐름이 안정적이다.
  • bef_Aft_Dvs 또는 req_Rec_Num을 누락하면 실제 배차가 있어도 errorCont가 포함된 일반 오류 페이지가 반환될 수 있다.