- 요약을 JSON으로 구조화: oneliner, main_points, conclusion 분리 - Claude에게 JSON 형식으로만 응답하도록 프롬프트 변경 - n8n Discord 임베드: 섹션별 필드 분리, 이모지, 타임스탬프 추가 - JSON.stringify Expression으로 특수문자 이스케이프 처리 - 전체 문서 API 응답 형식 업데이트 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.4 KiB
News Summary Bot
YouTube 뉴스/경제 채널의 새 영상을 감지하면 자막을 추출하고, Claude API로 요약하는 봇입니다.
아키텍처
n8n (YouTube Data API로 새 영상 감지) → POST /api/news/summarize → 자막 추출 → Claude 요약 → JSON 응답 → n8n이 Discord 웹훅 전송
| 모듈 | 역할 |
|---|---|
app/main.py |
FastAPI 엔드포인트 |
app/transcript.py |
YouTube 자막 추출 (yt-dlp + 쿠키 인증) |
app/summarizer.py |
Claude Sonnet 4.6으로 요약 생성 |
app/config.py |
환경변수 설정 (pydantic-settings) |
빠른 시작
환경변수 설정
cp .env.example .env
# .env 파일에서 아래 값을 수정
| 변수 | 필수 | 설명 |
|---|---|---|
ANTHROPIC_API_KEY |
O | Claude API 키 |
API_SECRET |
X | n8n → FastAPI 인증용 시크릿 |
로컬 개발
pip install -r requirements.txt
uvicorn app.main:app --reload
Docker
docker build -t nkey/news-summary-bot .
docker compose up
쿠키 파일 (서버 배포 시 필수)
OCI 등 클라우드 서버에서는 YouTube가 데이터센터 IP를 봇으로 감지하여 자막 추출을 차단합니다. 이를 우회하기 위해 쿠키 파일이 필요합니다.
- Chrome 확장 Get cookies.txt LOCALLY로 YouTube 쿠키 export
- 서버에
cookies.txt업로드 compose.apps.yml에서 볼륨 마운트:./news-summary-bot/cookies.txt:/app/cookies.txt:ro
쿠키는 6개월~1년 후 만료됩니다. 자막 추출 에러 발생 시 쿠키 재export가 필요합니다.
API
POST /api/news/summarize (외부) / POST /summarize (내부)
영상 URL을 받아 자막 추출 → 요약을 수행하고 JSON으로 결과를 반환합니다. Discord 전송은 n8n에서 처리합니다.
Request:
{
"video_url": "https://youtu.be/xxx",
"title": "영상 제목"
}
API_SECRET 설정 시 헤더에 X-Api-Secret 포함 필요.
Response:
// 성공
{"video_url": "...", "title": "...", "channel_name": "...", "status": "ok", "oneliner": "한줄 요약", "main_points": "• 포인트1\n• 포인트2", "conclusion": "결론"}
// 스킵 (라이브/쇼츠)
{"video_url": "...", "title": "...", "channel_name": "...", "status": "skipped", "reason": "라이브/예정 영상은 요약 대상이 아닙니다"}
// 에러
{"video_url": "...", "title": "...", "channel_name": "...", "status": "error", "error_type": "ValueError", "error_message": "..."}
GET /api/news/health (외부) / GET /health (내부)
헬스 체크 엔드포인트.
참고: Nginx가
/api/news/prefix를 strip하므로, FastAPI 내부 라우트는/summarize,/health입니다. 외부에서는/api/news/summarize,/api/news/health로 접근합니다.
n8n 워크플로우
n8n에서 YouTube Data API v3의 playlistItems.list로 채널별 새 영상을 감지하고, 각 영상마다 이 봇의 API를 호출합니다. 응답의 status 필드로 분기하여 Discord 웹훅으로 요약 또는 에러 알림을 전송합니다.
자세한 설정은 docs/n8n-setup.md를 참고하세요.
배포
CI/CD가 설정되어 있어 main 브랜치에 push하면 자동으로 Docker 이미지 빌드 → Docker Hub push → OCI 서버 배포가 진행됩니다. 자세한 내용은 docs/operations.md를 참고하세요.