워드프레스와 달리 블로거(Blogger)는 앱 비밀번호 같은 쓰기용 REST 인증이 없다. 그래서 여러 글을 한 번에 손봐야 할 때 나는 브라우저 자동화(Playwright)로 blogger.com 관리 화면을 직접 조작한다. 그러다 글 4편의 본문을 통째로 날려먹었다. 원인과 복구법, 그리고 블로거 자동화에서 미리 알았으면 좋았을 함정들을 정리한다.
무슨 일이 있었나
블로거 HTML 편집기는 내부적으로 CodeMirror를 쓴다. 자동화로 본문을 넣을 때 나는 자연스럽게 이렇게 했다.
document.querySelector('.CodeMirror').CodeMirror.setValue(newHtml);
화면상으로는 본문이 멀쩡히 들어가 있었다. 그런데 게시를 누르자 “저장하지 않은 변경사항은 삭제됩니다” 다이얼로그가 떴고, 무심코 수락하자 방금 넣은 본문이 전부 사라졌다. 4편이 그렇게 날아갔다(다행히 원본이 있어 복구했다).
원인: 화면엔 보이는데 ‘변경됨’ 상태가 안 켜진다
CodeMirror.setValue()는 에디터의 화면 값만 바꾼다. 블로거 내부의 “변경됨(dirty)” 플래그가 켜지지 않기 때문에, 블로거는 “이 글은 안 바뀐 글”로 판단한다. 그 상태에서 게시하면 방금 넣은 내용을 “저장 안 된 변경사항”으로 취급해 버린다. 그 다이얼로그가 바로 경고였는데, 뜻을 모르고 수락한 게 화근이었다.
해결: 실제 타이핑으로 입력한다
답은 단순하다. 값을 주입하지 말고 실제 키 입력(Playwright의 fill/type)으로 넣는다. 그러면 dirty 플래그가 정상적으로 켜지고 저장된다. 기존 본문을 지울 때만 setValue('')를 써도 된다 — 비우는 건 문제가 안 된다.
규칙: 넣을 땐 타이핑, 지울 땐 setValue.
덤으로 걸린 함정들
- 라벨(태그)은 클릭해야 확정된다. 입력란에 텍스트만 채우면 저장 안 되고, Enter는 줄바꿈으로 들어간다. 입력 → 방향키 아래 → 나타난 추천 목록의 항목 클릭. 이걸 몰라 신규 10편의 라벨이 통째로 누락됐고, 관리 모드의 벌크 라벨 지정으로 복구했다(벌크 지정은 안전하다).
- 글 목록은 가상 스크롤이다. 처음엔 40~50행만 DOM에 로드된다. 전체를 처리하려면 스크롤 컨테이너를 끝까지 밀며 scroll 이벤트를 반복 발생시켜 전부 로드해야 한다.
- 관리 모드(체크박스)는 라벨 적용·삭제 후 자동 해제된다. 그룹마다 “관리” 버튼을 다시 눌러야 한다.
- DOM에 이전 글의 CodeMirror가 남는다. 검증할 때 숨은 옛 에디터를 잡을 수 있으니,
offsetParent !== null로 보이는 것만 필터링해야 한다. - 예약 글은 공개 피드에 안 뜬다. 검증은 공개 피드로 하되, 예약 글은 편집기를 새로고침해 직접 확인해야 한다.
교훈
워드프레스였다면 REST 한 줄로 끝났을 일이다. 블로거는 무료·구글 통합이라는 장점이 크지만, 대량 작업 자동화에서는 함정이 많다. 특히 “화면에 보이는 것”과 “실제로 저장되는 것”이 다를 수 있다는 걸, 나는 글 4편을 잃고서야 몸으로 배웠다. 플랫폼마다 자동화의 결이 다르다.
그래서 결론은 ‘검증 습관’이다
블로거 자동화의 교훈을 한 줄로 줄이면 “화면에 보이는 것을 믿지 말고, 저장된 것을 확인하라”이다. 나는 이후로 작업 뒤 반드시 공개 피드(/feeds/BLOG_ID/posts/default?alt=json)로 실제 저장 상태를 검증한다. 단 예약 글은 피드에 안 뜨니 편집기를 새로고침해 따로 확인한다. 자동화는 “빠르게 많이”가 매력이지만, 검증 없는 자동화는 실수도 빠르게 대량으로 만든다. 4편을 날린 뒤 내가 얻은 건 기술 지식보다 이 습관이었다.