IceBlogation — 네이버·티스토리 다계정 블로그를 자동 발행하는 데스크톱 앱 2026.08.30

IceBlogation 개발일지 — 쿠팡이 반려한 한 줄, 220편을 다시 여는 일 (v1.8.0)

AI 가상인물 표시 누락으로 파트너스 최종 승인이 반려됐다. 220편을 고치는 것보다 '무엇이 안 고쳐졌는지 아는 것'이 어려웠고, 그걸 로그인 없이 확인하는 방법을 찾았다.

쿠팡 파트너스에서 최종 승인 반려 통보가 왔다. 사유는 한 줄이었다.

AI로 생성된 가상인물 사용에 대한 표시가 누락되었습니다.

그 한 줄 때문에 블로그에 올라간 글 220편을 전부 다시 열어야 했다. 우리 파이프라인은 구조적으로 "가상의 소비자"를 만든다. 정체성 파일에 페르소나를 넣고("30년 직장 생활을 마친 60대 블로거"), 그 사람의 1인칭으로 글을 쓰고, 사진급 AI 인물 이미지를 붙인다. 반려는 특정 글 한 편의 사고가 아니라 전 글의 문제였다.

고쳐야 할 문장은 이거였다. 본문 맨 앞에 이 한 줄이 있어야 한다.

고지가 반영된 실제 글

이번 일지는 그걸 220편에 넣는 사흘의 기록이다. 결론부터 쓰면, 고치는 것보다 "무엇이 안 고쳐졌는지 아는 것"이 훨씬 어려웠다.

앱이 자기 DB에 거짓말을 하고 있었다

작업을 시작하려고 "지금 공개된 글이 몇 편이냐"를 물었다. 앱은 1편이라고 했다. 실제로는 172편이 공개 중이었다.

이유는 단순했다. 예약 발행을 걸면 앱은 예약완료라고 찍고 거기서 멈춘다. 시각이 지나 네이버가 실제로 공개해도 앱에게는 아무도 알려주지 않는다. 그래서 219편이 예약완료인 채로 굳어 있었다. 택배를 부치고 송장번호만 적어둔 것과 같다. 배송 완료 여부는 택배사에 물어봐야 안다.

그럼 물어보면 되는데, 그러려면 로그인이 필요하다고 생각했다. 그게 문제였다. 며칠 전 확인하겠다고 자동 로그인을 하루에 열 번 가까이 태우다 네이버 계정에 보호조치가 걸렸었다. 확인하려다 계정을 잠그는 건 바보 같은 일이다.

그런데 확인해보니 공개된 글 목록은 로그인 없이도 받을 수 있었다.

https://m.blog.naver.com/api/blogs/<블로그>/post-list?page=1
→ HTTP 200, 공개된 글의 번호가 전부 온다

예약 대기 글은 이 목록에 안 나온다. 그러니 판정이 이렇게 단순해진다.

  • 목록에 있다 → 공개됨
  • 목록에 없다 → 아직 예약 대기

브라우저를 띄울 필요도, 로그인할 필요도 없었다. 3개 블로그 221편을 대조하는 데 2초가 걸렸고, 예약완료로 굳어 있던 175편이 발행됨으로 정리됐다. 익명으로 보는 게 오히려 정확하다는 것도 나중에 알았다. 로그인한 상태로 보면 예약 글도 내 눈에는 보인다. 독자가 보는 것과 다르다.

자동화가 "없다"고 했는데, 없는 게 아니었다

남은 44편은 아직 공개되지 않은 예약 글이었다. 이걸 고치려면 예약 글을 열어서 본문을 갈아끼우고 다시 저장해야 한다. 그런데 저장할 때 발행 시간을 "예약"으로 지켜줘야 한다. 안 그러면 9월 10일까지 흩어놓은 예약이 전부 지금 공개된다.

AI에게 시켰더니 첫 편에서 멈췄다.

