네이버 블로그 매일 자동 포스팅 시스템 설계
작성일: 2026-05-07 환경: vhagar (kontology) + Galaxy S23+ (USB ADB) 계정: 분유타는대표 (tidtyd222) — 1계정 우선, 안정화 후 민지(wngmlxx12) 추가 핵심 도구: mobilerun (droidrun) + DeepSeek V4 + Naver SearchAd API
1. 전체 아키텍처
┌──────────────────────────────────────────────────────────────┐
│ systemd timer (매일 19:00 — 분유타는대표 시간대) │
│ │
│ ① keyword_engine → 오늘의 키워드 선정 │
│ ② content_generator → DeepSeek V4 원고 생성 │
│ ③ seo_formatter → SE 호환 HTML 변환 │
│ ④ phone_poster → mobilerun → S23 Chrome → SE → 발행 │
│ ⑤ result_logger → Supabase 로깅 + Telegram 알림 │
│ │
└──────────────────────────────────────────────────────────────┘
파일 구조
~/projects/naver-blog/
├── automation/
│ ├── pipeline.py # 메인 오케스트레이터
│ ├── keyword_engine.py # 키워드 선정
│ ├── content_generator.py # 원고 생성 (DeepSeek V4)
│ ├── seo_formatter.py # SE 호환 HTML 변환
│ ├── phone_poster.py # mobilerun S23 포스팅
│ └── result_logger.py # Supabase 로깅
├── templates/
│ ├── info_post.jinja2 # 정보성 글 프롬프트 템플릿
│ └── daily_post.jinja2 # 일상 글 프롬프트 템플릿
├── config/
│ ├── accounts.yaml # 계정별 설정
│ └── keywords_used.json # 사용된 키워드 이력
├── account_01_분유타는대표/
│ ├── drafts/
│ ├── published/ # 발행 완료 (날짜별 .md + .html)
│ ├── queue/ # 발행 대기열
│ └── images/
└── docs/
└── specs/ # 이 문서
2. 콘텐츠 생성 파이프라인
2.1 키워드 선정 (keyword_engine.py)
데이터 소스:
- Naver SearchAd API — naver-search-mcp 오픈소스 활용
- 기존
research/keyword-analysis/1,638개 키워드 DB published/히스토리 → 중복 방지
선정 로직:
| 단계 | 동작 |
|---|---|
| 카테고리 결정 | 비율 준수 라운드로빈: 육아40% / 자영업25% / 보안IT20% / 운동15% |
| 키워드 필터링 | 미사용 + 경쟁도 낮음~중간 우선 (블루오션 전략) |
| 검색량 확인 | SearchAd API로 실시간 검색량 조회 (최소 100+/월) |
| 최종 선택 | 검색량/경쟁도 밸런스 점수 상위 1개 |
SaaS 리버싱 포인트 (Blai/BlogTalk 패턴):
- 블로그 현재 레벨(지수) 대비 이길 수 있는 키워드만 선택
- C-Rank 주제 일관성 유지 (카테고리별 키워드 풀 고정)
2.2 원고 생성 (content_generator.py)
모델: DeepSeek V4 (경량, 한국어 성능 양호, 비용 $0.01~0.02/포스트 수준)
프롬프트 구성:
- 페르소나 주입: "보안회사 대표, 5개월 아들 원육아 중, 핏한 아빠. 톤: 솔직, 유머, 약간의 기술 용어 OK"
- 키워드 + SmartBlock 소제목 가이드 (Gazet 패턴: 네이버 SmartBlock 키워드 조회 → 네이버가 원하는 소제목 구조 파악)
- 템플릿 선택:
- 정보성 (info_post): 검색 유입용. H2 3~4개, 1500~2500자, 이미지 슬롯 5~8개
- 일상 (daily_post): 서이추/공감용. 800~1200자, 에피소드 중심, 질문 마무리
- marketer-system 규칙 적용:
- V2(감정적합도) 최적화
- 카피 파워 5피처 (MR, DA, ET, UC, GG)
- 바디 핸들링 규칙 5개 + 안티패턴 5개
품질 검증 (자동):
- 자수 체크 (정보성: 1500~2500 / 일상: 800~1200)
- 키워드 밀도 (2~4%)
- H2 소제목 수 (3~4개)
- 이미지 슬롯 존재 여부 (최소 3개)
- 해시태그 5~7개 포함
- 서이추 환영 문구 하단 포함
실패 시: 재생성 1회 → 여전히 실패면 queue에 "needs_review" 상태로 저장
2.3 SEO 포매팅 (seo_formatter.py)
기존 검증된 CDP SE 메서드 (2026-05-02 확인):
- 원고 → inline
style="font-size:Npx"HTML 변환 - SE 에디터가 자동으로
se-fs{N}클래스로 매핑 - bold / color / center align / 표 모두 보존
변환 규칙:
| 요소 | HTML 변환 |
|---|---|
| 제목 (H2) | <p style="font-size:24px"><b>소제목</b></p> |
| 본문 | <p style="font-size:16px">내용</p> |
| 강조 | <b> 또는 <span style="color:#..."> |
| 이미지 | [IMAGE_SLOT_N] 플레이스홀더 → Unsplash 무료 이미지 URL 자동 삽입 (Phase 1: 텍스트만 우선) |
| 구분선 | <hr> |
| 해시태그 | 별도 필드로 분리하여 mobilerun에 전달 |
출력: clipboard-ready HTML 문자열 + 메타데이터 (title, tags[], category)
3. 폰 포스팅 자동화
3.1 mobilerun 셋업
# 설치 (vhagar)
pip install uv
uv pip install 'mobilerun[anthropic]'
export DEEPSEEK_API_KEY=<config_vault에서 조회>
# S23+ 셋업
mobilerun setup --device R3CW60BHSAT # Portal APK + 접근성 활성화
mobilerun ping --device R3CW60BHSAT # 연결 검증
mobilerun configure # provider=DeepSeek, model=deepseek-chat
Portal APK: mobilerun이 자동 설치. 접근성 트리 + 커스텀 키보드 IME 제공.
3.2 포스팅 흐름 (phone_poster.py)
Step 1: HTML → S23 클립보드 복사
adb -s R3CW60BHSAT shell am broadcast -a clipper.set -e text "<html>"
(또는 adb shell input 방식 — 테스트 후 결정)
Step 2: mobilerun agent 실행 (vision 모드)
Goal:
1. Chrome 열기
2. m.blog.naver.com 이동
3. 글쓰기 버튼 탭
4. SE 에디터 로드 대기
5. 제목 필드 탭 → 제목 입력
6. 본문 에디터 탭
7. 롱프레스 → 붙여넣기
8. 해시태그 필드 → 태그 입력
9. 발행 버튼 탭
10. 발행 확인
Step 3: 발행 결과 확인
- 스크린샷 캡처 → 성공/실패 판정
- 발행 URL 추출 (가능한 경우)
3.3 네이버 로그인 세션
- S23 Chrome에 tidtyd222 미리 로그인 상태 유지 (수동 1회)
- 세션 만료 감지: mobilerun이 "로그인" 텍스트를 발견하면 → Telegram 알림 → 수동 재로그인
- Phase 2에서 자동 재로그인 구현 검토 (보안 이슈 있으므로 보류)
3.4 주요 제약 & 대응
| 제약 | 대응 |
|---|---|
| SE 에디터 WebView → 접근성 트리 불완전 | --vision 모드 필수 |
| 클립보드 HTML이 길면 adb 전달 실패 가능 | 파일 push → 폰에서 읽기 방식 fallback |
| mobilerun vision 토큰 비용 | 하루 1회 = ~$0.05~0.10, 월 $1.5~3 수준 |
| UI 변경 시 agent 혼란 | max_steps 40 + reasoning 모드로 적응력 확보 |
4. 스케줄링 & 모니터링
4.1 systemd timer
# /etc/systemd/user/naver-blog-post.timer
[Unit]
Description=Daily Naver Blog Post (분유타는대표)
[Timer]
OnCalendar=*-*-* 19:00:00
Persistent=true
RandomizedDelaySec=600
[Install]
WantedBy=timers.target
# /etc/systemd/user/naver-blog-post.service
[Unit]
Description=Naver Blog Posting Pipeline
[Service]
Type=oneshot
WorkingDirectory=/home/tlswk/projects/naver-blog
ExecStart=/home/tlswk/projects/naver-blog/.venv/bin/python -m automation.pipeline --account 분유타는대표
Environment=DEEPSEEK_API_KEY=...
TimeoutStartSec=600
- RandomizedDelaySec=600: 매일 정확히 같은 시각 방지 (네이버 봇 탐지 회피)
- Persistent=true: 머신 꺼져있다가 켜지면 놓친 실행 보상
- TimeoutStartSec=600: mobilerun vision이 느릴 수 있으므로 10분 타임아웃
4.2 모니터링 & 알림
성공: Supabase daily_log 기록 + published/ 이동
실패:
├─ 키워드 선정 실패 → 수동 키워드로 fallback, 알림
├─ 원고 생성 실패 → 1회 재시도, 여전히 실패 → queue에 needs_review
├─ 폰 포스팅 실패 → 3회 재시도, 여전히 실패 → Telegram 알림
└─ 세션 만료 → Telegram "로그인 필요" 알림
Telegram 알림: 기존 Predator 인프라의 BalerionBot 활용.
4.3 Supabase 로깅
daily_log에 블로그 포스팅 결과 append (기존 컨텍스트 브릿지 트리거 준수):
{
"type": "blog_post",
"account": "분유타는대표",
"keyword": "신생아 홈캠 추천",
"category": "보안IT",
"title": "...",
"status": "published",
"url": "https://blog.naver.com/tidtyd222/...",
"word_count": 1850,
"timestamp": "2026-05-07T19:03:22+09:00"
}
5. 에러 핸들링 & 복구
재시도 정책
| 단계 | 재시도 | 간격 | 최종 실패 시 |
|---|---|---|---|
| 키워드 선정 | 2회 | 즉시 | 수동 키워드 풀에서 랜덤 선택 |
| 원고 생성 | 1회 | 5초 | queue/needs_review 저장 |
| SEO 포매팅 | 0회 | - | 원고 그대로 plain text 포스팅 |
| 폰 포스팅 | 3회 | 60초 | Telegram 알림, 다음날 재시도 |
네이버 저품질 방지 가드레일
기존 POSTING_STRATEGY.md 규칙을 코드로 강제:
- 하루 최대 1개 발행 (하드코딩)
- 500자 미만 포스팅 차단
- 이미지 없는 텍스트만 글 차단 (Phase 1에서는 텍스트만 허용, 추후 이미지 필수로 전환)
- 동일 키워드 30일 내 재사용 금지
- 발행 시간대 분유타는대표=19:00±10분 (저녁)
6. SaaS 리버싱 대상
콘텐츠 생성 로직 고도화를 위한 리버싱 우선순위:
| 순위 | 서비스 | RE 목표 | 방법 |
|---|---|---|---|
| 1 | Gazet AI (gazet.ai) | SmartBlock 키워드 → 소제목 구조 파이프라인 | 웹 네트워크 탭 감청 |
| 2 | Blai (blai.co.kr) | C-Rank/DIA 스코어링 모델 | API 엔드포인트 분석 |
| 3 | BlogTalk (blogtalk.io) | 블로그 레벨 매칭 키워드 추천 | 크롬 확장 분석 |
| 4 | AutoPanda (autopanda.co.kr) | SE 에디터 브라우저 자동화 플로우 | 데스크탑 앱 디컴파일 |
| 5 | naver-search-mcp (오픈소스) | SearchAd API 호출 패턴 | 소스 직접 활용 |
7. 구현 순서 (Phase별)
Phase 1: MVP (1~2일)
Phase 2: 콘텐츠 자동화 (2~3일)
Phase 3: 스케줄링 + 모니터링 (1일)
Phase 4: 고도화 (지속)
8. 비용 추정 (월간)
| 항목 | 비용 |
|---|---|
| DeepSeek V4 원고 생성 (30회/월) | ~$0.30~0.60 |
| mobilerun vision 토큰 (30회/월) | ~$1.50~3.00 |
| Naver SearchAd API | 무료 |
| Supabase | 기존 인프라 (무료 티어) |
| 합계 | ~$2~4/월 |
의존성 정리
| 패키지 | 용도 | 설치 |
|---|---|---|
| mobilerun[anthropic] | 폰 자동화 | uv pip install |
| deepseek SDK | 원고 생성 | pip install openai (DeepSeek은 OpenAI 호환) |
| jinja2 | 프롬프트 템플릿 | pip install jinja2 |
| pyyaml | 설정 파일 | pip install pyyaml |
| supabase-py | 로깅 | pip install supabase |
| requests | HTTP 호출 | 기본 내장 |