결과물
만든 것: 인스타그램 카드뉴스 자동 제작 시스템
매주 월/목 12:38에 자동 실행되는 인스타그램 카드뉴스 파이프라인을 구축했다.
계정: @aisellerguide (온라인 셀러를 위한 AI 정보)
crontab 트리거 1개 (매주 월/목 12:38 자동 실행)
| 채널 | 자동 생성물 | 발송 방식 |
|---|---|---|
| 인스타그램 | 카드뉴스 5장 (1080×1080 PNG) + 캡션 + 해시태그 | instagrapi 자동 업로드 |
crontab 트리거 (월/목 12:38)
│
▼
┌─ Step 1: 리서치 ───────────────────────────────────┐
│ Claude API + 웹 검색으로 최신 셀러 뉴스 수집 │
│ → 주제 선정 → 구조화된 JSON 데이터 생성 │
└───────────────────────────────────────────────────┘
│
▼
┌─ Step 2: 콘텐츠 생성 ──────────────────────────────┐
│ JSON 데이터를 디자인 시안(HTML 템플릿)에 자동 삽입 │
│ → 5장짜리 카드뉴스 HTML 완성 │
└─────────────────────────────────────────────────┘
│
▼
┌─ Step 3: 이미지 변환 ──────────────────────────────┐
│ Playwright로 HTML을 브라우저에서 열고 │
│ → 카드 1장씩 스크린샷 → PIL로 1080×1080 리사이즈 │
└───────────────────────────────────────────────── ┘
│
▼
┌─ Step 4: 인스타 업로드 ────────────────────────────┐
│ instagrapi로 5장 캐러셀 자동 게시 │
│ → 캡션 + 해시태그 자동 생성 │
└────────────────────────────────────────────────┘
카드뉴스 5장 구조
| 장 | 역할 | 설계 의도 |
|---|---|---|
| 1장 | 커버 (후킹) | “최대 1억원 지원” 같은 숫자로 시선 끌기 |
| 2장 | 핵심 바로 전달 | 뜸들이지 않고 바로 본론 → 이탈 방지 |
| 3장 | 상세/조건 | 관심 생긴 사람한테 구체적 정보 |
| 4장 | 꿀팁/주의사항 | 색상으로 구분 (주황=주의, 초록=꿀팁, 블루=정보) |
| 5장 | CTA | ”팔로우하기” 유도 |
구성 파일
| 파일 | 역할 |
|---|---|
research.py | Claude API + 웹 검색으로 셀러 뉴스 수집 → JSON 반환 |
generate.py | JSON 데이터를 HTML 카드뉴스 템플릿에 삽입 |
render.py | Playwright 스크린샷 → PIL 리사이즈 → PNG 5장 |
instagram.py | instagrapi 로 캐러셀 자동 업로드 |
pipeline.py | 위 4단계를 순서대로 실행하는 총괄 스크립트 |
run.sh | crontab에서 실행하는 쉘 스크립트 |
aiforseller/
├── pipeline/
│ ├── research.py ← 뉴스 수집
│ ├── generate.py ← HTML 카드뉴스 생성
│ ├── render.py ← PNG 이미지 변환
│ ├── instagram.py ← 인스타 업로드
│ ├── pipeline.py ← 전체 실행
│ └── run.sh ← 크론잡 실행
├── output/ ← 생성된 카드뉴스 저장
├── cardnews/ ← 수동 제작 샘플
├── logs/ ← 실행 로그
├── 디자인시안.md ← 카드뉴스 디자인 스펙
└── .env ← API키, 비밀번호 (비공개)
만든과정 및 삽질
Phase 1: 기획 및 디자인 (Day 1)
카드뉴스 스타일 3가지를 놓고 비교했다. 미니멀, 클린&프로페셔널, 그라디언트 중에서 클린&프로페셔널 선택. 흰 배경 + 파란색(#4361ee) 포인트로 신뢰감 있는 느낌.
5장 구조를 처음에 “커버→배경→핵심→팁→CTA”로 잡았는데, 2장에서 배경 설명하면 뜸들이는 느낌이라 구조를 바꿨다. 1장 커버에서 후킹하고, 2장에서 바로 핵심 전달하는 구조로 변경.
디자인 시안을 디자인시안.md로 정리해서 카드 레이아웃, 컬러 팔레트, 글자 수 제한 등을 문서화했다. 이 문서가 이후 generate.py의 HTML 템플릿 기준이 됐다.
Phase 2: 파이프라인 구축 (Day 1)
Claude Code에서 OMC의 executor 에이전트를 활용해 파이프라인 코드를 작성했다.
리서치 에이전트 (research.py)
- Claude API에
web_search_20250305도구를 붙여서 최신 뉴스를 자동 검색 - 4개 카테고리(지원금, 플랫폼 정책, 셀러 꿀팁, 트렌드) 중 하나를 골라 주제 선정
- 결과를 JSON 구조로 반환 (hook_title, core_points, details, tips)
콘텐츠 생성 (generate.py)
- JSON 데이터를 미리 만든 HTML/CSS 템플릿에 자동 삽입
- Noto Sans KR 폰트, 인라인 CSS로 브라우저 의존성 최소화
이미지 변환 (render.py)
- Playwright로 HTML을 Chromium에서 열고 카드 1장씩 스크린샷
- PIL(Pillow)로 1080×1080 리사이즈 → PNG 5장 출력
Phase 3: 인스타그램 연동 삽질 (Day 1) — 가장 많이 삽질
시도 1: Meta Graph API (실패)
공식 API로 하려고 Meta Developer에서 앱을 만들었다. 근데 Facebook 페이지 연결, 권한 요청, 비즈니스 인증 등 절차가 너무 복잡했다. 새로 만든 계정이라 인증 자체가 불가.
시도 2: instagrapi 비밀번호 로그인 (실패)
비공식 라이브러리 instagrapi로 방향 전환. 비밀번호 로그인 시도 → Instagram이 “수상한 로그인”으로 판단해서 차단. BadPassword 에러.
시도 3: 세션 ID 로그인 (실패)
브라우저 쿠키에서 세션 ID를 추출해서 로그인 시도. 역시 차단. URL 인코딩 문제(%3A → :)도 있었지만 근본 원인은 새 계정은 24~48시간 지나야 외부 도구에서 접근 가능하다는 것.
추가 삽질: instagrapi 버전 호환
Python 3.9 환경에서 instagrapi 2.3.0 설치 → TypeError: unsupported operand type(s) for | 에러. Python 3.10+ 문법 문제. instagrapi==1.19.8로 다운그레이드해서 해결.
추가 삽질: .env 특수문자
비밀번호에 !나 @가 있으면 export $(cat .env | xargs) 방식으로 읽을 때 깨짐. python-dotenv로 해결.
Phase 4: 스케줄러 (Day 1)
Mac의 crontab에 등록:
38 12 * * 1,4 /Users/owen/claude\\ total/aiforseller/pipeline/run.sh
run.sh가 .env 로드 → Python PATH 설정 → pipeline.py 실행 → 로그 파일 자동 기록
인사이트
코드보다 플랫폼 정책이 더 큰 벽
파이프라인 코드는 하루만에 다 만들었다. 근데 Instagram 로그인 하나 때문에 계속 삽질했다.
AI가 만든 글은 반드시 팩트 체크
처음 AI가 뽑은 커버 타이틀: “3.4조 지원금 받고 계신가요?” → 정부 전체 예산을 개인이 받는 것처럼 오해 유발. “최대 1억원 지원받는 법”으로 수정했다. AI 콘텐츠는 과장 표현 검수가 필수.
모듈로 나누면 고치기 쉽다
리서치/생성/이미지/업로드를 각각 독립 파일로 만들어서, 디자인만 바꾸고 싶으면 generate.py만 수정하면 된다. 나머지는 건드릴 필요 없다.
도구 사용
| 도구 | 용도 |
|---|---|
| Claude Code (Opus) | 전체 프로젝트 진행, 코드 작성, 디자인 기획 |
| oh-my-claudecode | 에이전트 위임, 메모리, 스킬 활용 |
| Claude API + 웹 검색 | 리서치 에이전트의 뉴스 수집 |
| Playwright | HTML → PNG 스크린샷 변환 |
| Pillow (PIL) | 이미지 1080×1080 리사이즈 |
| instagrapi | 인스타그램 캐러셀 자동 업로드 |
| crontab | 매주 월/목 자동 실행 스케줄링 |
다시 한다면?
계정을 미리 만들어놓기
당일 가입 + 당일 자동화는 무조건 차단당한다. 최소 2~3일 전에 계정을 만들고, 앱에서 정상적으로 사용한 뒤에 자동화를 연결해야 한다.
팩트 체크 단계 추가
리서치 → 생성 → AI 검수(팩트체크) → 이미지 → 업로드. 과장된 표현을 자동으로 잡아내는 검수 에이전트를 중간에 넣으면 더 안전하다.
반자동으로 시작
업로드 전에 슬랙으로 미리보기를 보내고, 사람이 “OK” 하면 올리는 방식. 신뢰도가 쌓이면 완전 자동으로 전환.
원소스 멀티유즈 확장
같은 리서치 데이터로 릴스 대본, 캡션, 블로그 글 등 여러 포맷을 만들 수 있다. 지금은 카드뉴스 1종이지만, 같은 JSON 데이터에서 다른 템플릿으로 변환하면 된다.
OMC(oh-my-claudecode) 활용
Claude Code(터미널에서 쓰는 AI 코딩 도구)를 더 강력하게 만들어주는 확장팩. 혼자 일하는 AI를 “팀”처럼 역할을 나눠서 일하게 해준다.
이번에 활용한 기능들
| 기능 | 쉽게 말하면 | 이번에 어떻게 썼는지 |
|---|---|---|
| 에이전트 위임 | 리서치는 리서치 AI한테, 코딩은 코딩 AI한테 맡기기 | executor 에이전트로 파이프라인 코드 구축 |
| 스킬(Skill) | 특정 작업에 특화된 자동 워크플로우 | brainstorming으로 디자인 기획, schedule로 crontab 등록 |
| 메모리 | 이전 대화에서 정한 기준을 자동 기억 | 카드뉴스 스타일, 5장 구조, 계정명 변경 등 기억 |
| 훅(Hook) | 세션 시작 시 자동으로 컨텍스트 주입 | 프로젝트 설정, 디자인 기준 자동 로드 |
Claude Code가 터미널이라서 가능한 것
- 파일을 직접 만들고 수정 (
.py,.html,.sh코드 작성) - 프로그램을 직접 실행 (
pip install,python3 pipeline.py) - 시스템 명령어 실행 (crontab 등록, Playwright 브라우저 실행)
- 외부 API 연결 (Claude API, Instagram API)
웹/앱 버전 Claude는 대화만 가능하고 이런 시스템 작업은 못 한다. 자동화 파이프라인은 반드시 터미널 환경(Claude Code CLI)이 필요하다.
OMC = Claude Code의 “사용설명서”를 미리 넣어준 것
비유하자면:
- Claude Code = 엄청 유능한 신입사원
- OMC = 그 신입한테 “우리 회사는 이렇게 일해” 매뉴얼을 준 것
신입이 아무리 똑똑해도 매뉴얼 없이 일하면 매번 “이거 어떻게 할까요?” 물어보거나, 자기 방식대로 해서 다시 고쳐야 하는 상황이 생깁니다.
OMC가 실제로 하는 건 CLAUDE.md라는 파일에 “이렇게 일해라”는 규칙을 미리 세팅해주는 거예요. 그래서:
1. 한마디로 복잡한 작업이 돌아간다
OMC 없이:
“웹 검색해서 셀러 뉴스 찾아줘” → “그거 JSON으로 정리해줘” → “HTML로 만들어줘” → “스크린샷 찍어줘” → “crontab 등록해줘” 5번 지시
OMC 있을 때:
“autopilot — 카드뉴스 파이프라인 만들어줘” 1번 지시 → 알아서 계획 세우고, 코드 짜고, 테스트하고, 스케줄까지
이건 Claude Code가 못 하는 게 아니라, 매번 단계마다 지시하는 수고를 줄여주는 겁니다.
2. 검증된 워크플로우를 가져다 쓴다
OMC에는 스킬(Skill)이라는 게 40개 넘게 들어있어요. 이건 수천 명이 써보면서 다듬어진 “이렇게 하면 결과가 좋더라” 레시피입니다.
예를 들어 brainstorming 스킬:
- 그냥 Claude한테 “디자인 뭐가 좋을까?” → 아무거나 하나 추천
- OMC brainstorming → 3가지 시안 비교표 + 장단점 + 추천 이유
프롬프트를 잘 쓰면 같은 결과를 얻을 수 있지만, 그 “잘 쓴 프롬프트”가 이미 스킬로 만들어져 있는 거예요.
3. 대화가 바뀌어도 기준이 유지된다
이게 이번 프로젝트에서 실제로 경험한 것입니다:
- 디자인 스타일 “클린&프로페셔널”로 정함 → 다음 대화에서도 기억
- 계정명 aisellerguide로 바꿈 → 자동 반영
- 5장 구조 확정 → 새 카드뉴스 만들 때마다 같은 구조 유지
OMC 없으면? 새 대화 시작할 때마다 “디자인은 파란색이고, 계정명은 aisellerguide이고, 5장 구조는…” 매번 다시 설명해야 합니다.
결론: 없어도 되지만, 있으면 “내가 할 일이 줄어든다”
| OMC 없이 | OMC 있으면 | |
|---|---|---|
| 지시 | 단계마다 하나씩 | 한마디로 끝까지 |
| 프롬프트 | 매번 직접 잘 써야 함 | 검증된 스킬 가져다 씀 |
| 기억 | 매 대화마다 다시 설명 | 자동 기억·유지 |
“Claude Code가 유능하니까 안 써도 되지 않나?” → 맞습니다. 근데 유능한 도구를 더 적은 노력으로 쓸 수 있게 해주는 게 OMC예요.
oh-my-zsh가 터미널을 못 쓰는 사람한테 필요한 게 아니라, 이미 터미널 쓸 줄 아는 사람이 더 편하게 쓰려고 설치하는 것과 같습니다.