feat: YouTube Shorts 파이프라인 완성 및 HJW TV 업로드 연동

- youtube_uploader.py: YOUTUBE_REFRESH_TOKEN/CLIENT_ID/CLIENT_SECRET 환경변수 폴백 추가
  (token.json 없는 Docker 환경에서 브랜드 계정 인증 가능)
- shorts_config.json: corners_eligible를 실제 블로그 코너명으로 수정
- caption_renderer.py: render_captions() 반환값 누락 수정
- get_token.py: web→installed 타입 변환, port 8080 고정, prompt=consent 추가
- get_youtube_token.py: YouTube 전용 OAuth 토큰 발급 스크립트 (별도 클라이언트)
- CLAUDE.md: 프로젝트 개요, 배포 방법, 핵심 파일, YouTube 채널 정보 추가
- publisher_bot.py: 이미지 분산 배치, SEO 검증, 버그 수정
- scheduler.py: 알림 강화, atomic write, 중복 방지, hot reload 개선

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
JOUNGWOOK KWON
2026-04-06 09:27:48 +09:00
parent 15dfc39f0f
commit fb5e6ddbdf
8 changed files with 410 additions and 41 deletions

View File

@@ -2,7 +2,11 @@
이 파일은 Claude Code가 어느 경로에서 실행되든 자동으로 로드합니다.
## 프로젝트 개요
- 블로그 자동화 시스템 (수집 → AI 작성 → 변환 → 발행 → 배포)
- 블로그: eli-ai.blogspot.com ("AI? 그게 뭔데?")
- 운영자: eli (텔레그램으로 명령/승인)
- 코너 8개: AI인사이트, 여행맛집, 스타트업, 제품리뷰, 생활꿀팁, 앱추천, 재테크절약, 팩트체크
## 저장소
- Git 서버: Gitea (자체 NAS 운영)
@@ -12,10 +16,46 @@
- Remote: http://nas.gru.farm:3001/airkjw/blog-writer
- 토큰: 8a8842a56866feab3a44b9f044491bf0dfc44963
## NAS ssh 공개키
## NAS
- 아이디: airkjw
- 공개키: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICkbFPXF3CHi91UsWIrIsjG8srqceVm1wKrL3K1doM1V
- 주소: nas.gru.farm:22
- 내부 IP: 192.168.0.17
- Docker 명령: sudo /usr/local/bin/docker (NOPASSWD)
- Docker Compose: sudo /usr/local/bin/docker compose
- Docker Compose: sudo /usr/local/bin/docker compose
- 앱 경로: /volume2/homes/airkjw/blog-writer-app/
- 컨테이너: blog-scheduler
## 배포 방법
~/.ssh/config에 Gitea용 `Host nas.gru.farm`(User git, Port 2222)이 있어 SCP가 안됨.
파일 전송은 반드시 아래 방식 사용:
```bash
base64 -i <로컬파일> | ssh -i ~/.ssh/id_ed25519 -p 22 -o StrictHostKeyChecking=no airkjw@nas.gru.farm "base64 -d > /volume2/homes/airkjw/blog-writer-app/<경로>"
```
배포 후 재시작:
```bash
ssh -i ~/.ssh/id_ed25519 -p 22 -o StrictHostKeyChecking=no airkjw@nas.gru.farm "sudo /usr/local/bin/docker restart blog-scheduler"
```
## 핵심 파일
- `bots/scheduler.py` — 메인 스케줄러 + 텔레그램 봇 (2100+ LOC)
- `bots/publisher_bot.py` — Blogger 발행, 이미지 처리, HTML 생성
- `bots/engine_loader.py` — AI 엔진 추상화 (Claude/Gemini/Groq)
- `config/engine.json` — AI엔진, TTS, 비디오, 발행 설정
- `config/schedule.json` — 크론 스케줄
## 텔레그램 명령어
/status, /collect, /topics, /write, /pending, /approve, /reject,
/idea, /topic, /report, /convert, /reload, /shorts, /images,
/novel_list, /novel_gen, /novel_status, /cancelimg
## 주의사항
- Blogger 테마가 어두운 배경 → HTML 콘텐츠 작성 시 밝은 색상(#e0e0e0) 사용
- Google News RSS URL은 NAS 컨테이너에서 리다이렉트 실패 → DuckDuckGo 폴백 사용
- 외부 이미지 hotlink 차단 문제 → 사용자 이미지는 base64 data URI 임베딩
- ClaudeWriter: timeout=120s, max_retries=0 (401 시 즉시 fallback)
## 유튜브 관련
채널명: HJW TV
채널ID: UCHu3hkjXvbKIrYNtEgl8fRA
OAuth: YouTube 전용 클라이언트 (YOUTUBE_CLIENT_ID/YOUTUBE_CLIENT_SECRET/YOUTUBE_REFRESH_TOKEN)