---
name: blog-publish-naver
version: 2.0.0
description: |
  네이버 블로그 자동 발행 (BlogAuto). Playwright CDP 방식으로 Chrome 프로필 세션을 재사용하여 네이버 블로그 포스트를 발행/임시저장.
  Use when: 네이버 블로그 발행, 네이버 글 올리기, 네이버 포스팅, blog publish naver
  NOT for: 블로그 글 작성(→ blog-writer), 블로그 SEO(→ blog-dominance)
triggers:
  - 네이버 블로그 발행
  - 네이버 포스팅
  - blog publish naver
inputs:
  - name: md_path
    description: 마크다운 파일 경로
    required: true
  - name: images_dir
    description: 이미지 디렉토리 경로
    required: false
  - name: tags
    description: 태그 리스트
    required: false
  - name: visibility
    description: public, draft, 또는 private
    default: public
---

## 프로젝트 경로

```
/home/jay/projects/BlogAuto/
├── config.py                        # 환경변수 설정
├── publisher/
│   ├── base.py                      # BasePublisher, PublishResult, Category
│   ├── naver_playwright.py          # NaverPlaywrightPublisher (CDP 방식)
│   └── naver_blog_deprecated.py     # (폐기됨) SE API 방식
└── naver-chrome-profile/            # Chrome 프로필 (세션 유지)
```

---

## 인증 설정

Chrome 프로필 기반 세션 인증을 사용합니다. Chrome이 `--remote-debugging-port=9222`로 실행 중이어야 합니다.

**필수 조건**:
1. Chrome이 CDP 모드로 실행 중: `google-chrome --remote-debugging-port=9222 --user-data-dir=/home/jay/projects/BlogAuto/naver-chrome-profile`
2. 네이버에 수동 로그인 완료 (세션 쿠키가 Chrome 프로필에 저장됨)

**환경변수**:

| 변수명 | 기본값 | 설명 |
|---|---|---|
| `NAVER_BLOG_ID` | (필수) | 블로그 ID |

---

## 사용법

### 발행

```python
from publisher.naver_playwright import NaverPlaywrightPublisher

pub = NaverPlaywrightPublisher(blog_id="myblogid")
result = pub.publish(
    md_path="/path/to/post.md",
    images_dir="/path/to/images/",
    tags=["태그1", "태그2"],
    visibility="public",
)
print(result["url"])
```

### 임시저장

```python
result = pub.publish(
    md_path="/path/to/post.md",
    visibility="private",
)
```

### CLI

```bash
cd /home/jay/projects/BlogAuto
python3 -m publisher.naver_playwright publish \
    --content post.md \
    --images ./images \
    --tags '태그1,태그2' \
    --blog-id myblogid \
    --visibility public
```

### 세션 확인

```python
valid = pub.check_session()
print(f"세션 유효: {valid}")
```

---

## 내부 발행 흐름

1. CDP로 기존 Chrome에 연결 (port 9222)
2. 세션 검증 (MyBlog.naver + Write URL 체크)
3. 계정 양생 (warmup) — 정상 사용자 행동 시뮬레이션
4. 글쓰기 페이지 이동 + SE 에디터 대기
5. 제목 직접 타이핑 (Human-Like)
6. 단락별 클립보드 붙여넣기 + 이미지 삽입
7. 마무리 수정 시뮬레이션
8. 태그 입력
9. 발행/임시저장

---

## 예외 처리

| 예외 | 원인 |
|---|---|
| `SessionExpiredError` | 세션 만료, 수동 재로그인 필요 |
| `RuntimeError` | blog_id 미설정 |

---

## 주의사항

- 실제 발행은 제이회장님 승인 후에만 실행합니다.
- Chrome이 CDP 모드로 실행 중이어야 합니다.
- `visibility="private"` 으로 먼저 임시 검토 후 공개 전환을 권장합니다.
- 이미지는 `images_dir` 디렉토리 내 파일을 자동 수집합니다 (jpg, png, gif, webp).

---

## 관련 스킬

- `blog-writer` — 블로그 본문 작성
- `blog-dominance` — 블로그 SEO 전략
- `naver-seo` — 네이버 키워드 분석
