매주 하던 KTX 예매, 대화 한 줄로 끝내는 법 🚄

매주 서울과 부산을 오갑니다. 금요일에 내려가고 일요일에 올라오고요.
그런데 이 예매가, 생각보다 손이 많이 갔습니다. 앱 켜고, 시간표 넘겨보고, 자리 잡고, 결제하고. 매주 두 번씩요.
무엇보다 결제가 문제였어요. KTX는 예매하면 결제 기한이 30분 남짓입니다. 회의하다 그 시간을 놓쳐서 표가 통째로 날아간 적이 몇 번 있었어요. 다시 잡으려니 좋은 자리는 이미 없고요.
그래서 이 과정을 통째로 자동화했습니다. 오늘은 그걸 어떻게 했는지, 그리고 하면서 걸렸던 것들을 풀어볼게요.
어떻게 접근했나
핵심은 코레일에 비공식으로 접근하는 파이썬 라이브러리(korail2)였어요. 코레일이 공식 API를 안 열어놔서, 앱이 서버와 주고받는 통신을 흉내 내는 방식입니다.
여기에 제가 검색·예약·알림·캘린더 등록을 하나로 묶는 스크립트를 얹고, 그 스크립트를 Claude가 대화로 실행하게 했어요. 그래서 지금은 이렇게 됩니다.

