Docs: [3.0.0] 전체 문서 업데이트 — YouTube Data API + n8n Discord 전송 구조 반영
All checks were successful
news-summary-bot-cicd / build_push_deploy (push) Successful in 25m15s
All checks were successful
news-summary-bot-cicd / build_push_deploy (push) Successful in 25m15s
- README: 아키텍처, 환경변수, API 응답 형식 업데이트 - n8n-setup: RSS → YouTube Data API playlistItems 전환, 노드별 상세 설정 - development: discord.py 제거 반영, API 응답 형식 추가 - operations: CI/CD 자동 배포 설명, DISCORD_WEBHOOK_URL 제거 - testing: DISCORD_WEBHOOK_URL 더미값 제거 - .env.example: DISCORD_WEBHOOK_URL 제거 - tests/test_discord.py 삭제 (모듈 삭제됨) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# 개발 가이드
|
||||
|
||||
YouTube 뉴스 영상을 자동 요약하여 Discord로 전송하는 FastAPI 기반 봇의 개발 문서입니다.
|
||||
YouTube 뉴스 영상을 자동 요약하는 FastAPI 기반 봇의 개발 문서입니다.
|
||||
|
||||
## 프로젝트 구조
|
||||
|
||||
@@ -11,8 +11,7 @@ news-summary-bot/
|
||||
│ ├── main.py # FastAPI 엔드포인트 (/summarize, /health)
|
||||
│ ├── config.py # pydantic-settings 환경변수
|
||||
│ ├── transcript.py # yt-dlp + 쿠키로 자막 추출
|
||||
│ ├── summarizer.py # Claude Sonnet 4.6 요약
|
||||
│ └── discord.py # Discord 웹훅 전송
|
||||
│ └── summarizer.py # Claude Sonnet 4.6 요약
|
||||
├── Dockerfile
|
||||
├── docker-compose.yml
|
||||
├── requirements.txt
|
||||
@@ -42,12 +41,25 @@ uvicorn app.main:app --reload
|
||||
|
||||
### POST /summarize
|
||||
|
||||
YouTube 영상 URL을 받아 자막을 추출하고, Claude로 요약한 뒤 Discord 웹훅으로 전송합니다.
|
||||
YouTube 영상 URL을 받아 자막을 추출하고 Claude로 요약합니다. 결과를 JSON으로 반환하며, Discord 전송은 n8n에서 처리합니다.
|
||||
|
||||
- **인증**: `X-Api-Secret` 헤더에 시크릿 값 전달 (API_SECRET 환경변수가 설정된 경우 필수)
|
||||
- **요청 본문**:
|
||||
- `video_url` (string, 필수) — YouTube 영상 URL
|
||||
- `title` (string, 필수) — 영상 제목
|
||||
- `title` (string, 선택) — 영상 제목
|
||||
|
||||
**응답:**
|
||||
|
||||
```json
|
||||
// 성공
|
||||
{"status": "ok", "title": "...", "summary": "요약 텍스트"}
|
||||
|
||||
// 스킵 (라이브/쇼츠)
|
||||
{"status": "skipped", "title": "...", "reason": "..."}
|
||||
|
||||
// 에러
|
||||
{"status": "error", "title": "...", "error_type": "...", "error_message": "..."}
|
||||
```
|
||||
|
||||
### GET /health
|
||||
|
||||
@@ -73,7 +85,7 @@ curl -X POST http://localhost:8000/summarize \
|
||||
}'
|
||||
```
|
||||
|
||||
정상 처리 시 Discord 채널에 요약 메시지가 전송됩니다.
|
||||
정상 처리 시 요약 텍스트가 포함된 JSON 응답이 반환됩니다.
|
||||
|
||||
## 주요 모듈 설명
|
||||
|
||||
@@ -81,16 +93,14 @@ curl -X POST http://localhost:8000/summarize \
|
||||
|
||||
YouTube URL에서 video ID를 추출하고 `yt-dlp`를 사용하여 자막을 가져옵니다. 한국어(`ko`) 자막을 우선으로 시도하며, 없을 경우 영어(`en`) 자막을 fallback으로 사용합니다.
|
||||
|
||||
라이브/예정 영상과 쇼츠는 `SkipVideo` 예외를 발생시켜 스킵합니다. `yt-dlp`의 `DownloadError`에서 라이브 관련 메시지가 감지되면 자동으로 스킵 처리됩니다.
|
||||
|
||||
서버 환경에서는 YouTube 봇 감지를 우회하기 위해 `/app/cookies.txt` 쿠키 파일을 사용합니다. 로컬 개발 시에는 가정용 IP라 쿠키 없이도 동작합니다.
|
||||
|
||||
### summarizer.py
|
||||
|
||||
Anthropic의 **Claude Sonnet 4.6** 모델을 사용하여 자막 텍스트를 요약합니다. 시스템 프롬프트에 뉴스/경제 요약에 최적화된 포맷을 지정하여 일관된 형식의 요약을 생성합니다.
|
||||
|
||||
### discord.py
|
||||
|
||||
요약 결과를 **Discord Embed** 형식으로 구성하여 웹훅 URL로 전송합니다. 영상 제목, 요약 내용, 원본 링크 등을 포함합니다.
|
||||
|
||||
### config.py
|
||||
|
||||
`pydantic-settings`를 사용하여 `.env` 파일 또는 시스템 환경변수에서 설정값을 로드합니다. 필수 값이 누락되면 서버 시작 시 에러가 발생합니다.
|
||||
@@ -100,5 +110,4 @@ Anthropic의 **Claude Sonnet 4.6** 모델을 사용하여 자막 텍스트를
|
||||
| 변수 | 필수 | 설명 |
|
||||
|------|------|------|
|
||||
| `ANTHROPIC_API_KEY` | O | Anthropic API 키 |
|
||||
| `DISCORD_WEBHOOK_URL` | O | Discord 웹훅 URL |
|
||||
| `API_SECRET` | X | n8n → FastAPI 인증용 시크릿 (미설정 시 인증 생략) |
|
||||
|
||||
Reference in New Issue
Block a user