🐤 카나리아: 저장이 확정되지 않음 — 예약(시간 지정) 라디오를 켜지 못해 중단
⛔ 예약이 지켜졌다고 확신할 수 없다 — 이 블로그 중단 (1편만 손댄 상태)

안전장치는 제대로 작동했다. 문제는 그다음이었다. AI가 화면을 뜯어보더니 "예약 글 수정 화면에는 예약 옵션이 아예 없다"고 보고했다. 실제로 발행 레이어를 열어보면 발행 시간에 '현재' 하나뿐이다.

잘못된 문으로 들어갔을 때 — 발행 시간에 '현재'만 있다

그러면서 대안을 세 가지 제시했다. 예약을 지우고 다시 걸든지, 공개된 뒤에 고치든지, 아니면 44편을 지금 다 공개해버리든지.

그럴 리가 있나 싶었다. 네이버에서 예약 글 수정하면 예약이 유지되는 게 당연한데.

직접 눌러보니 경로가 달랐다. 글쓰기 화면 우측 상단에 "예약 발행 24건" 버튼이 있고, 거기서 목록을 열어 글을 고르면 된다.

글쓰기 화면의 예약 발행 목록 — 여기서 글을 골라야 한다

AI는 글 주소로 직접 들어가고 있었다(postwrite?logNo=...). 그 경로로 열면 네이버가 "이미 발행된 글 수정"으로 취급해서 시간 옵션을 통째로 없앤다. 며칠 전 이미 공개된 172편을 고칠 때 검증한 경로였는데, 예약 글에는 그게 함정이었던 것이다.

목록에서 글을 골라 들어가니 같은 화면이 이렇게 바뀐다.

올바른 문으로 들어갔을 때 — 예약이 선택돼 있고 원래 시각이 그대로 있다

발행 시간이 예약으로 선택돼 있고, 날짜와 시각이 원래 걸어둔 값(2026.08.30 09:20) 그대로 채워져 있다. "설정한 시간으로 예약 발행됩니다"라는 안내까지 붙는다. 같은 글, 같은 레이어인데 어느 문으로 들어갔느냐가 전부였다.

이 차이가 얼마나 컸냐면, 그냥 진행했으면 44편이 한꺼번에 공개될 뻔했다. 반려 대응을 하다가 더 큰 사고를 낼 뻔한 것이다. 44편은 예약을 유지한 채 전부 수정됐고, 저장할 때마다 공개 목록을 다시 조회해 "하나도 공개되지 않았음"을 확인했다.

그리고 URL 하나

다 끝났다고 보고를 받았다. 그런데 눈에 걸리는 글이 있어서 주소 하나를 던졌다.

blog.naver.com/○○○○/2243788••••• 이거는 안 되어 있는데

맞았다. 공개된 176편을 전부 열어 확인해보니 172편만 고쳐져 있고 4편이 빠져 있었다. 정확히 며칠 전에 고친 그 172편만.

원인은 단발 실수가 아니라 구조였다. 수정 작업을 "이미 공개된 글"과 "아직 예약 중인 글" 두 갈래로 나눠서 했는데, 그 사이에 예약이 풀려 공개된 글은 양쪽 어디에도 안 들어갔다. 청소를 '이미 나온 방'과 '나올 예정인 방'으로 나눠서 하면, 청소하는 동안 새로 문을 연 방이 빠지는 것과 같다.

4편을 고치고 176편을 다시 감사해서 누락 0편을 확인했다.

복도를 한 바퀴 도는 일을 앱에게 시켰다

사람이 매번 URL을 짚어줄 수는 없다. 그래서 그 한 바퀴를 앱이 스스로 돌게 만들었다.

처음 AI가 제안한 건 3시간마다 공개된 글 전부를 검사하는 것이었다. 176편이면 하루에 1,408번 요청이다. 글이 늘면 그만큼 늘어난다. 낭비다.

생각해보면 글이 위반 상태로 바뀌는 순간은 딱 하나다. 예약이 풀려 공개되는 그 순간. 이미 고쳐서 확인까지 끝난 글은 아무도 안 건드리면 그대로다. 그러니 검사할 대상은 "전부"가 아니라 "방금 넘어온 것"이다.

