텔레그램 봇 만들기 #2: 일정을 받아볼 방법을 고민하다 봇을 만들기까지

soleil_lucy·6일 전

지난 글에서는 "왜 이 봇을 만들기로 했는가"를 다뤘습니다. 할 일을 자꾸 미루는 패턴을 발견하고, '일정이 눈앞에 보이게 하자'는 생각에 도달한 끝에 다음과 같은 MVP 범위를 정했습니다.

MVP 핵심 기능:

  • weekly_plan.md를 읽어서 오늘 분량만 추출
  • AI가 오늘 맞춤 브리핑 작성
  • 텔레그램으로 푸시
  • 매일 자동 실행

이번 글은 이 MVP를 실제로 어떻게 만들었는지에 대한 기록입니다. 특히 "매일 아침 일정을 어떻게 받아볼까"를 고민하다 텔레그램 봇에 도달한 과정과, 그 봇을 Claude와 함께 어떻게 제작했는지에 초점을 맞췄습니다.

1. 매일 아침 어떻게 받아볼까

오전 알바 때문에 일찍 일어나는 편이라, 일어날 때쯤 그날 일정을 받아보고 싶었습니다. 오전 5시에 "오늘 어떤 일을 하면 된다"는 메시지를 받으면, 하루를 어떻게 보낼지 상상하면서 할 일을 덜 미루게 될 것이라고 생각했습니다.

그렇다면 어떤 메신저로 받을까?

카카오톡과 라인이 먼저 떠올랐습니다. 하지만 카카오톡엔 개인 메시지가, 라인엔 알바 업무 연락이 쌓여 있어서, 둘 다 브리핑을 받기엔 다른 대화에 묻힐 게 뻔했습니다. 일정과 관련된 메시지는 분리하는게 좋겠다 생각했습니다.

그러다 SNS에서 텔레그램을 개인 비서처럼 쓰는 사례를 보고, 텔레그램을 써봐야겠다고 생각했습니다.

게다가 텔레그램은 봇을 직접 만들어 쓸 수 있었습니다. 그렇게 "텔레그램 봇을 만들어보자"로 마음을 정했습니다.

2. 봇을 어떻게 설계했나

봇이 하는 일은 세 단계입니다.

  1. 내 일주일 계획을 읽고
  2. 그중 오늘 것만 골라 메시지로 정리하고
  3. 텔레그램으로 보낸다

1단계 — 일주일 계획은 weekly_plan.md 파일 하나에 둔다

봇이 일정 브리핑 메시지를 보내주기 위해서 "오늘 뭘 해야 하는지"를 알아야 하는데, 그 정보를 어디에 둘지가 고민했습니다. DB에 저장하는 선택지도 있었지만, 제 계획은 일주일에 한 번 일요일에만 작성하고, 일주일이 지난 계획은 따로 기억해둘 필요도 없었습니다. 그래서 DB를 쓰지 않고 마크다운 파일 하나만 두고 매주 새로 작성하는 방식이 더 낫다고 봤습니다.

파일 위쪽에는 이번 주 방향성과 목표가 있고, 그 아래에 요일별 상세 계획이 섹션으로 이어집니다. 봇이 실제로 뽑아 쓰는 건 이 요일별 섹션이고, 한 칸은 대략 아래와 같이 생겼습니다.

### 📅 5/12 (화) — 첫 지원의 날 / 지원용 자산 최소 개선

| 시간        | 일정                           |
| ----------- | ------------------------------ |
| 06:00~12:30 | 아르바이트                     |
| 14:30~17:00 | 메인 작업: 지원 1~2건 + README |

**오늘의 핵심:** 지원 + 지원용 자산 최소 개선.

- **최소 목표:** GitHub README 1개 수정 + 지원 1건
- **기본 목표:** 지원 2건
- **여유 목표:** 채용 공고 추가 탐색

시간표뿐 아니라 "오늘의 핵심", 그리고 최소, 기본, 여유 단계별 목표까지 한 덩어리로 들어 있습니다. 봇은 이런 요일 섹션 일곱 개 중 오늘 것만 골라내야 합니다.

2단계 — 오늘 일정을 비서처럼 브리핑하는 일은 AI에게 맡긴다

파일 하나에 일주일 치가 다 들어 있으니, 봇은 그중 오늘 분량만 뽑아 말해줘야 합니다. 계획표 원문은 표와 불릿이 빼곡해서 아침에 한눈에 들어오지 않습니다. 그래서 AI에게 "오늘 날짜에 해당하는 부분을 찾아, 개인 비서가 일정을 브리핑하듯 정리해줘"라고 맡겼습니다. 코드에서는 오늘 날짜와 요일을 한국 시간 기준으로 계산해, 계획표 전문과 함께 AI에 넘깁니다.

그 "비서처럼"을 말이 아니라 프롬프트에 작성해 두었습니다. 시스템 프롬프트는 CO-STAR 프레임워크로 짰고, 비서의 역할(계획표 내용만 옮기고 없는 일정은 만들지 않기)부터 출력 형식, 톤까지 모두 여기에 담았습니다.

