소개
6월 21일 순천→천안아산 KTX 어른 3명 표를 예매하려다 원하는 시간대(15:48, 16:56 출발)가 이미 매진인 걸 발견했어요.
코레일 앱을 수시로 새로고침하면서 기다리는 건 너무 비효율적이라는 생각이 들었고, 마침 Claude Code와 함께 k-skill이라는 한국형 오픈소스 도구 모음을 발견해서 이걸 활용해 "좌석이나 예약대기가 열리는 순 간 카카오톡으로 자동 알림을 받는 시스템" 을 직접 만들어보기로 했습니다.
단순히 예매 도구를 쓰는 게 아니라, Claude Code와 대화하면서 환경 셋업 → 조회 → 자동화 스크립트 작성 → 알림 연결까지 전 과정을 AI와 함께 진행한 경험이에요.
진행 방법
사용 도구
Claude Code (VS Code 익스텐션)
k-skill — 한국 서비스 전용 MCP 스킬 모음 오픈소스
korail2-ncard + pycryptodome (Python 패키지)
kakaocli (macOS KakaoTalk 자동화 CLI)
Xcode (kakaocli 빌드용)
1단계: k-skill 레포 셋업
먼저 Claude Code에 레포를 가져와달라고 요청했습니다.
사용한 프롬프트:
여기있는 레포 가져와서 사용할수 있게 셋팅해줘. https://github.com/NomaDamas/k-skill
Claude Code가 자동으로 클론 → npm install → 보안 취약점 수정(npm audit fix) → Python 의존성 설치까지 한 번에 진행했습니다.
📸 [스크린샷: 클론 및 설치 완료 화면]
2단계: 코레일 계정 저장
KTX 예매 스킬은 코레일 ID/비밀번호가 필요합니다. Claude Code에 안전하게 저장해달라고 요청했어요.
사 용한 프롬프트:
ID는 (코레일 아이디) 비밀번호는 (비밀번호) 안전하게 저장해줘
~/.config/k-skill/secrets.env에 저장 후 chmod 600으로 본인만 읽을 수 있도록 설정해줬습니다.
3단계: KTX 열차 조회
사용한 프롬프트:
순천역에서 천안아산역으로 가는 6월 21일 일요일 오후 3시~5시 사이 출발 열차 어른 3명 끊고싶어.
처음엔 원하는 시간대 열차가 없다고 나왔는데, 알고 보니 기본값이 매진 열차를 숨기는 구조였습니다. Claude Code가 --include-no-seats 플래그를 추가해 재조회했습니다.
# 처음 조회 (매진 열차 제외)
python3 scripts/ktx_booking.py search 순천 천안아산 20260621 150000 --adults 3 --limit 10
# 매진 포함 전체 조회
python3 scripts/ktx_booking.py search 순천 천안아산 20260621 140000 \
--adults 3 --train-type all \
--include-no-seats --include-waiting-list --limit 20
결과:
열차
출발
도착
상태
KTX-산천 4052
15:48
17:55
❌ 매진, 예약대기 불가
KTX-산천 518
16:56
18:53
❌ 매진, 예약대기 불가
📸 [스크린샷: 조회 결과 JSON 출력]
4단계: 자동 모니터링 스크립트 작성
Claude Code가 두 열차를 10분마다 체크하고 좌석이 열리면 카카오톡으로 알리는 스크립트를 직접 작성해줬습니다.
# scripts/ktx_watch.py
TARGETS = [
{"train_no": "4052", "dep_time": "15:48", "arr_time": "17:55"},
{"train_no": "518", "dep_time": "16:56", "arr_time": "18:53"},
]
def check():
trains = search_trains()
for t in trains:
target = next((x for x in TARGETS if x["train_no"] == t["train_no"]), None)
if target is None:
continue
seat_ok = t.get("has_general_seat") or t.get("has_special_seat")
waiting_ok = t.get("has_waiting_list")
if seat_ok or waiting_ok:
status = "✅ 좌석 있음" if seat_ok else "⏳ 예약대기 가능"
msg = (
f"🚄 KTX 알림!\n"
f"순천 {target['dep_time']} → 천안아산 {target['arr_time']}\n"
f"열차번호: {t['train_no']}\n"
f"{status}\n"
f"빨리 예매하세요!"
)
send_kakao(msg)
그리고 /loop 10m 명령으로 10분마다 자동 실행을 등록했습니다.
사용한 프롬프트:
예약대기나 예매가 가능해지면 카카오톡으로 알람주는 기능같은건 없나??
📸 [스크린샷: 스크립트 실행 결과]
5단계: kakaocli 셋업 (카카오톡 연동)
"나에게 보내기"는 실제 알림이 안 온다는 걸 알고, 오픈채팅방으로 알림을 받는 방식으로 전환하기로 했습니다. 이를 위해 kakaocli 설치가 필요했는데, 빌드에 Xcode 전체가 필요했어요.
사용한 프롬프트:
Xcode 설치해줘
mas(Mac App Store CLI) 자동 설치를 시도했으나 sudo 블로킹으로 실패 → App Store에서 직접 설치.
Xcode 설치 후:
brew install silver-flight-group/tap/kakaocli
이후 KakaoTalk 로컬 DB의 User ID 자동 감지 실패 문제가 발생했는데, k-skill 내장 헬퍼로 해결했습니다:
# kakaocli auth 실패 시 k-skill 헬퍼 사용
python3 scripts/kakaotalk_mac.py auth --refresh
출력:
KakaoTalk auth resolved
- user_id: (본인 ID)
- source: hash-recovery
"나에게 보내기" 테스트 메시지 전송 성공!
kakaocli send --me _ "KTX 알림 테스트 메시지 🚄"
# → Message sent to 'self-chat'.
📸 [스크린샷: 카카오톡에 도착한 테스트 메시지]
결과와 배운 점
최종 결과
KTX 조회, 매진 열차 확인, 10분 폴링 자동화까지는 완성
카카오톡 오픈채팅방 알림 연결은 미완성 (채팅방 인식 문제)
배운 점 & 꿀팁
플래그 하나가 전부를 바꾼다 처음엔 "15~17시 사이 열차가 없다"고 결론 냈는데, 사실 매진 열차가 조회에서 숨겨지는 구조였어요. --include-no-seats 옵션 하나로 완전히 다른 결과가 나왔습니다. AI 도구를 쓸 때 기본값이 무엇을 숨기는지 확인하는 습관이 중요하다는 걸 배웠어요.
k-skill 같은 도메인 특화 오픈소스의 가치 코레일 API 연동, anti-bot 우회, 카카오톡 Mac 자동화 등 혼자 처음부터 만들었다면 며칠이 걸릴 것들이 이미 헬퍼로 준비되어 있었습니다. "바퀴를 다시 발명하지 않는다"는 원칙을 AI와 함께 실천할 수 있었어요.
로컬 자동화의 한계를 알게 됐다 /loop 10m으로 만든 폴링은 Claude 세션이 열려있는 동안만 동작합니다. 진짜 "자는 동안에도 알아서 체크하는" 봇을 원한다면 /schedule로 클라우드에 올려야 한다는 것을 알게 됐어요.
시행착오
문제
원인
해결
원하는 시간대 열차가 없다고 나옴
기본 조회는 매진 열차 미표시
--include-no-seats 플래그 추가
kakaocli 설치 실패
Command Line Tools만으론 빌드 불가
Xcode 전체 설치 필요 (15GB)
mas install sudo 블로킹
비대화형 환경에서 sudo 입력 불가
App Store 앱에서 직접 설치
kakaocli User ID 감지 실패
로컬 DB 암호화 방식 이슈
k-skill 헬퍼로 hash-recovery
오픈채팅방 이름 인식 안 됨
kakaocli가 새 오픈채팅방 미인식
미해결
도움이 필요한 부분
kakaocli 오픈채팅방 인식 문제 kakaocli send "방이름" "메시지" 실행 시 새로 만든 오픈채팅방을 찾지 못해요. kakaocli chats에서도 오픈채팅방은 (unknown)으로 표시됩니다. 오픈채팅방을 알림 채널로 쓸 수 있는 방법을 아시는 분 계신가요?
로컬 스크립트 클라우드 스케줄 전환 ktx_watch.py는 로컬 kakaocli(Mac 앱 의존)를 호출하는 구조라, /schedule로 올리면 kakaocli 부분이 동작하지 않을 것 같아요. 로컬 의존성이 있는 스크립트를 클라우드 스케줄과 연결하는 방 법이 궁금합니다.
앞으로의 계획
오픈채팅방 연결 문제 해결 후 카카오톡 알림 완성하기
알림 받은 후 예매 링크 자동 생성까지 연결하기
/schedule로 클라우드에 올려서 노트북 꺼도 동작하게 업그레이드
도움 받은 글
NomaDamas/k-skill — 한국형 MCP 스킬 오픈소스