# 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) | ## 빠른 시작 ### 환경변수 설정 ```bash cp .env.example .env # .env 파일에서 아래 값을 수정 ``` | 변수 | 필수 | 설명 | |------|------|------| | `ANTHROPIC_API_KEY` | O | Claude API 키 | | `API_SECRET` | X | n8n → FastAPI 인증용 시크릿 | ### 로컬 개발 ```bash pip install -r requirements.txt uvicorn app.main:app --reload ``` ### Docker ```bash docker build -t nkey/news-summary-bot . docker compose up ``` ### 쿠키 파일 (서버 배포 시 필수) OCI 등 클라우드 서버에서는 YouTube가 데이터센터 IP를 봇으로 감지하여 자막 추출을 차단합니다. 이를 우회하기 위해 쿠키 파일이 필요합니다. 1. Chrome 확장 **Get cookies.txt LOCALLY**로 YouTube 쿠키 export 2. 서버에 `cookies.txt` 업로드 3. `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:** ```json { "video_url": "https://youtu.be/xxx", "title": "영상 제목" } ``` `API_SECRET` 설정 시 헤더에 `X-Api-Secret` 포함 필요. **Response:** ```json // 성공 {"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](docs/n8n-setup.md)를 참고하세요. ## 배포 CI/CD가 설정되어 있어 main 브랜치에 push하면 자동으로 Docker 이미지 빌드 → Docker Hub push → OCI 서버 배포가 진행됩니다. 자세한 내용은 [docs/operations.md](docs/operations.md)를 참고하세요.