시스템 프롬프트

# Context (배경)
사용자는 취업 준비 중이며, 매일 아침 KST 05:00에 이 브리핑을 텔레그램으로 받습니다.
사용자는 알바, 스터디, 러닝, 관계 유지를 병행하고 있고,
"자기검열" 경향(스스로를 가혹하게 평가하는 사고 패턴)이 있어
"행동 기준 평가"가 매우 중요합니다.
사용자에게는 이미 잘 짜여진 주간 계획표(weekly_plan.md)가 있으며,
브리핑은 그 계획표에서 오늘 분량만 뽑아 정리하는 역할입니다.

# Objective (목표)
주간 계획표에서 오늘 날짜 섹션을 정확히 찾아,
사용자가 "오늘 무엇을 / 언제 / 얼마나 하면 되는지"를
한눈에 파악하도록 정리한 브리핑 메시지를 작성합니다.
새로운 일정을 만들어내지 않고, 계획표에 적힌 내용을 충실히 옮깁니다.

# Style (스타일)
- 출력은 텔레그램 HTML 형식만 사용. 허용 태그: <b>, <i>, <code>
- 마크다운(#, ##, **, *, -)은 절대 사용하지 마세요. 텔레그램에서 깨집니다.
- 목록은 "• " (불릿 + 공백)으로 시작
- 섹션 헤더는 "이모지 + <b>제목</b>" 형식 (예: 🎯 <b>목표</b>)
- 응답에 코드 블록(```)이나 백틱을 쓰지 마세요
- 분량: 600~1000자 (한국어 글자 수 기준)

# Tone (톤)
따뜻하지만 단호함. 동기부여보다 명확함이 우선.
"화이팅", "할 수 있어!" 같은 공허한 응원 금지.
사용자의 자기검열을 자극하지 않도록, "행동 기준"으로 말해주세요.
(예: "지원 1건 제출 = 오늘 성공" 처럼 결과가 아닌 행동으로)

# Audience (청중)
청중은 본인 1명. 취업 준비 중이며,
탈락 누적으로 "지원 = 고통"으로 학습된 상태입니다.
자기검열에 빠지기 쉬워 "결과/숫자"보다 "행동/리듬"으로 평가받기를 원합니다.

# Response (응답 형식)
반드시 아래 구조 그대로, 빈 줄 포함해서 출력하세요.

🌅 <b>{M/D(요일)} 일정 브리핑</b>

🎯 <b>목표</b>
• 최소 목표: ...
• 기본 목표: ...
• 여유가 된다면: ...

📋 <b>오늘의 할일</b>
• (시간) 작업명

🚫 <b>회피 행동 경고</b>
• ...

💪 <b>한마디</b>
(2~3줄. 행동 기준 평가, 자기검열 경계, 차분한 응원)

규칙:
- 인사말 없이 바로 본문부터
- 위 5개 섹션 외 다른 섹션 추가 금지
- 계획표에 없는 일을 만들어 넣지 말 것

3단계 — 완성된 메시지를 텔레그램으로 보낸다

이렇게 AI가 써준 브리핑을 텔레그램으로 메시지를 보내줍니다. 읽고(1단계), 정리하고(2단계), 보내는(3단계) 구조입니다.

3. Claude와의 대화로 전체 구조 잡기

방향은 정했지만 텔레그램 봇을 만들어본 적은 없었습니다. 그래서 인프라는 최소로 하고 일정은 마크다운으로 관리하면서, 매일 아침 브리핑을 보내는 봇을 어떻게 구성하면 좋을지 Claude와 이야기를 나눴습니다.

봇 토큰 발급부터 메시지 전송, 스케줄링까지 하나도 해본 적이 없었지만, 그 대화를 통해 아래와 같은 전체 설계를 잡을 수 있었습니다.

텔레그램 봇 시퀀스 다이어그램

매일 새벽 5시에 GitHub Actions가 봇을 깨우면, 봇은 계획 파일에 오늘 날짜가 있는지 먼저 확인합니다. 있으면 AI가 쓴 브리핑을, 없으면 "계획을 업데이트하세요" 리마인더를 텔레그램으로 보냅니다.

4. GitHub Actions로 무료 스케줄 걸어놓기

마지막으로, 매일 아침 5시에 메시지를 받기 위해 텔레그램 봇을 GitHub Actions로 스케줄에 걸어뒀습니다. 별도 서버 없이 무료로 매일 자동 실행할 수 있습니다.

on:
  schedule:
    - cron: "0 20 * * *" # UTC 20:00 = KST 05:00
  workflow_dispatch:

마치며

스케줄을 걸어둔 다음 날, 아침 5시에 올 줄 알았던 메시지가 오지 않았습니다. 한참을 기다리다 확인해 보니, 한 시간 늦은 오전 6시에 도착해 있었습니다.

분명 cron은 KST 05:00에 맞춰뒀는데 왜 6시에 왔는지, 스케줄 설정이 잘못된 건지는 다음 글에서 직접 확인해 보려 합니다.

profile
여행과 책을 좋아하는 개발자입니다.

0개의 댓글