그리고 그 후보는 네트워크 없이도 안다. 예약 시각이 지났는지 DB만 보면 되니까.

앱 켤 때 + 3시간마다
 ① 게이트  예약 시각이 지난 글이 있나?        (DB만 · 조회 0회)
            없으면 여기서 끝 ← 대부분의 경우
 ② 판정    그 블로그만 공개 목록 조회 → 실제로 떴으면 발행됨으로
 ③ 검사    방금 공개된 글만 열어서 고지 확인
            없으면 화면에 ⚠️ 경고
방식하루 요청 수
3시간마다 전수 검사1,408
승격된 글만 검사1~4

화면에는 이렇게 붙었다. 목록 위 상태줄에 "발행 확인: 1분 전 · 3시간마다 자동 · 고지 점검: 1분 전"이 뜨고, 오른쪽에 발행 확인·고지 점검 버튼이 생겼다.

v1.8.0 콘텐츠 화면 — 상태줄과 두 개의 확인 버튼

여기서 한 가지는 양보하지 않았다. 시간은 후보를 고르는 데만 쓰고, 상태를 바꾸는 근거로는 안 쓴다. 시간은 "발행됐어야 한다"만 알려주지 "발행됐다"를 알려주지 않는다. 네이버가 발행에 실패했거나, 누가 글을 지웠거나, 반대로 예약 시각 전에 공개돼버린 경우를 시간은 전부 놓친다. 실제로 이번에 예약 시각 전 공개 사고를 막은 것도 시간이 아니라 조회였다.

읽는 일은 전부 익명으로, 쓰는 일만 로그인으로. 그래서 자동으로 도는 경로에는 로그인이 한 번도 없다. 누락이 발견되면 앱은 고치지 않고 경고만 띄운다. 고치는 건 로그인이 필요하니 사람이 버튼을 눌러야 한다.

곁가지 — 비밀번호를 바꿀 곳이 없었다

계정 보호조치를 풀면 네이버 비밀번호가 바뀐다. 그런데 앱에는 그걸 고칠 화면이 없었다. 계정을 지웠다 다시 만들거나 암호 금고를 직접 만지는 수밖에 없었다.

계정 화면에 붙인 비번 변경

한 줄만 고치면 안 된다는 게 함정이었다. 티스토리는 카카오 로그인 하나가 블로그 여러 개를 물고 있어서, 앱은 블로그당 한 줄로 계정을 쪼개 둔다. 한 줄만 새 비번으로 바꾸면 나머지 줄이 옛 비번으로 로그인을 시도하다 또 잠긴다. 그래서 같은 로그인을 쓰는 줄을 한꺼번에 갱신하게 했고, 확인용 로그인은 기본으로 꺼뒀다.

남는 것

  • 공개 176편 + 예약 44편 = 220편 전부 고지 완비, 전수 감사로 누락 0편 확인
  • 오프라인 회귀 검사 421개 통과, v1.8.0 배포
  • 자동으로 도는 감시 경로의 로그인 횟수: 0

이번에 AI가 내린 결론이 두 번 틀렸고, 두 번 다 내가 되물어서 잡혔다. "예약 옵션이 없을 리가 있나", "이 URL은 아직 안 됐는데". 둘 다 그대로 갔으면 사고였다.

교훈은 하나로 모인다. 자동화가 "없습니다"라고 하면, 없는 게 아니라 잘못 열어본 걸 수도 있다. 그리고 장부가 아니라 현실에 물어야 한다. 앱이 자기 DB를 믿고 "공개된 글은 1편"이라고 말하던 게 이번 사달의 시작이었으니까.

(화면 캡처의 계정·블로그 아이디와 글 제목은 가렸습니다.)

IceBlogation — 네이버·티스토리 다계정 블로그를 자동 발행하는 데스크톱 앱 프로젝트로