네이버 블로그 자동 게시 설계
2026-07-27 · 집계 앱 v2 대상 · 공식 API 없음 — 2트랙(반자동/완전자동)
1. 목표
앱에 기록을 저장하는 순간 네이버 블로그 운동 카테고리에 올릴 글감(제목 + 캡쳐 이미지)이 자동으로 완성되어, 사용자는 최소 동작(붙여넣기 + 발행)만으로 게시를 마친다. 관리자는 로컬 스크립트로 발행까지 완전 자동화한다. 제로-DB 원칙은 그대로 — 서버 없이 브라우저(와 관리자 PC) 안에서만 동작한다.
2. 전제 조사
게시 템플릿 (블로그 실측 분석) — 운동 카테고리(categoryNo=150)의 일일 기록 글:
| 요소 | 형식 | 예시 |
|---|---|---|
| 제목 | YY.MM.DD - X.XKM (날짜 + 거리) | 26.07.28 - 3.2KM |
| 본문 | 러닝 앱 캡쳐 이미지 1장 (텍스트 없음) | — |
| 카테고리 | 운동 (categoryNo=150) | — |
→ 제목·본문 모두 앱이 이미 가진 데이터(date, distance_km, IndexedDB 캡쳐)로 100% 자동 생성 가능.
게시 수단 비교 — 네이버 블로그 글쓰기 공식 API(writePost.json)는 스팸 남용으로 2020-05-06 종료. 현재 외부 프로그램의 공식 게시 경로는 없다.
| 수단 | 상태 | 판단 |
|---|---|---|
| 공식 글쓰기 API | 2020-05 종료 | 불가 |
| MetaWeblog/XML-RPC | 종료 | 불가 |
| 브라우저 자동화 (Playwright) | 가능 | 약관 회색지대 · 계정 제재 리스크 → 관리자 전용 소량 사용 |
| 글감 완성 + 글쓰기 창 오픈 (반자동) | 가능 | 리스크 없음 → 일반 사용자 기본 경로 |
3. 방식 결정
| 항목 | 결정 | 근거 |
|---|---|---|
| 구조 | 2트랙 — 트랙 A(반자동, 앱 내) + 트랙 B(완전자동, 로컬 스크립트) | 공식 API 부재. 일반 사용자에게 자동화 리스크를 지우지 않고, 관리자는 본인 책임 하에 완전 자동 |
| 제목 규칙 | YY.MM.DD - X.XKM (거리 소수 1자리 고정) | 기존 게시글 제목 형식 표준화 (표기 편차 정규화) |
| 이미지 전달 | 클립보드 복사(PC, PNG 변환) / Web Share(모바일) / 다운로드(폴백) | 스마트에디터는 본문 붙여넣기·공유 첨부를 지원. 파일을 서버에 올리지 않음(제로-DB) |
| 글쓰기 진입 | blog.naver.com/{blogId}?Redirect=Write&categoryNo={n} | 실측 검증 — 비로그인 시에도 로그인 후 해당 주소로 복귀하며 categoryNo가 보존됨 |
| 발행 상태 추적 | 레코드에 blog_posted_at(ISO, nullable) 추가 | 미발행 목록·중복 발행 방지의 기준. 내보내기→가져오기 왕복에서 보존(스키마 v2.0 유지) |
| 설정 저장 | run.blog.v1 → blogId·categoryNo·autoOpen (localStorage) | 드라이브 설정과 같은 패턴. 코드에 하드코딩하지 않음 |
| 트랙 B 로그인 | Playwright persistent context 재사용 — 자동 로그인 코드 없음 | 최초 1회 수동 로그인 후 세션만 재사용. 캡차·보안 차단 회피, 자격증명 저장·입력 금지 |
4. 트랙 A: 반자동 발행 흐름 (M1)
[기록 저장 (단건 · 신규)]
→ 글감 모달 자동 오픈 (blogId 설정 + autoOpen 켜짐일 때)
제목: 26.07.28 - 3.2KM [📋 제목 복사]
캡쳐 미리보기
[🖼 이미지 복사] (모바일: [📤 이미지·제목 공유])
[✍ 네이버 글쓰기 열기] ← 새 창, categoryNo 지정
→ 에디터에서: 본문 Ctrl+V(이미지) → 제목 붙여넣기 → 발행
→ 앱으로 돌아와 [✅ 발행 완료로 표시] → blog_posted_at 기록
→ 데이터 뷰: 발행 배지 · 미발행 글감 목록에서 언제든 재발행
- 드라이브 큐 진행 중에는 방해하지 않는다 — 큐 소진 후 미발행 목록을 한 번에 안내.
- 기록 수정 저장은 자동 오픈하지 않는다 — 신규 저장만.
- 이미지 복사와 글쓰기 창 열기는 버튼을 분리 — 팝업 차단·클립보드 포커스 제약 회피(붙여넣을 것을 먼저 복사).
5. 트랙 B: 완전 자동 발행 흐름 (M2 · 관리자 전용)
[앱: 정본 내보내기 running_records.json]
→ node scripts/blog-auto-post.mjs --json running_records.json --images 기록/
(--login: 최초 1회 헤드풀 수동 로그인 — 세션만 저장)
→ 대상 선별: blog_posted_at 없음 + 캡쳐 파일 매칭
→ 글쓰기 진입 → 제목 입력(동일 규칙) → 이미지 첨부 → 카테고리 150
→ 기본 dry-run: 발행 직전 정지 + 스크린샷 (--publish 시에만 실제 발행)
→ 발행 확인(PostView URL) → JSON에 blog_posted_at 기록(.bak 백업 후 건별 저장)
→ 앱 'JSON 가져오기'로 불러오면 발행 배지 반영 (앱 코드 변경 불필요)
안전장치: dry-run 기본 · --limit 기본 1(상한 5) · 건당 5~10초 대기 · 실패 시 즉시 전체 중단(중복 발행 방지) · 캡차/보안 페이지 감지 시 중단 · 로그인 리다이렉트 감지 시 --login 안내 후 종료.
6. 보안 · 리스크
- 자동화 약관 리스크(트랙 B): 브라우저 자동화는 네이버 이용약관상 회색지대이며, 대량 사용 시 계정 제재(저품질·정지) 사례가 있다. 본인 계정 · 1일 1건 수준 소량 · 관리자 전용으로 한정하고, 일반 사용자 경로는 트랙 A로 분리한다.
- 트랙 B 세션(
scripts/.naver-profile/)은 로컬에만 존재 — git·Vercel 배포에서 제외. 자격증명은 코드 어디에도 저장·입력하지 않는다. - 트랙 A는 클립보드·공유·새 창뿐 — 외부 전송 없음, 제로-DB 유지.
blogId는 공개 값이라 localStorage 저장으로 충분. - 스마트에디터 DOM은 예고 없이 변경될 수 있다 — 셀렉터를 상수 1곳에 모으고 dry-run 스크린샷으로 회귀를 감지.
7. 사전 준비
- 앱의 데이터 · 내보내기 → 네이버 블로그 ⚙ 설정에 블로그 ID(예:
nevertheless-jos)와 카테고리 번호(예:150) 입력 — 카테고리 번호는 블로그 카테고리 링크의categoryNo=값. - (트랙 B, 관리자만) Node.js 설치 →
cd scripts && npm install→node blog-auto-post.mjs --login으로 최초 1회 수동 로그인.
ℹ️ 설정값은 이 브라우저의 localStorage에만 저장되며 서버로 전송되지 않습니다.
8. 마일스톤
- M1 (이번 구현): 글감 모달(제목·이미지 복사/공유/글쓰기 창) · 저장 직후 자동 오픈 ·
blog_posted_at추적 · 미발행 목록 · 설정 UI - M2 (이번 구현 · 관리자): Playwright 완전 자동 발행 스크립트 (dry-run 기본 · 셀렉터는 첫 실행 때 보정)
- M3: 주간 리포트 자동발행(주간 집계 카드 이미지 생성 → 글감) · 모바일 글쓰기 딥링크 개선
9. 한계 (M1)
- 트랙 A의 최종 '발행' 클릭은 사용자 몫 — 공식 API가 없는 한 브라우저에서 무인 발행은 불가.
- 클립보드 이미지 복사는 HTTPS + 최신 브라우저 필요(미지원 시 이미지 저장 폴백). 모바일 공유는 네이버 블로그 앱이 설치된 경우에 매끄럽다.
- PC 에디터의 카테고리 자동 선택은 URL 파라미터에 의존 — 에디터 개편 시 수동 선택이 필요할 수 있다.
- 발행 완료 표시는 자기 신고 방식 — 실제 게시 여부를 앱이 검증하지는 않는다(트랙 B는 PostView URL로 확인).