사진 몇 장과 그날 있었던 일을 짧게 적어보면, 내 말투로 네이버 블로그 글을 만들고 사진과 장소까지 자동으로 넣을 수 있을까?
처음에는 단순히 글을 대신 써주는 정도를 생각했다. 그런데 실제로 해보니 문체 분석, 사진 파일 관리, 장소 확인, 브라우저 입력, 네이버 정책까지 함께 고려해야 했다. 이번 글은 개발자가 아닌 사람도 전체 흐름을 이해할 수 있도록 준비부터 실제 입력 성공까지 있었던 일을 순서대로 정리한 기록이다.
1. 목표부터 명확하게 정했다
원하는 결과는 다음과 같았다.
- 사진 여러 장과 짧은 메모를 대화창에 올린다.
- 기존 블로그 글과 비슷한 말투로 초안을 만든다.
- 사진 순서와 대표 사진을 정리한다.
- 맛집 글이라면 실제 네이버 지도에서 정확한 지점을 찾는다.
- 로그인된 Chrome의 네이버 편집기에 제목, 본문, 사진, 장소를 넣는다.
- 마지막 발행은 사람이 직접 확인하고 진행한다.
여기서 중요한 점은 ‘무조건 자동 발행’이 아니라 ‘반복 작업은 자동으로 하고, 중요한 결정은 사람이 확인하는 방식’이라는 것이다.
2. 작업 환경
이번 자동화는 다음 환경에서 진행했다.
- Windows x64 PC
- Codex 데스크톱 앱
- 로그인된 Google Chrome
- ChatGPT Chrome 확장 프로그램
- Python 3.14.3
- 네이버 블로그 PC 스마트에디터
- 진행 과정 기록용 Obsidian 보관함
별도의 네이버 전용 Chrome 확장 프로그램을 새로 만들지는 않았다. 이미 연결된 Chrome을 Codex가 제어하고, Python은 브라우저를 직접 움직이는 대신 입력 자료를 검사하고 정리하는 역할을 맡았다.
3. 공식 글쓰기 API부터 확인했다
가장 먼저 네이버에서 공식 글쓰기 API를 제공하는지 확인했다. 결론부터 말하면 현재 외부 프로그램이 네이버 블로그 글을 생성·수정·발행하는 공식 공개 API는 없다.
- 블로그 글쓰기 Open API: 2020년 5월 6일 종료
- 블로그 앱 글쓰기 URL Scheme: 2022년 12월 23일 종료
- 블로그 검색 API: 현재 제공되지만 읽기 전용
- 네이버 공유하기: URL과 제목을 공유 화면으로 전달하는 기능
네이버 이용약관도 자동 게시, 자동 검색, CAPTCHA 우회 같은 행동을 제한하고 있다. 따라서 비공식 통신 주소를 찾아 무인으로 대량 발행하는 방식은 처음부터 제외했다.
대신 로그인된 브라우저에서 사람이 하던 편집 작업을 보조하고, 최종 발행은 사용자가 수행하는 구조로 방향을 잡았다.
4. 내 글쓰기 스타일을 먼저 분석했다
자동으로 작성한 글이 기존 글과 전혀 다르면 편리해도 계속 쓰기 어렵다. 그래서 기존 네이버 블로그의 전체 글 15개를 실제 Chrome으로 읽고 공통점을 정리했다.
확인된 특징은 다음과 같았다.
- 사진 사이에 한두 문장을 넣는 짧은 문단
- 시간순으로 자연스럽게 이어지는 구성
- ~했다, ~같다, ~가야겠다처럼 말하듯 쓰는 문체
- ㅎㅎ, !!, ,,, 같은 가벼운 감정 표현
- 좋았던 점뿐 아니라 아쉬웠던 점도 솔직하게 기록
- 긴 결론 대신 끝, 마무리, 다시 가야겠다처럼 짧은 마무리
이 결과는 style.md에 저장했다. 이후 Codex는 글을 만들 때 이 파일을 읽고, 사용자가 말하지 않은 경험이나 감정을 임의로 추가하지 않도록 했다.
5. Markdown 하나가 아니라 하네스를 만들었다
작업 규칙을 Markdown 파일 하나에만 적어두면 설명은 가능하지만, 사진 누락이나 경로 오류까지 막기는 어렵다. 그래서 개인용 Codex 스킬과 Python 검증기를 함께 만들었다.
naver-blog-assistant/
├─ SKILL.md
├─ agents/openai.yaml
├─ scripts/harness.py
├─ references/style.md
├─ references/settings.yaml
├─ references/request.schema.json
└─ assets/templates/
├─ daily.md
└─ place-review.md
파일의 역할을 쉽게 설명하면 다음과 같다.
- SKILL.md: Codex가 매번 따라야 하는 업무 매뉴얼
- style.md: 내 말투와 글쓰기 습관
- settings.yaml: 승인 절차, 사진 보관 위치, 편집기 기본값
- request.schema.json: 날짜·사건·사진·장소가 빠졌는지 확인하는 제출 양식
- harness.py: 파일과 입력 내용을 실제로 검사하는 점검 프로그램
- templates: 일상 글과 장소 리뷰의 기본 뼈대
하네스라는 말이 어렵게 들릴 수 있지만, 여기서는 ‘매번 같은 순서로 빠짐없이 일하도록 만든 작업 틀’ 정도로 이해하면 된다.
6. Python 하네스가 검사하는 것
사용자가 사진을 올리면 대화에 보이는 이미지만 믿지 않고 실제 로컬 절대 경로가 있는지 확인한다. 이후 게시글별 작업 폴더로 복사하고 순번을 붙인다.
py -3 -X utf8 scripts\harness.py new REQUEST.json --type place_review
py -3 -X utf8 scripts\harness.py validate REQUEST.json
py -3 -X utf8 scripts\harness.py prepare REQUEST.json
검사 항목은 다음과 같다.
- 날짜와 글 종류가 입력됐는지
- 시간순 메모와 사진 ID가 올바르게 연결됐는지
- 사진이 실제 파일로 존재하는지
- 확장자, 용량, 이미지 크기가 정상인지
- 같은 사진이 중복됐는지
- EXIF 또는 GPS 메타데이터 가능성이 있는지
- 확장자와 실제 이미지 형식이 일치하는지
- 대표 사진이 여러 장으로 지정되지 않았는지
- 장소 리뷰에 정확한 지점과 주소 또는 네이버 지도 링크가 있는지
- 기존 작업 폴더를 실수로 덮어쓰지 않는지
검사를 통과하면 다음 파일이 생성된다.
2026-05-28-이복희해장-선릉본점/
├─ assets/
│ ├─ 01-food.jpg
│ └─ 02-sign.jpg
├─ request.normalized.json
├─ manifest.json
├─ draft-outline.md
└─ draft.md
7. 브라우저에서 먼저 드라이런했다
코드를 만든 뒤 바로 글부터 쓰지는 않았다. 로그인된 Chrome에서 네이버 글쓰기 화면을 열고 다음 항목이 실제로 보이는지 확인했다.
- 빈 제목과 본문 영역
- 사진, 장소, 템플릿 버튼
- 나눔고딕, 글자 크기 15
- 임시저장과 발행 버튼
- 카테고리, 공개 범위, 댓글, 공감, 검색 설정
장소 기능은 석촌호수를 검색해 실제 결과가 나오는 것까지만 확인했고, 발행 설정 화면도 열어서 현재 값을 읽은 뒤 아무것도 바꾸지 않고 닫았다.
8. 실제 사진 두 장으로 첫 글을 만들어봤다
이번 실전 입력에 사용한 메모는 아주 짧았다.
선릉역의 이복희해장에 팀분들과 방문.
원격 웨이팅 후 약 20분 기다렸지만 맛있었다.
방문일은 2026년 5월 28일.
사진은 음식 사진과 간판 사진 두 장이었다. 하네스 검사 결과 두 파일 모두 JPEG, 960×1280이었고 EXIF 정보는 없었다. 사진은 전달받은 순서대로 01-food.jpg, 02-sign.jpg로 복사했다.
장소는 네이버 지도에서 직접 검색했다.
이복희해장 선릉본점
서울특별시 강남구 테헤란로70길 14-12 지상1층
이후 내 문체에 맞춘 짧은 초안을 만들고 확인을 받은 뒤 네이버 편집기에 입력했다.
팀분들이랑 선릉역 이복희해장에 갔다.
원격 웨이팅 걸어두고 갔는데도
20분 정도 걸렸다,,,
그래도 맛있었다 ㅎㅎ
9. 실제 자동화 중 예상하지 못한 문제도 있었다
처음 사진 버튼을 눌렀을 때 파일 선택 창은 열렸지만, Chrome 확장의 ‘파일 URL 접근 허용’ 설정이 꺼져 있어 준비한 사진 경로를 전달할 수 없었다.
처음에는 여기서 작업을 중단했다. 하지만 사진이 막혔다고 제목, 나머지 본문, 장소까지 모두 멈출 이유는 없었다. 이 경험을 반영해 스킬 규칙을 다시 수정했다.
- 한 번 입력 승인을 받으면 제목·본문·사진·장소를 연속 처리한다.
- 일부 기능이 막혀도 독립적으로 가능한 작업은 계속한다.
- 파일 선택 방식이 실패하면 편집기가 지원하는 이미지 붙여넣기를 사용한다.
- 사진 개수와 순서가 맞는지 다시 검사한다.
- 실제로 해결할 수 없는 문제가 있을 때만 멈춘다.
결국 이미지 데이터를 브라우저 클립보드에 넣고 네이버 편집기에 붙여넣는 방식으로 두 사진을 모두 삽입했다. 음식 사진 다음에 간판 사진이 배치됐고, 마지막에는 검색으로 확인한 장소 컴포넌트도 추가됐다.
10. 현재 완성된 자동화 흐름
현재는 다음 순서로 작업한다.
사진과 짧은 메모 전달
→ 로컬 사진 경로 확인
→ 날짜·사건·감상·장소 확인
→ Python 하네스로 누락과 사진 검사
→ 게시글별 작업 폴더 생성
→ 기존 글쓰기 스타일로 초안 작성
→ 사용자에게 제목과 구성 확인
→ 로그인된 Chrome의 빈 편집기 확인
→ 제목과 전체 본문 입력
→ 모든 사진을 원래 순서대로 배치
→ 네이버 지도에서 정확한 장소 검색 및 삽입
→ 입력 결과 검증
→ 사용자가 최종 검토 후 직접 발행
같은 글에 사진을 더 올리면 현재 작업 폴더와 편집기에서 이어서 처리한다. 새 글이라면 방문 날짜, 장소, 있었던 일을 함께 전달하면 별도 작업 폴더와 초안을 만든다.
11. 완전 무인 자동화로 만들지 않은 이유
기술적으로 브라우저 버튼을 누르고 내용을 입력할 수 있다고 해서 모든 행동을 무인으로 맡기는 것이 안전한 것은 아니다.
- 네이버 공식 글쓰기 API가 없다.
- 네이버 화면이 바뀌면 선택자와 입력 방식도 바뀔 수 있다.
- 같은 이름의 장소가 많아 정확한 지점 확인이 필요하다.
- 사진에는 위치 정보나 개인정보가 포함될 수 있다.
- 자동저장과 임시저장 상태를 사용자가 알아야 한다.
- 마지막 공개 발행은 계정에 직접 영향을 주는 행동이다.
그래서 현재 구조에서는 글 입력까지 자동으로 처리하고 저장 설정과 최종 발행은 별도 단계로 둔다. 실제 시험 중 네이버 편집기에 자동저장 시각이 표시됐지만 저장 버튼과 최종 발행 버튼은 누르지 않았다.
12. 사용하려면 무엇이 필요한가
비슷한 방식을 적용하려면 다음이 필요하다.
- 로그인된 Chrome과 브라우저 제어 확장
- 기존 글을 바탕으로 만든 문체 기준
- 사진을 로컬 파일로 전달받을 수 있는 작업 환경
- 누락과 경로를 검사할 Python 하네스
- 일상 글과 장소 리뷰용 템플릿
- 입력·저장·발행을 구분한 승인 규칙
사용자는 복잡한 명령을 직접 실행할 필요가 없다. 사진, 날짜, 장소, 있었던 일과 감상을 전달하면 하네스와 Codex가 내부 절차를 수행한다.
마무리
이번에 만든 것은 버튼 하나로 무한히 글을 발행하는 봇이 아니다. 사진과 짧은 메모를 안전하게 검사하고, 내 글쓰기 스타일로 초안을 만들고, 실제 네이버 편집기에 사진과 장소까지 빠짐없이 넣어주는 ‘확인형 자동화’다.
완전 자동화보다 한 단계 덜 자동처럼 보일 수 있지만, 계정과 글의 품질을 지키면서 반복 작업을 크게 줄일 수 있다는 점에서 현재로서는 가장 현실적인 방식이라고 생각한다.
사진 몇 장과 한두 줄의 메모만으로 여기까지 이어졌으니, 이제부터는 실제로 글을 쌓으면서 문체와 배치 규칙을 조금씩 다듬어갈 예정이다.
참고한 공식 자료
- 네이버 블로그 오픈 API 종료 안내: https://developers.naver.com/notice/article/7527
- 네이버 블로그 앱 글쓰기 URL Scheme 종료 안내: https://developers.naver.com/notice/article/8595
- 네이버 이용약관: https://policy.naver.com/rules/service.html
- 네이버 스마트에디터 도움말: https://help.naver.com/service/5593
13. 실제 자동화 화면
아래 화면은 로그인된 Chrome에서 네이버 편집기에 제목, 본문, 사진, 장소를 실제로 입력한 결과다.



'코딩공부' 카테고리의 다른 글
| redis를 사용하여 원하는 데이터 백업하기 (0) | 2025.03.16 |
|---|---|
| Apache Kafka를 실행해보자 (0) | 2025.02.16 |
| Kotlin 런타임 시간 개선하기 (1) | 2025.02.02 |
| Kotlin으로 Chunk 사용하기, Spring와 얼마나 다를까? (1) | 2025.01.19 |
| Spring Boot 3.x에서 Chunk 사용해서 데이터 read, write 사용률 알아보기 (4) | 2024.12.24 |