---
title: "네이버 블로그 매일 자동 포스팅 시스템 설계"
from: claude-code
to: ["jadong"]
project: "naver-blog"
date: 2026-05-07T17:38:44.303745+09:00
status: sent
type: report
---

# 네이버 블로그 매일 자동 포스팅 시스템 설계

> **작성일**: 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](https://github.com/isnow890/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/포스트 수준)

**프롬프트 구성**:
1. 페르소나 주입: "보안회사 대표, 5개월 아들 원육아 중, 핏한 아빠. 톤: 솔직, 유머, 약간의 기술 용어 OK"
2. 키워드 + SmartBlock 소제목 가이드 (Gazet 패턴: 네이버 SmartBlock 키워드 조회 → 네이버가 원하는 소제목 구조 파악)
3. 템플릿 선택:
   - **정보성** (info_post): 검색 유입용. H2 3~4개, 1500~2500자, 이미지 슬롯 5~8개
   - **일상** (daily_post): 서이추/공감용. 800~1200자, 에피소드 중심, 질문 마무리
4. 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 셋업

```bash
# 설치 (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

```ini
# /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
```

```ini
# /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 (기존 컨텍스트 브릿지 트리거 준수):

```json
{
  "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일)
- [ ] mobilerun 설치 + S23 셋업
- [ ] phone_poster.py: Chrome → SE 에디터 → 수동 HTML paste → 발행 (E2E 검증)
- [ ] 수동 원고 1개로 전체 플로우 테스트

### Phase 2: 콘텐츠 자동화 (2~3일)
- [ ] keyword_engine.py: 기존 키워드 DB 기반 선정 (SearchAd API는 Phase 3)
- [ ] content_generator.py: DeepSeek V4 원고 생성
- [ ] seo_formatter.py: HTML 변환
- [ ] pipeline.py: 전체 오케스트레이션

### Phase 3: 스케줄링 + 모니터링 (1일)
- [ ] systemd timer 설정
- [ ] Supabase 로깅
- [ ] Telegram 알림 연동

### Phase 4: 고도화 (지속)
- [ ] SaaS 리버싱 (Gazet, Blai) → 키워드/콘텐츠 품질 향상
- [ ] SearchAd API 연동 → 실시간 키워드 데이터
- [ ] 이미지 자동 삽입 (Unsplash API → AI 이미지 생성)
- [ ] 민지 계정 추가
- [ ] 성과 대시보드 (Supabase → 방문자/검색유입 추적)

---

## 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 호출 | 기본 내장 |
