Files
news-summary-bot/CLAUDE.md
sm4640 d4bd508618
All checks were successful
news-summary-bot-cicd / build_push_deploy (push) Successful in 4m40s
Fix: [2.0.3] yt-dlp 쿠키 인증 추가, 문서 업데이트, CI/CD .md 스킵
- yt-dlp에 쿠키 파일(/app/cookies.txt) 지원 추가 (YouTube 봇 감지 우회)
- CI/CD에 paths-ignore: **/*.md 추가하여 문서 수정 시 빌드 스킵
- 전체 문서 업데이트: 라우트 변경, 쿠키 인증 방식, n8n Expression 모드 안내
- .gitignore에 cookies.txt 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 15:45:12 +09:00

62 lines
2.2 KiB
Markdown

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 프로젝트 개요
YouTube 뉴스/경제 채널의 새 영상을 감지하면 자막을 추출하고 Claude API로 요약한 뒤 Discord로 전송하는 봇.
- 영상 감지: n8n RSS 트리거 (외부)
- 요약 처리: FastAPI 앱 (이 레포)
- 배포: Docker Hub → OCI 서버에서 docker-compose pull
## 빌드 & 실행
```bash
# 로컬 개발
pip install -r requirements.txt
uvicorn app.main:app --reload
# Docker
docker build -t nkey/news-summary-bot .
docker compose up
```
## 아키텍처
n8n(RSS 감지) → `POST /api/news/summarize` → 자막 추출 → Claude 요약 → Discord 웹훅
- `app/main.py` — FastAPI 엔드포인트 (`/summarize`, `/health`) — Nginx가 `/api/news/` prefix를 strip
- `app/transcript.py` — YouTube 자막 추출 (`yt-dlp` + 쿠키 인증)
- `app/summarizer.py` — Claude Sonnet 4.6으로 요약 생성
- `app/discord.py` — Discord 웹훅 전송
- `app/config.py` — 환경변수 설정 (pydantic-settings)
## 환경변수
`ANTHROPIC_API_KEY`, `DISCORD_WEBHOOK_URL` 필수. `API_SECRET`은 선택(n8n → FastAPI 인증용).
## 쿠키 인증 (YouTube 봇 감지 우회)
OCI 등 클라우드 서버에서 YouTube 자막 추출 시 봇 감지 차단을 우회하기 위해 쿠키 파일이 필요.
- 브라우저 확장(Get cookies.txt LOCALLY 등)으로 YouTube 쿠키를 `cookies.txt`로 export
- 서버의 `compose.apps.yml`에서 `./news-summary-bot/cookies.txt:/app/cookies.txt:ro`로 마운트
- 쿠키 만료 시(6개월~1년) 재export 필요 → 500 에러 발생 시 쿠키 갱신 확인
## n8n 워크플로우
```
RSS Feed Trigger (채널A) ──┐
├→ Merge → HTTP Request (POST /api/news/summarize)
RSS Feed Trigger (채널B) ──┘
```
- **RSS Feed Trigger**: 채널별 RSS URL로 새 영상만 감지 (중복 방지 내장, Poll Time으로 주기 설정)
- **Merge**: 두 채널의 새 영상을 하나의 리스트로 합침
- **HTTP Request**: 각 영상마다 `POST <서버IP>/api/news/summarize` 호출
요청 바디:
```json
{"video_url": "https://youtu.be/xxx", "title": "영상 제목"}
```
`API_SECRET` 설정 시 헤더에 `X-Api-Secret` 포함.