네이버 블로그 완전 자동 발행 만들기 — Claude Code + Playwright 실전기
네이버 블로그는 티스토리나 GitHub Pages와 달리 공식 발행 API가 없다. 그래서 “매일 아침 글이 자동으로 올라가는 네이버 블로그"를 만들려면 브라우저 자동화(Playwright)로 스마트에디터 ONE을 사람처럼 직접 조작해야 한다. 오늘 Claude Code와 함께 이 파이프라인을 처음부터 끝까지 구축했고, 실제 첫 글 발행까지 성공했다. 그 과정과 시행착오를 정리한다.
사람 손 한 번 안 대고 발행된 실제 결과물. 제목, 본문, 카드뉴스 이미지 7장까지 전부 자동으로 들어갔다.
전체 구조
| |
핵심 설계 포인트 세 가지:
- 발행 원본을 HTML 미리보기 파일로 단일화 —
blog-preview.html을 브라우저로 열면 발행될 모습을 그대로 볼 수 있고, 자동화는 이 파일의<h1>을 제목으로,<img>위치 그대로 이미지를 삽입한다. “미리보기 = 발행 결과"가 되니 검수가 쉽다. - 중복 발행 방지 플래그 — 발행 성공 시 날짜 폴더에
.naver_uploaded파일을 남긴다. 스케줄러가 재실행돼도 같은 글이 두 번 올라가지 않는다. - 실패 시 증거 남기기 — 예외가 나면 스크린샷과 로그를 자동 저장한다. 브라우저 자동화는 UI 변경으로 언제든 깨질 수 있어서 이게 필수다.
로그인: 비밀번호 없이 세션만 저장
자동화 스크립트에 비밀번호를 넣는 건 절대 금물. Playwright에 내장된 --save-storage 옵션을 쓰면 사람이 직접 로그인한 세션(쿠키)만 파일로 저장해 재사용할 수 있다.
| |
열리는 브라우저에서 직접 로그인(‘로그인 상태 유지’ 체크)하고 창을 닫으면 auth.json에 세션이 저장된다. 스크립트에서는 이렇게 불러온다:
| |
주의: auth.json은 비밀번호는 없지만 세션 쿠키가 들어있어 그 자체가 로그인 열쇠다. 절대 Git에 커밋하거나 공유하면 안 되고, 유출 의심 시 네이버 보안설정에서 전체 기기 로그아웃하면 즉시 무효화된다. 스크립트가 실행될 때마다 세션을 다시 저장해 만료도 방지했다.
스마트에디터 조작의 핵심 기법
자동화 스크립트가 여는 스마트에디터 ONE. 이 화면의 제목·본문·사진 버튼·발행 버튼을 코드가 사람처럼 조작한다.
본문 텍스트: 클립보드 HTML 붙여넣기. 글자를 한 자씩 타이핑하는 것보다 훨씬 빠르고 서식(<b>, <br>)도 유지된다. 브라우저 컨텍스트에 클립보드 권한을 주고, JS로 클립보드에 HTML을 넣은 뒤 Ctrl+V를 누른다.
| |
이미지: 파일 선택 대화상자 가로채기. 이미지 버튼을 클릭하면 뜨는 파일 선택창을 Playwright가 가로채 파일 경로를 직접 넣는다.
| |
에디터는 iframe 안에 있다. 네이버 블로그 글쓰기 화면은 iframe#mainFrame 안에서 돌아가므로 page.frame_locator("iframe#mainFrame")로 접근해야 한다.
삽질 기록 (이게 제일 중요)
실전에서 만난 문제들. 순서대로 다 겪었다.
- Playwright 내장 Chromium이 실행 불가 — “side-by-side configuration is incorrect” 오류. 재설치해도 안 됐고, 결국
channel="chrome"옵션으로 PC에 설치된 진짜 Chrome을 쓰게 해서 해결했다. 이 방법이 봇 감지 회피에도 오히려 유리하다. FrameLocator에는evaluate()가 없다 — iframe 안에서 JS를 실행하려면frame.locator("body").evaluate(...)처럼 요소를 잡고 실행해야 한다.- “취소” 버튼이 두 개 — 이어쓰기 팝업의 ‘취소’를
get_by_role("button", name="취소")로 찾았더니 서식 도구의 ‘취소선’ 버튼과 겹쳐 strict mode 오류. 정확한 클래스(button.se-popup-button-cancel)로 지정해야 한다. - 배치 파일이 로그 폴더 없이 리다이렉트 —
>> logs\runner.log인데 logs 폴더가 없으면 스크립트가 시작조차 안 된다.if not exist logs mkdir logs한 줄로 해결. - 블로그 미개설 계정 — 계정은 있는데 블로그를 개설한 적이 없으면 글쓰기 페이지가 아예 안 뜬다. 자동화 전에 블로그 개설부터.
스케줄링과 검증
| |
headed 브라우저를 띄우는 방식이라 PC가 켜져 있고 로그인된 상태여야 실행된다.
매일 오전 9시, 다음 실행을 기다리는 작업 스케줄러.
발행 후에는 “성공했다고 믿지 말고 확인"이 원칙. 공개된 글 URL을 실제로 가져와서 제목·본문 키워드·이미지 개수(스마트에디터 이미지 리소스 7개)까지 대조해 검증했다.
모바일 화면의 TOP1~TOP3 구간 — 카드 이미지가 본문 사이사이 의도한 위치에 정확히 들어갔다.
자주 묻는 질문 (실제로 부딪힌 것들)
Q. 크롬에 네이버 계정이 여러 개 로그인돼 있는데 괜찮나?
상관없다. Playwright는 평소 쓰는 크롬 프로필과 완전히 분리된 깨끗한 창을 띄운다. 세션 저장 단계에서 로그인한 그 계정 하나만 auth.json에 저장되고, 이후 발행은 계속 그 계정으로만 된다.
Q. 비밀번호가 어딘가에 저장되는 건 아닌가? 아니다. 로그인은 네이버 공식 페이지에서 사람이 직접 하고, 저장되는 건 세션 쿠키뿐이다. 다만 그 쿠키 파일 자체가 로그인 열쇠이므로 비밀번호처럼 다뤄야 한다. 유출이 의심되면 네이버 보안설정에서 전체 기기 로그아웃하면 즉시 무효화된다.
Q. 오전 9시에 PC가 꺼져 있으면? 그날은 발행되지 않는다. headed 브라우저를 띄우는 방식이라 PC가 켜져 있고 로그인된 상태여야 한다. 중복 방지 플래그 덕분에 나중에 수동으로 실행해도 안전하다.
Q. 세션은 언제까지 유효한가? 매일 실행이 이어지는 동안에는 스크립트가 실행 때마다 세션을 갱신해 계속 유지된다. 하지만 PC를 며칠 꺼두면 만료된다 — 실제로 6일 건너뛰었더니 만료돼서 재로그인이 필요했다. 스크립트는 로그인 페이지로 리다이렉트되는 걸 감지해 “세션 만료” 로그를 남기고 멈추도록 해뒀다.
한 가지 함정: 세션 갱신 저장을 아무 때나 하면 안 된다. 만료된 상태에서 갱신 저장이 실행되면 로그아웃 상태의 쿠키로 세션 파일을 덮어써버린다. 반드시 “로그인 확인 후에만 저장"하도록 가드를 넣어야 한다. (직접 당해보고 알았다.)
정리
- 네이버 블로그 자동 발행 = 세션 저장(auth.json) + 클립보드 HTML 붙여넣기 + 파일 선택창 가로채기 + 스케줄러 네 가지 조합이면 된다.
- 비밀번호는 어디에도 저장하지 않는다. 세션 파일만 쓰고, 그 파일을 비밀번호처럼 다룬다.
- 브라우저 자동화는 반드시 깨진다는 전제로 만들 것 — 실패 스크린샷, 로그, 중복 방지 플래그가 본체만큼 중요하다.
- 자동 발행이 되더라도 콘텐츠 품질은 별개 문제다. 네이버가 저품질로 판단하지 않도록 글 자체의 완성도를 관리하는 건 여전히 사람 몫.