MoneyPrinterV2(MPV2)는 LLM과 브라우저 자동화를 결합하여 YouTube Shorts 영상 제작·업로드, 트위터 봇, 아마존 제휴 마케팅, 로컬 비즈니스 콜드 이메일까지 4가지 온라인 수익 파이프라인을 자동화하는 Python CLI 애플리케이션입니다.
로컬 LLM(Ollama)으로 API 비용 없이 전체 파이프라인을 실행할 수 있습니다. GitHub 스타: 30.7k(2026-06-04 기준), 포크: 2,600+.
보통 YouTube Shorts 하나를 만들려면 주제 조사 → 대본 작성 → 성우 녹음 → 이미지 제작 → 편집 → 업로드를 각각 해야 합니다. MPV2는 이 모든 단계를 파이프라인으로 연결해 자동 실행합니다.
핵심 특징은 로컬 LLM(Ollama)으로 API 비용 없이 실행할 수 있다는 점입니다. GPU만 있으면 OpenAI API 요금 없이 스크립트·메타데이터·이미지 프롬프트를 모두 생성합니다. 동시에 이 프로젝트는 "이렇게 만들면 안 된다"는 안티패턴도 배울 수 있는 교육적 사례이기도 합니다.
YouTube Shorts 채널을 운영하려면 매일 주제 선정 → 스크립트 → TTS → 이미지 → 편집 → 업로드를 반복해야 합니다. Opus Clip 같은 상용 도구는 기존 영상을 자르는 데 특화되어 있고, 처음부터 콘텐츠를 생성하는 자동화는 비용이 큽니다.
YouTube(영상 생성+업로드)·Twitter(트윗 봇)·Amazon(제휴 마케팅)·Outreach(콜드 이메일)를 하나의 CLI에서 통합 관리합니다. Ollama를 통한 로컬 LLM으로 API 비용 없이 전체 파이프라인이 동작합니다.
| 비교 대상 | MoneyPrinterV2 장점 |
|---|---|
| MoneyPrinterTurbo (harry0703) | 4가지 수익 채널(YouTube+Twitter+제휴+Outreach) vs 영상 생성만 |
| Opus Clip / 상용 도구 | 완전 무료 + 로컬 실행 가능 (Ollama) |
| 수동 YouTube Shorts 제작 | 스크립트→TTS→이미지→자막→합성→업로드 전 자동화 |
| 개별 봇 스크립트 | 단일 CLI에서 4개 워크플로 통합 관리 |
| 카테고리 | 기술 | 역할 |
|---|---|---|
| LLM | Ollama (로컬) | 주제·스크립트·메타데이터·이미지 프롬프트 생성 |
| 이미지 생성 | Gemini API | 9:16 비율 이미지 생성 |
| TTS | KittenTTS (kitten-tts-mini-0.8) | 스크립트 → WAV 음성 합성 (24kHz) |
| STT | faster-whisper / AssemblyAI | 음성 → 자막(SRT) 변환 |
| 영상 합성 | MoviePy + FFmpeg + ImageMagick | 이미지+오디오+자막 합성 → MP4 |
| 브라우저 자동화 | Selenium + Firefox (GeckoDriver) | YouTube 업로드, Twitter 포스팅, Amazon 스크래핑 |
| 웹 스크래핑 | Go 바이너리 (google-maps-scraper) | Google Maps 비즈니스 데이터 수집 |
| 이메일 | yagmail (Gmail SMTP) | 콜드 이메일 자동 발송 |
| 스케줄링 | schedule 라이브러리 | CRON 유사 주기적 실행 |
각 단계가 이전 단계의 출력을 입력으로 받아 순차 처리합니다: 주제 생성 → 스크립트 → 메타데이터 → 이미지 프롬프트 → 이미지 생성 → TTS 음성 합성 → 자막(SRT) 생성 → 영상 합성(이미지+오디오+자막) → Selenium으로 YouTube 업로드
if stt_provider == "local_whisper":
generate_subtitles_local_whisper()
else:
# AssemblyAI 사용
config.json의 stt_provider 값에 따라 로컬 Whisper 또는 AssemblyAI로 분기합니다.
# Firefox 프로필 재사용 — 로그인 세션 유지
options = Options()
options.add_argument('-profile')
options.add_argument(fp_profile_path)
if headless:
options.add_argument("--headless")
driver = webdriver.Firefox(options=options)
Firefox 프로필을 사전 설정하여 로그인 세션을 유지합니다. 쿠키/세션 관리 없이 브라우저 자동화가 가능한 실용적 패턴입니다.
30개 이상의 개별 getter가 매번 파일을 열어서 읽습니다. 호출마다 디스크 I/O가 발생합니다. 실제 프로덕션에서는 싱글톤이나 @lru_cache로 개선해야 합니다. 이 패턴을 "무엇을 하면 안 되는지" 학습하는 데 활용할 수 있습니다.
# 현재: 매번 파일 I/O
def get_ollama_model():
with open("config.json") as f:
return json.load(f)["ollama_model"]
# 개선안: 캐싱
import functools
@functools.lru_cache(maxsize=1)
def _load_config():
with open("config.json") as f:
return json.load(f)
def get_ollama_model():
return _load_config()["ollama_model"]
데이터베이스 없이 JSON 파일로 모든 상태를 관리합니다. 업로드된 영상 목록·트윗 히스토리·계정 정보(UUID 기반)·캐시 데이터를 파일로 유지합니다. 간단한 프로토타입에는 유효하지만 확장성에는 한계가 있는 패턴입니다.
| 파일 | 핵심 기능 | 복잡도 |
|---|---|---|
| YouTube.py | 영상 전체 파이프라인 | ★★★★★ |
| Outreach.py | Go 빌드 + 스크래핑 + 이메일 | ★★★★ |
| AFM.py | Amazon 스크래핑 + 피치 생성 | ★★★ |
| Twitter.py | 트윗 포스팅 | ★★ |
| main.py | CLI 메뉴 + 오케스트레이션 | ★★★ |
Ollama REST API를 Python에서 사용하는 패턴, 프롬프트 엔지니어링(문장 수 제한·JSON 형식 출력 강제·언어 지정), 모델 동적 선택(런타임에 사용 가능한 모델 조회)을 배웁니다.
# 모델 목록 조회 + 텍스트 생성
models = ollama.list()["models"]
response = ollama.chat(
model=selected_model,
messages=[{"role": "user", "content": prompt}]
)
return response["message"]["content"].strip()
MoviePy로 이미지 시퀀스 → 영상 변환, 9:16 세로 비율 크롭 계산, 배경음악과 TTS 오디오 믹싱(볼륨 비율 조절), SRT 자막 오버레이, FFmpeg 백엔드 활용을 익힙니다.
# 9:16 세로 비율 크롭
clip = crop(clip, width=clip.w, height=round(clip.w / 0.5625))
# 오디오 믹싱
bg_music = bg_music.volumex(0.1) # 배경음 10%로
final_audio = CompositeAudioClip([tts_audio, bg_music])
Firefox 프로필 기반 세션 유지, YouTube Studio 업로드 자동화(파일 피커·메타데이터·공개 설정), 다중 셀렉터 폴백 전략(XPath → CSS → ID 순차 시도)을 배웁니다.
경량 로컬 TTS 모델 사용법, soundfile로 WAV 파일 쓰기(24kHz), faster-whisper로 로컬 STT 처리를 익힙니다.
subprocess로 외부 Go 바이너리를 실행하는 크로스 언어 통합 패턴, 정규식 기반 이메일 추출, yagmail로 Gmail SMTP 발송(앱 비밀번호 활용)을 배웁니다.
| 항목 | 최소 사양 | 권장 사양 |
|---|---|---|
| Python | 3.12 필수 | 3.12 |
| RAM | 8GB | 16GB (Ollama + MoviePy 동시) |
| GPU | 없어도 가능 (CPU 추론) | NVIDIA 8GB+ VRAM (Ollama 가속) |
| 디스크 | 10GB (모델 + 임시파일) | 20GB+ |
| OS | Linux / macOS / Windows | Linux 권장 (FFmpeg 호환성) |
| 추가 SW | Firefox, FFmpeg, ImageMagick | + Go (Outreach 기능) |
| 계정 | YouTube/Twitter 로그인된 Firefox 프로필 | + Gmail 앱 비밀번호 |
Ollama를 설치하고 Python에서 ollama.chat() API로 간단한 텍스트 생성기를 만듭니다. 주제를 입력하면 3문장 스크립트를 생성하고, ollama.list()로 사용 가능한 모델 목록을 출력합니다.
이미지 3장 + MP3 파일을 받아서 자동으로 세로(9:16) 슬라이드쇼 영상을 생성하는 스크립트를 작성합니다. 이미지별 표시 시간 = 총 오디오 길이 ÷ 이미지 수. Pillow로 1080x1920 리사이즈 + 센터 크롭.
Firefox 프로필을 활용하여 YouTube Studio에 영상을 자동 업로드하는 스크립트를 만듭니다. 비공개(unlisted) 설정으로 업로드하고 제목·설명 자동 입력 후 업로드 완료 URL을 추출합니다.
MPV2의 YouTube 파이프라인을 처음부터 재구현하되 아키텍처를 개선합니다: 설정 관리를 Pydantic Settings로 교체, 각 단계를 독립 클래스로 분리(SRP), 에러 발생 시 재시도 로직(tenacity), 비동기 이미지 생성 병렬화.
CLI 대신 웹 UI로 관리하는 대시보드를 구축합니다: FastAPI + React 대시보드, WebSocket으로 영상 생성 진행률 실시간 표시, SQLite로 영상 히스토리 관리(JSON → DB 마이그레이션), Celery + Redis 백그라운드 작업 큐.
Selenium WebDriver 기초(로그인·폼 입력·파일 업로드), schedule 라이브러리로 주기적 작업 실행, subprocess로 외부 프로세스 관리, JSON 파일 기반 상태 관리
Ollama 설치 및 모델 관리(ollama pull, ollama run), Python ollama 라이브러리 심화(스트리밍·시스템 프롬프트), 프롬프트 엔지니어링(출력 형식 제어), LiteLLM으로 다양한 LLM 프로바이더 전환
MoviePy 심화(트랜지션·텍스트 오버레이·크로마키), Pillow(이미지 리사이즈·크롭·필터·텍스트 렌더링), FFmpeg CLI 직접 사용(코덱·비트레이트·해상도), KittenTTS / Coqui TTS / Edge TTS 비교
Selenium vs Playwright vs Puppeteer 비교, undetected_chromedriver로 봇 탐지 우회, 정규식 심화(이메일·URL·전화번호 추출), yagmail / smtplib로 이메일 자동화
Pydantic Settings로 설정 관리 현대화, Factory·Strategy 패턴 실전 적용, asyncio + aiohttp로 병렬 이미지 생성, Docker 컨테이너화(Ollama + 앱 + Firefox headless)
FastAPI로 REST API 래핑, Celery + Redis 작업 큐, SQLAlchemy/SQLite로 JSON 캐시 교체, GitHub Actions CI/CD 파이프라인
| 키워드 | 설명 |
|---|---|
| Ollama | 로컬에서 LLM을 실행하는 오픈소스 프레임워크. llama·mistral 등 다양한 모델 지원 |
| KittenTTS | 경량 로컬 TTS 엔진. kitten-tts-mini-0.8 모델로 24kHz WAV 출력 |
| faster-whisper | OpenAI Whisper의 CTranslate2 최적화 버전. 로컬 STT 처리 |
| MoviePy | Python 영상 편집 라이브러리. FFmpeg를 백엔드로 사용하여 영상 합성·자르기·오디오 믹싱 |
| Selenium | 브라우저 자동화 프레임워크. WebDriver로 실제 브라우저를 프로그래밍 방식으로 제어 |
| GeckoDriver | Firefox용 WebDriver 구현체. Selenium이 Firefox를 제어할 때 사용하는 드라이버 |
| Firefox Profile | Firefox 사용자 프로필 디렉토리. 쿠키·로그인 세션이 저장되어 자동화 시 로그인 상태 유지 |
| SRT (SubRip Text) | 자막 파일 형식. HH:MM:SS,mmm 타임스탬프와 텍스트로 구성 |
| yagmail | Gmail 전용 Python 이메일 라이브러리. smtplib보다 간결한 API로 이메일 발송 |
| undetected_chromedriver | Selenium 봇 탐지를 우회하는 Chrome WebDriver 래퍼 |
| AGPL-3.0 | 네트워크 서비스로 제공해도 소스 공개 의무가 발생하는 라이선스 |
| VAD | Voice Activity Detection. faster-whisper의 음성 구간 검출 기능. 무음 건너뛰어 정확도 향상 |
| Pipeline Pattern | 각 처리 단계가 이전 단계의 출력을 입력으로 받아 순차 처리하는 소프트웨어 설계 패턴 |
| lru_cache | Python 내장 함수 결과 캐싱 데코레이터. MPV2의 config getter 안티패턴을 개선하는 핵심 도구 |
| subprocess | Python에서 외부 프로세스(Go 바이너리 등)를 실행하는 모듈. 크로스 언어 통합에 활용 |