“다음 주 금요일 저녁 부산행 잡아줘” — 이 한 줄이면 끝.
그러면 뒤에서 이 순서로 돌아가요.
① 검색 — 그 시간대 앞뒤 열차를 훑어서, 소요 시간·운임·자리 여부를 정리해 보여줍니다.
② 예약 — 고른 열차를 성인 1명·일반석으로 잡습니다.
③ 결제 알림 — 예약이 되면 결제 기한(몇 시 몇 분까지)이 딱 나와요. 그걸 바로 알림으로 받습니다.
④ 캘린더 등록 — 확정되면 구글 캘린더에 열차편이 자동으로 들어갑니다.
하면서 걸렸던 것들
여기까지만 들으면 매끄러워 보이는데, 실제로는 몇 군데서 막혔어요. 이게 진짜 알맹이입니다.
하나, 검색 결과가 금방 상해요. 열차를 검색하면 각 열차에 임시 번호표 같은 게 딸려 옵니다. 예약할 때 “아까 그 열차”를 가리키는 용도인데, 이게 몇 분만 지나도 못 쓰게 되더라고요. 검색해두고 뜸을 들이면 예약 단계에서 그냥 실패합니다.
그래서 순서를 바꿨어요. 미리 검색해두고 나중에 예약하는 게 아니라, 예약하기 직전에 한 번 더 검색해서 방금 받은 번호표로 바로 잡습니다.
둘, 좌석을 콕 찍어서 못 잡아요. 라이브러리가 “일반석 우선” 정도만 되고, 창가·통로 같은 지정은 안 됩니다. 그래서 자동으로는 일단 자리를 확보만 하고, 창가·콘센트 자리는 코레일톡에서 직접 바꿉니다. 출발 전까지는 위약금 없이 변경되거든요.
셋, 결제는 여전히 사람이 합니다. 자동 결제까지 손대는 건 위험해서 일부러 안 했어요. 대신 결제 기한 알림을 확실하게 만들어서, “표 날리는 것”만 막았습니다. 자동화의 목표가 완전 무인이 아니라 실수 방지였던 거죠.
프롬프트로 따라 하기
재료는 다 공개돼 있어요. 제가 처음부터 만든 건 없습니다.
핵심 도구는 korail2라는 파이썬 라이브러리예요. 코레일 통신을 파이썬에서 다룰 수 있게 해주는 오픈소스입니다.
korail2 (오픈소스): github.com/carpedm20/korail2
아래는 제가 AI에 던진 프롬프트입니다. 복사해서 쓰시면 돼요. 다만 시작 전에 두 가지만.
하나. 계정 정보는 코드에 절대 박지 마세요. 프롬프트에도 그렇게 시켜뒀습니다. 둘. 실패했을 때 무한정 다시 시도하게 만들지 마세요. 매크로처럼 보이면 계정이 막힙니다. 제 것도 몇 번 시도하고 멈추게 해뒀어요.
1. 열차를 코드로 검색하기
먼저 “예약”까지 가지 말고 검색만 돌려봅니다. 로그인이 되는지, 원하는 열차가 잡히는지부터 확인하는 단계예요. 여기서 막히면 뒤는 다 의미가 없습니다.
프롬프트 — 복사해서 AI에 붙여넣으세요
너는 파이썬 스크립트 작성을 돕는 조수야.
korail2 라이브러리로 KTX 열차를 검색하는 스크립트를 만들어줘.
- 출발역·도착역·날짜·시간대를 입력하면 후보 열차를 표로 보여줘.
각 열차의 출발/도착 시각, 소요 시간, 잔여석 여부가 보이면 좋겠어.
- 계정 정보는 코드에 직접 쓰지 말고 환경변수(.env)로 읽게 해줘.
- 지금 단계에서는 예약하지 마. 검색만.
- 실행 전에 필요한 설치 명령을 먼저 알려주고, 내 확인을 받고 진행해.
이렇게 되면 성공 — 터미널에 열차 목록이 표로 뜹니다. 잔여석이 보이면 다음으로 넘어가세요.
막히면 — 로그인 단계에서 자주 걸립니다. "로그인에서 이런 오류가 났어. 계정 정보를 어떻게 넘겨야 하는지 알려줘" 라고 에러 메시지를 그대로 붙여넣으면 됩니다.
2. 조건에 맞는 열차를 잡기
검색이 되면 예약을 붙입니다. 여기서 중요한 건 어떤 기준으로 고를지를 정해두는 거예요. “금요일 저녁” 같은 말은 사람에겐 명확하지만 코드에겐 아닙니다.
프롬프트
앞의 검색 스크립트에 예약 기능을 붙여줘.
- 후보 중에서 고르는 기준을 내가 정할 수 있게 해줘.
(예: 지정한 시각 이후 가장 빠른 열차 / 특정 시간대 안에서 소요시간이 짧은 것)
- 성인 1명, 일반석 기준으로 예약해줘.
- ⚠️ 실패하면 몇 번만 다시 시도하고 멈춰. 무한 반복은 절대 안 돼.
(매크로로 보이면 계정이 막힐 수 있어)
- 예약이 되면 결제 기한이 언제까지인지 화면에 찍어줘.
- 실제로 예약을 실행하기 전에, 어떤 열차를 잡을 건지 먼저 보여주고 내 확인을 받아.
이렇게 되면 성공 — 예약 번호와 결제 기한이 찍힙니다. 코레일톡 앱에서도 같은 예약이 보이면 제대로 된 거예요.
3. 결제 기한을 알림으로 받기
예약은 결제 안 하면 자동으로 풀립니다. 이걸 놓치면 자동화한 의미가 없어요. 저는 텔레그램으로 받습니다.
프롬프트
예약이 성공하면 내 폰으로 알림이 오게 해줘.
- 알림에 담을 것: 열차 시각, 좌석, 결제 기한.
- 나는 텔레그램을 쓰고 싶어. 봇을 만드는 것부터 알려줘.
- 토큰 같은 비밀값은 코드에 박지 말고 환경변수로.
이렇게 되면 성공 — 예약 직후 폰에 알림이 옵니다. 기한만 보고 결제 누르면 끝이에요.
4. 캘린더에 넣고, 대화로 부르기
마지막입니다. 확정된 열차를 캘린더에 넣고, 이 스크립트 전체를 대화 한 줄로 부를 수 있게 묶습니다.
프롬프트
두 가지를 마무리해줘.
1. 확정된 열차를 구글 캘린더에 일정으로 넣어줘.
제목에 열차 번호와 좌석이 들어가면 좋겠어.
2. 지금까지 만든 걸 명령 하나로 실행할 수 있게 정리해줘.
"다음 주 금요일 저녁 부산행 잡아줘" 같은 말을 받으면
날짜·시간대를 알아서 해석하고 위 흐름을 태우는 형태로.
각 단계에서 뭘 할 건지 먼저 말하고 실행해줘.
이렇게 되면 성공 — 캘린더에 일정이 뜨고, 다음부터는 말 한 줄이면 됩니다.
한 가지, 제 실제 스크립트 전체는 공개하지 않아요. 코레일 계정으로 로그인하는 코드가 들어가서 그대로 배포하기엔 서비스 약관도 걸리고 계정 정보도 민감하거든요. 대신 위 프롬프트면 각자 자기 계정으로 조립하기엔 충분합니다.
그래서 남은 것

대단한 기술은 아니에요. 남이 만든 라이브러리에, 제 스크립트를 얹고, 대화로 부르는 것뿐입니다.
그런데 매주 반복되던 20분짜리 일이 한 줄로 줄었고, 무엇보다 표 날리는 실수가 사라졌어요. 되찾은 그 시간과 신경은 초록이한테 씁니다.
혹시 매주 두세 번씩 반복하는 일이 있다면, 그중 제일 짜증나는 하나부터 이렇게 넘겨보세요. 완벽하게 무인으로 만들 필요도 없어요. 제일 실수하기 쉬운 부분만 기계에 맡겨도 충분하더라고요.
오늘도 한 걸음. 🐴
이 글은 산업 구조와 만드는 과정을 정리한 개인 기록입니다.
특정 종목의 매수·매도 추천이 아니며, 투자 판단과 그 결과는 독자 본인에게 있습니다.