AI 음악 큐레이터 텔레그램 봇 개발기

소개

대화를 나누면 감정을 파악해서 어울리는 음악을 추천하고, 감동적인 문구와 함께 텔레그램 채널에 발행하는 AI 봇

진행 방법

기술 스택

  • Python 3.11 + python-telegram-bot v21

  • OpenRouter API (LLM — 모델 교체 가능)

  • YouTube Data API v3

  • fly.io(배포) - 항상 리스닝 해야 해선 선택

  • GitHub (코드 관리)

코드작성 : claude code


핵심 플로우

사용자 대화 → 감정/상황 파악 → 음악 추천 (발라드 3 + 신나는 3)
→ 곡 선택 → 문구 추천 (3가지) → 문구 선택 → 채널 발행

개발 과정

1단계 — 기획 및 방향 전환

처음엔 웹 UI로 시작하려 했으나, 텔레그램 챗봇으로 방향 전환. 복잡한 UI 없이 대화만으로 모든 흐름을 처리하는 구조로 단순화.

💡 인사이트: 챗봇은 별도 UI 없이 대화 자체가 인터페이스가 된다. 단순함이 최선.

2단계 — 개발 환경 구성

  • GitHub 레포 생성 후 로컬과 동기화

  • .env로 API 키 관리 (TELEGRAM, OPENROUTER, YOUTUBE)

  • OpenRouter 선택 이유: 다양한 LLM 모델을 하나의 API로 사용 가능, 모델 교체가 쉬움

3단계 — 핵심 기능 개발

AI 대화

  • 3턴 이상 대화 후 자연스럽게 음악 추천으로 유도

  • 키워드 추출 → 발라드 / 신나는 곡 두 카테고리로 분류

  • LLM이 후보 중 최적 3곡 선별

YouTube 검색

  • 플레이리스트 제외: API 레벨 (videoduration=medium) + 제목 키워드 필터

  • 어린이 콘텐츠 제외: 동요/운동회 등 키워드 필터

  • 공식 채널 우선: official/vevo 키워드 + 구독자 5만 이상

  • 조회수 10만 이상만 추천

문구 생성

  • 댓글 인용 / 명언 인용 / 창작 — 3가지 타입으로 다양하게 생성

4단계 — UX 개선

  • 음악 목록에 YouTube 링크 삽입 → 들어보고 선택 가능

  • "다른 곡 찾기" / "다른 문구 찾기" 버튼 추가

  • 문구 전체 텍스트 먼저 표시 후 [A][B][C] 버튼 선택 방식으로 가독성 개선

  • 다시 찾기 시 이미 본 곡 제외 + 후보 셔플로 다양성 확보

5단계 — 배포 (fly.io)

  • Dockerfile 작성

  • fly launch로 앱 초기화, [http_service] 섹션 제거 (폴링 봇은 HTTP 불필요)

  • fly secrets set으로 환경변수 등록

  • fly deploy로 배포 완료


결과와 배운 점

1. 단순함이 최선

웹 UI → 텔레그램 봇으로 전환하면서 개발 복잡도가 크게 줄었고, 실제 사용성은 오히려 올라갔다. 처음부터 가장 단순한 형태로 시작하는 것이 중요하다.

2. API 조합의 힘

LLM + YouTube API + Telegram API 세 가지를 조합하는 것만으로 꽤 정교한 서비스가 만들어진다. 각 API의 역할을 명확히 분리하는 것이 유지보수에 유리하다.

3. YouTube 검색은 생각보다 까다롭다

단순 키워드 검색만으론 플레이리스트, 어린이 콘텐츠, 저품질 영상이 섞인다. API 레벨 필터 + 후처리 필터를 다층으로 적용해야 원하는 결과를 얻을 수 있다.

4. 환경변수 관리는 처음부터 철저하게

.env는 절대 GitHub에 올리지 않고, 배포 환경에서는 secrets로 따로 관리하는 습관이 중요하다. 보안 설계는 나중에 바꾸기 어렵다.

5. 로컬과 배포 환경 분리

폴링 봇은 동시에 두 곳에서 실행하면 충돌이 난다. 로컬 테스트 시 fly scale count 0으로 서버를 잠깐 내리는 루틴을 만들어두는 것이 좋다.

2
2개의 답글
지피터스 뉴스레터

이번 주 AI, 딱 쓸 것만

매주 월요일 오후,
읽고 바로 써먹을 AI 소식만