| name | srt-booking |
| description | Search, reserve, inspect, and cancel SRT tickets in Korea with the SRTrain library. Use when the user asks for SRT seat availability, booking, canceling, or sold-out retry plans. |
| license | MIT |
| metadata | {"category":"travel","locale":"ko-KR","phase":"v1"} |
SRT Booking
What this skill does
SRTrain ์์ scripts/srt_booking.py helper ๋ฅผ ์น์ด SRT ์กฐํ์ ํธ์ฐจ๋ณ ์ข์๋ฒํธ ํ์ธ์ ์ฒ๋ฆฌํ๊ณ , ์์ฝ๊ณผ ์ทจ์๋ ๊ณ ์ ๋ ์ด์ฐจ/์์ฝ์ ๋ค์ ์๋ณํ ๋ค SRTrain์ผ๋ก ์งํํ๋ค.
When to use
- "์์์์ ๋ถ์ฐ ๊ฐ๋ SRT ์ฐพ์์ค"
- "๋ด์ผ ์ค์ SRT ๋น์๋ฆฌ ์์ผ๋ฉด ์ก์์ค"
- "SRT 5ํธ์ฐจ ๋น ์ข์ ํ์ธํด์ค"
- "SRT 11A ์ข์์ด ๋น์๋์ง ๋ด์ค"
- "์ฐฝ์ธก ์ข์์ ์ฐ์ ํด์ SRT ๋น์๋ฆฌ ๋ณด์ฌ์ค"
- "์์ฝ ๋ด์ญ ํ์ธํด์ค"
- "์ด SRT ์์ฝ ์ทจ์ํด์ค"
When not to use
- ๊ฒฐ์ ๊น์ง ์๋์ผ๋ก ๋๋ด์ผ ํ๋ ๊ฒฝ์ฐ
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ฑํ
์ฐฝ์ ์ง์ ๋ณด๋ด๋ ค๋ ๊ฒฝ์ฐ
- SRT๊ฐ ์๋๋ผ KTX/Korail ์๋งค์ธ ๊ฒฝ์ฐ
Prerequisites
- Python 3.10+
python3 -m pip install SRTrain
Required environment variables
KSKILL_SRT_ID
KSKILL_SRT_PASSWORD
Credential resolution order
- ์ด๋ฏธ ํ๊ฒฝ๋ณ์์ ์์ผ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- ์์ด์ ํธ๊ฐ ์์ฒด secret vault(1Password CLI, Bitwarden CLI, macOS Keychain ๋ฑ)๋ฅผ ์ฌ์ฉ ์ค์ด๋ฉด ๊ฑฐ๊ธฐ์ ๊บผ๋ด ํ๊ฒฝ๋ณ์๋ก ์ฃผ์
ํด๋ ๋๋ค.
~/.config/k-skill/secrets.env (๊ธฐ๋ณธ fallback) โ plain dotenv ํ์ผ, ํผ๋ฏธ์
0600.
- ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ์ ์ ์๊ฒ ๋ฌผ์ด์ 2 ๋๋ 3์ ์ ์ฅํ๋ค.
๊ธฐ๋ณธ ๊ฒฝ๋ก์ ์ ์ฅํ๋ ๊ฒ์ fallback์ผ ๋ฟ, ๊ฐ์ ๊ฐ ์๋๋ค.
Inputs
- ์ถ๋ฐ์ญ
- ๋์ฐฉ์ญ
- ๋ ์ง:
YYYYMMDD
- ํฌ๋ง ์์ ์๊ฐ:
HHMMSS
- ์ธ์ ์์ ์น๊ฐ ์ ํ
- ์ข์ ์ ํธ: ์ผ๋ฐ์ค / ํน์ค
- ์ข์ ์์ธ ์กฐ๊ฑด: ๊ฐ์ค ๋ฑ๊ธ, ํธ์ฐจ ๋ฒํธ, ์ข์ ๋ฒํธ, ๋น ์ข์๋ง ๋ณด๊ธฐ, ํ์ ์ฐ์ ์์
Workflow
0. Install the package globally when missing
python3 -c 'import SRT' ๊ฐ ์คํจํ๋ฉด ๋ค๋ฅธ ๊ตฌํ์ผ๋ก ์ฐํํ์ง ๋ง๊ณ ์ ์ญ Python ํจํค์ง ์ค์น๋ฅผ ๋จผ์ ์๋ํ๋ค.
python3 -m pip install SRTrain
1. Ensure credentials are available
KSKILL_SRT_ID, KSKILL_SRT_PASSWORD ํ๊ฒฝ๋ณ์๊ฐ ์ค์ ๋์ด ์๋์ง ํ์ธํ๋ค. ์์ผ๋ฉด ์ credential resolution order์ ๋ฐ๋ผ ํ๋ณดํ๋ค.
์ํฌ๋ฆฟ์ด ์๋ค๋ ์ด์ ๋ก ์น์ฌ์ดํธ๋ฅผ ์ง์ ๊ธ๊ฑฐ๋ ๋ค๋ฅธ ๋น๊ณต์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ง ์๋๋ค.
2. Search first
๋จผ์ helper ๋ก ์กฐํํด์ ํ๋ณด๋ฅผ ์์ฝํ๋ค.
python3 scripts/srt_booking.py search ์์ ๋ถ์ฐ 20260328 080000 --time-limit 120000 --limit 5
3. Summarize options before side effects
์์ฝ ์ ์๋ ํญ์ ์๋๋ฅผ ์งง๊ฒ ์ ๋ฆฌํ๋ค.
- ์ถ๋ฐ/๋์ฐฉ ์๊ฐ
- ์ผ๋ฐ์ค/ํน์ค ๊ฐ๋ฅ ์ฌ๋ถ
- ์์ ์ด์
4. Inspect detailed seats when the user asks for seat numbers
search ์ ์ข์ ๊ฐ๋ฅ ์ฌ๋ถ๋ ์ด์ฐจ ๋จ์ ํ๋๊ทธ๋ค. ์ฌ์ฉ์๊ฐ "๋จ์ ์ข์ ๋ฒํธ", "ํธ์ฐจ๋ณ ์ข์", "ํน์ ์ข์", "์ฐฝ์ธก/์๋ฐฉํฅ ์๋ฆฌ", "์์ฝ ์ ์ ์๋ฆฌ ํ์ธ"์ฒ๋ผ ๊ตฌ์ฒด์ ์ธ ์ข์์ ๋ฌผ์ผ๋ฉด ์์ฝ ์ ์ seats ๋ฅผ ํธ์ถํ๋ค.
python3 scripts/srt_booking.py seats ์์ ๋ถ์ฐ 20260328 080000 --train-id <train_id>
ํน์ ํธ์ฐจ์ ๋น ์ข์๋ง ํ์ธํ๋ ค๋ฉด --car-no ์ --available-only ๋ฅผ ์ด๋ค.
python3 scripts/srt_booking.py seats ์์ ๋ถ์ฐ 20260328 080000 --train-id <train_id> --car-no 5 --available-only
ํน์ ์ข์์ด ๋น์๋์ง ํ์ธํ๋ ค๋ฉด --seat ๋ฅผ ๋ถ์ธ๋ค.
python3 scripts/srt_booking.py seats ์์ ๋ถ์ฐ 20260328 080000 --train-id <train_id> --car-no 5 --seat 11A
ํน์ ํธ์ฐจ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๊ฐ์ด๋ฐ ํธ์ฐจ๋ถํฐ ํ์ํ๋ค. --car-priority center|low|high ๋ก ํธ์ฐจ ํ์ ์์๋ฅผ ๋ฐ๊พธ๊ณ , --seat-priority forward-window|window-forward|row-low ๋ก ์ข์ ์ ๋ ฌ ์ฐ์ ์์๋ฅผ ๋ฐ๊พผ๋ค.
์์ธ ์ข์ ์๋ต์ ๋ณด์ฌ์ค ๋๋ ์๋๋ฅผ ์ฐ์ ์์ฝํ๋ค.
- ํธ์ฐจ๋ณ
available_seat_count
- ๋จ์ ์ข์ ๋ฒํธ (
available_seats)
- ์ข์๋ณ
direction, position
- ํน์ ์ข์ ์์ฒญ์ด๋ฉด
requested_seat_available
์ด ๊ธฐ๋ฅ์ ์ข์์ ์ ํ/์ ์ ํ์ง ์๋๋ค. ์ค์ ์์ฝ์ ๋ค์ ๋จ๊ณ์์๋ง ์งํํ๋ค.
5. Reserve only after the train is fixed
์์ฝ์ ๋ถ์์ฉ์ด ์์ผ๋ฏ๋ก ์ ํํ ์ด์ฐจ๋ฅผ ๊ณ ๋ฅธ ๋ค์๋ง ์งํํ๋ค.
python3 - <<'PY'
import os
from SRT import Adult, SRT, SeatType
srt = SRT(os.environ["KSKILL_SRT_ID"], os.environ["KSKILL_SRT_PASSWORD"])
trains = srt.search_train("์์", "๋ถ์ฐ", "20260328", "080000", time_limit="120000")
reservation = srt.reserve(
trains[0],
passengers=[Adult(1)],
special_seat=SeatType.GENERAL_FIRST,
)
print(reservation)
PY
6. Inspect or cancel
์ทจ์ ์ ์๋ ๋์ ์์ฝ์ ๋ค์ ์๋ณํ๋ค.
python3 - <<'PY'
import os
from SRT import SRT
srt = SRT(os.environ["KSKILL_SRT_ID"], os.environ["KSKILL_SRT_PASSWORD"])
reservations = srt.get_reservations()
print(reservations)
PY
Done when
- ์กฐํ ์์ฒญ์ด๋ฉด ํ๋ณด ์ด์ฐจ๊ฐ ์ ๋ฆฌ๋์ด ์๋ค
- ์ข์ ์์ธ ํ์ธ์ด๋ฉด ํธ์ฐจ๋ณ ๋จ์ ์ข์๋ฒํธ๋ ํน์ ์ข์ ๊ณต์ ์ฌ๋ถ๊ฐ ์ ๋ฆฌ๋์ด ์๋ค
- ์์ฝ ์์ฒญ์ด๋ฉด ์์ฝ ๊ฒฐ๊ณผ, ์ด์, ๊ตฌ์
๊ธฐํ์ด ํ์ธ๋์ด ์๋ค
- ์ทจ์ ์์ฒญ์ด๋ฉด ์ด๋ค ์์ฝ์ ์ทจ์ํ๋์ง ๋ช
ํํ๋ค
Failure modes
- ๋ก๊ทธ์ธ ์ค๋ฅ: ๊ณ์ ์ ๋ณด๋ SRT site policy ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ํ์ธ
- ๋งค์ง: ๋ค๋ฅธ ์๊ฐ๋๋ ์ข์ ํ์
์ผ๋ก ์ฌ์กฐํ
- ์ข์์ ํ ํ์ด์ง ํ์ ๋ณ๊ฒฝ: helper ํ์ ์
๋ฐ์ดํธ ํ์
- ๋คํธ์ํฌ ์ค๋ฅ: ์งง๊ฒ ์ฌ์๋ํ๋ aggressive polling์ ํผํ๊ธฐ
Notes
- ์์ธ ์ข์ ํ์ธ์ SRT ์น ์ข์์ ํ ํ์ด์ง๋ฅผ ์กฐํ ์ ์ฉ์ผ๋ก ์ฝ๋๋ค
SRTrain์ SRT ์ ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ์ ์คํฌ ์๋๊ฐ ๋ ์ ๋ช
ํ๋ค
- ๊ฒฐ์ ์๋ฃ๊น์ง๋ ์๋ํํ์ง ์๋๋ค
- ์๋ ์ฌ์๋ ๋ฃจํ๋ ๊ณ์ ๋ณดํธ ์ฐจ์์์ ์งง๊ณ ๋ณด์์ ์ผ๋ก ์ ์งํ๋ค