feat: v3.2 나머지 미완성 기능 구현

[Instagram Reels] Phase 2 완성
- instagram_bot.py: publish_reels() 추가 (MP4 → Reels API)
  - upload_video_container(), wait_for_video_ready() 구현
  - 로컬 경로 → 공개 URL 자동 변환 (image_host.get_public_video_url())
- scheduler.py: job_distribute_instagram_reels() 추가 (10:30)
- image_host.py: get_public_video_url() + 로컬 비디오 서버 추가
  - VIDEO_HOST_BASE_URL 환경변수 지원 (Tailscale/CDN)

[writer_bot.py] 신규 — 독립 실행형 글쓰기 봇
- api_content.py manual-write 엔드포인트에서 subprocess 호출 가능
- run_pending(): 오늘 날짜 미처리 글감 자동 처리
- run_from_topic(): 직접 주제 지정
- run_from_file(): JSON 파일 지정
- CLI: python bots/writer_bot.py [--topic "..." | --file path.json | --limit N]

[보조 시스템 신규] v3.1 CLI + Assist 모드
- blog.cmd: venv Python 경유 Windows 런처
- blog_runtime.py + runtime_guard.py: 실행 진입점 + venv 검증
- blog_engine_cli.py: 대시보드 API 기반 CLI (blog status, blog review 등)
- bots/assist_bot.py: URL 기반 수동 어시스트 파이프라인
- dashboard/backend/api_assist.py + frontend/Assist.jsx: 수동모드 탭

[engine_loader.py] v3.1 개선
- OpenClawWriter: --json 플래그 + payloads 파싱 + plain text 폴백
- ClaudeWebWriter: Playwright 쿠키 세션 (Cloudflare 차단으로 현재 비활성)
- GeminiWebWriter: gemini-webapi 비공식 클라이언트

[scheduler.py] v3.1 개선
- _call_openclaw(): 플레이스홀더 → EngineLoader 실제 호출
- _build_openclaw_prompt(): 구조화된 HTML 원고 프롬프트
- data/originals/: 원본 article JSON 저장 경로 추가

[설정/환경] 정비
- .env.example: SEEDANCE/ELEVENLABS/GEMINI/RUNWAY 복원
  + VIDEO_HOST_BASE_URL, GEMINI_WEB_* , REMOTE_CLAUDE_POLLING_ENABLED 추가
- scripts/setup.bat: data/originals, outputs, assist, novels, config/novels
  디렉토리 생성 + 폰트 다운로드 + blog.cmd 기반 Task Scheduler 등록
- requirements.txt: fastapi, uvicorn, python-multipart 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sinmb79
2026-03-28 17:12:39 +09:00
parent 213f57b52d
commit 392c2e13f1
26 changed files with 2296 additions and 98 deletions

View File

@@ -36,16 +36,27 @@ if not exist data\published mkdir data\published
if not exist data\analytics mkdir data\analytics
if not exist data\images mkdir data\images
if not exist data\drafts mkdir data\drafts
if not exist data\originals mkdir data\originals
if not exist data\outputs mkdir data\outputs
if not exist data\assist mkdir data\assist
if not exist data\assist\sessions mkdir data\assist\sessions
if not exist data\assist\inbox mkdir data\assist\inbox
if not exist data\novels mkdir data\novels
if not exist logs mkdir logs
if not exist config\novels mkdir config\novels
REM Register scheduler.py in Windows Task Scheduler
set SCRIPT_PATH=%~dp0bots\scheduler.py
REM Download fonts (Noto Sans KR for card/shorts converter)
echo [INFO] Downloading fonts...
venv\Scripts\python.exe scripts\download_fonts.py
REM Register scheduler.py in Windows Task Scheduler (blog.cmd 경유)
set BLOG_CMD=%~dp0blog.cmd
set PYTHON_PATH=%~dp0venv\Scripts\pythonw.exe
schtasks /query /tn "BlogEngine" >nul 2>&1
if errorlevel 1 (
schtasks /create /tn "BlogEngine" /tr "\"%PYTHON_PATH%\" \"%SCRIPT_PATH%\"" /sc onlogon /rl highest /f
echo [OK] BlogEngine registered in Windows Task Scheduler
schtasks /create /tn "BlogEngine" /tr "\"%BLOG_CMD%\" scheduler" /sc onlogon /rl highest /f
echo [OK] BlogEngine registered in Windows Task Scheduler (blog scheduler)
) else (
echo [INFO] BlogEngine task already registered.
)
@@ -58,7 +69,10 @@ echo.
echo Next steps:
echo 1. Open .env and fill in all API keys
echo 2. Run scripts\get_token.py to get Google OAuth token
echo 3. Update BLOG_MAIN_ID in config\blogs.json with your actual blog ID
echo 4. Start scheduler with: python bots\scheduler.py
echo (Blogger + Search Console + YouTube OAuth)
echo 3. Update BLOG_MAIN_ID in .env with your Blogger blog ID
echo 4. Start scheduler: blog scheduler
echo 5. Start dashboard: blog server (http://localhost:8080)
echo 6. CLI status check: blog status
echo.
pause