좋아하는 가수 공연은 늘 늦게 보게 됩니다. 오늘 만드는 건 콘서트 알림봇이고, KOPIS에 새 공연이 잡히면 텔레그램으로 바로 오게 할 겁니다. 지난편에서 옷 중복구매를 막았다면, 오늘은 티켓 놓치는 걸 막아보자구요.
완성 모습은 단순합니다. 텔레그램에 공연명, 날짜, 장소, 장르 네 줄이 오면 끝입니다. 첫 알림까지 5분도 안 걸리고, 그다음부터 같은 공연을 두 번 안 보내게만 붙이면 진짜 쓰게 되거든요.
준비는 하나면 끝
둘 다 필요 없습니다. Claude Code나 Codex 중 하나만 고르면 되고, 저는 Claude Code로 갈게요. Claude Code 쓰는 분은 터미널에서 claude만 열면 되고, Codex 쓰는 분도 아래 프롬프트를 거의 그대로 붙여넣으면 됩니다.
환경변수는 세 개만 있으면 됩니다. KOPIS_SERVICE_KEY, TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID. 여기까지 적었으면 절반은 끝났어요.
첫 결과부터 뽑자
1
한 파일짜리로 첫 알림 만들기
AI에게 보낸 프롬프트
파이썬으로 concert_alert.py 하나만 만들어줘.
- 내가 넣는 키워드 1개와 날짜 범위로 KOPIS 공연목록 API를 조회
- 새로 찾은 공연 3개를 텔레그램으로 보내
- 메시지에는 공연명, 날짜, 장소, 장르만 넣어
- 환경변수는 KOPIS_SERVICE_KEY, TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID만 사용
- 첫 버전은 한 파일로 만들고 실행 방법을 맨 아래에 적어줘
왜 이렇게 시켰나: 첫 프롬프트에 욕심내면 AI가 옆길로 갑니다. 콘서트 알림봇은 조회와 전송만 먼저 붙여야 빨리 보입니다.
이렇게 나오면 OK: python concert_alert.py --keyword 데이식스 --from 20260501 --to 20260630를 쳤을 때 텔레그램에 공연 1개 이상이 옵니다.
⚠여기서 이렇게 하면 안 돼요: 처음부터 버튼, DB, 웹페이지, 관리자 화면까지 한 번에 달라고 하면 첫 결과가 늦어집니다.
2
같은 공연 두 번 오지 않게 막기
AI에게 보낸 프롬프트
좋아. 이제 같은 공연을 또 보내지 않게 고쳐줘.
- KOPIS 응답의 mt20id를 기준으로 중복을 막아
- seen_ids.json 파일이 없으면 자동 생성
- 이미 보낸 공연은 건너뛰고 새 공연만 전송
- 전송이 끝난 뒤에만 저장되게 해줘
왜 이렇게 시켰나: 이 한 줄이 핵심입니다. 제목만 비교하면 같은 공연인데 문구가 조금 바뀌어서 또 올 수 있어요.
이렇게 나오면 OK: 같은 날짜 범위로 두 번 돌렸을 때 두 번째 실행에서는 새 공연이 없다고만 뜹니다.
여기서 이렇게 하면 안 돼요: 중복 기준을 공연명으로 잡으면 안 됩니다. 공연명은 비슷하게 바뀌는 경우가 있어서 금방 흔들려요.
3
CLAUDE.md로 말투 고정하기
AI에게 보낸 프롬프트
CLAUDE.md 파일을 만들어줘.
- 텔레그램 메시지는 4줄 이하
- 첫 줄은 새 공연 발견
- 과장 표현 금지
- 공연명, 날짜, 장소를 먼저 보여주고 장르는 마지막 줄에 붙여
- 에러 로그는 한국어 한 줄로 짧게 남겨
왜 이렇게 시켰나: Claude Code는 CLAUDE.md를 계속 읽습니다. 이런 메모가 없으면 콘서트 알림봇 문구가 길어졌다 짧아졌다 하구요.
이렇게 나오면 OK: 새 알림이 올 때마다 형식이 거의 안 흔들립니다. 길게 써서 모바일에서 두 번 접어야 하는 일도 줄어요.
⚠여기서 이렇게 하면 안 돼요: 금지어를 안 적으면 AI가 흥분해서 예매 전쟁, 레전드 같은 말을 섞을 수 있습니다.
4
터질 만한 곳만 짧게 검수하기
AI에게 보낸 프롬프트
지금 만든 파일을 읽고 아래만 점검해줘.
- 환경변수 누락 시 한국어 오류 문구
- KOPIS 응답이 비었을 때 전송 생략
- 텔레그램 요청 실패 시 재시도 1회
- 바뀐 부분만 짧게 설명해줘
왜 이렇게 시켰나: 초보가 많이 막히는 데가 딱 이 셋입니다. 콘서트 알림봇은 여기만 막아도 체감이 확 달라져요.
이렇게 나오면 OK: 키를 빼고 실행했을 때 친절한 오류가 뜨고, 빈 결과면 조용히 끝나고, 텔레그램이 잠깐 흔들려도 한 번 더 시도합니다.
⚠여기서 이렇게 하면 안 돼요: 검수 단계에서 새 기능을 더 달라고 하면 다시 길어집니다. 지금은 넘어지지 않게만 만들면 됩니다.
5
터미널 켜둔 동안 반복 실행 붙이기
AI에게 보낸 프롬프트
/loop 30m python concert_alert.py --keyword 데이식스 --from 20260501 --to 20260630 를 실행하고 새 공연이 있으면 알려줘
왜 이렇게 시켰나: Claude Code 최신 문서에 있는 /loop는 지금 세션이 열려 있는 동안 같은 작업을 다시 돌리기에 딱 맞습니다. 복잡한 스케줄러부터 만지지 않아도 체감이 바로 와요.
이렇게 나오면 OK: Claude Code가 30분마다 같은 명령을 다시 돌리고, 새 공연이 생기면 텔레그램으로 옵니다.
여기서 이렇게 하면 안 돼요: 터미널을 닫아놓고 알림이 오길 기다리면 안 됩니다. 이 반복 실행은 현재 세션이 살아 있을 때만 돕거든요.
여기서 많이 막힌다
1. 아무 알림이 안 옵니다 현상: 명령은 끝나는데 텔레그램이 조용합니다. 새 공연이 없다는 로그만 보일 수도 있어요. 원인: KOPIS 공연정보는 첫 결제 다음날 등록되는 경우가 있어서, 방금 열린 공지가 바로 안 잡힐 때가 있습니다. 키워드를 너무 좁게 넣은 경우도 많구요. 해결: 먼저 KOPIS 사이트에서 같은 키워드로 직접 검색해 보고, 날짜 범위를 한 달 정도 넓혀보세요. 가수명만 넣지 말고 팀명, 공연명 조각, 장르까지 바꿔보면 바로 잡히는 경우가 많습니다.
2. 같은 공연이 계속 옵니다 현상: 아까 받은 공연이 30분 뒤에 또 옵니다. 콘서트 알림봇이 편한 게 아니라 귀찮아져요. 원인: seen_ids.json이 실행 폴더에 안 써지거나, Claude가 저장 순서를 잘못 짠 경우가 흔합니다. 파일은 생겼는데 비어 있는 경우도 있어요. 해결: 실행 뒤에 seen_ids.json이 실제로 채워졌는지 먼저 확인하세요. 비어 있으면 mt20id 저장 위치를 로그로 한 줄 찍게 고치고, 전송 성공 뒤 저장되게 다시 시키면 금방 잡힙니다.
3. 텔레그램 전송만 실패합니다 현상: KOPIS 조회는 되는데 메시지 전송 단계에서 멈춥니다. 가끔 401이나 chat not found 비슷한 문구가 나와요. 원인: 봇 토큰이 틀렸거나, 내 채팅방 ID를 잘못 넣은 경우가 거의 전부입니다. 봇을 방에 초대만 하고 메시지를 한 번도 안 보낸 상태도 자주 걸립니다. 해결: 텔레그램에서 그 봇에게 아무 말이나 한 번 보내고 chat id를 다시 확인하세요. 그다음 Claude Code에 테스트 전송 함수 하나만 따로 만들게 해서 문구 한 줄부터 보내보면 어디서 막히는지 바로 보입니다.
다음엔 한 번 더 찌르게
한 걸음 더
오늘 만든 콘서트 알림봇이 돌아가기 시작하면 이미 꽤 쓸 만합니다. 다음엔 여기에 예매 오픈 하루 전 리마인드만 하나 더 붙여도 티켓 놓치는 일이 확 줄 겁니다.