처음으로

구글 블로그

블로그 자동 발행에서 표지 없는 글이 나가지 않게 한 발행 게이트

미리 써 둔 글을 매일 한 편씩 올리는 블로그에서, 준비된 글만 고르고 나머지는 미뤄 두는 발행 게이트를 만든 순서예요.

1단계부터 보기 · 모두 11단계
한 줄 답

쓰는 일과 올리는 일을 나누고, 올리는 쪽은 «준비됨» 조건을 통과한 글만 고르게 하세요. 준비 안 된 글은 큐에서 빼지 말고 건너뛰며 기록만 남기면, 나중에 준비되는 대로 저절로 다시 잡혀요.

준비물

  • 도구예약 실행(이 사례는 GitHub Actions), 글마다 상태를 적을 파일 한 장, 파이썬
  • 돈이 장치에 따로 든 돈은 없어요.
  • 계정발행할 블로그의 API 권한
  • 걸리는 시간고르는 함수에 조건 하나를 더하는 일이라 코드는 짧아요. 상태 파일 칸을 먼저 정해 두어야 해요.
  • 난이도중급. 파이썬 함수 하나를 고칠 줄 알면 돼요.

차례

한 화면에 한 단계씩 넘기며 보세요.

  1. 1시작은 이랬어요
  2. 2알아 두기무엇이 비어 있었나
  3. 3고친 순서 1/5글마다 상태 파일 한 장을 둬요
  4. 4고친 순서 2/5«나간 글»은 올린 주소가 적혀 있는지로만 세요
  5. 5고친 순서 3/5«준비됨» 조건을 함수 하나로 만들어요
  6. 6고친 순서 4/5다음 글을 고를 때 준비 안 된 글은 건너뛰어요
  7. 7고친 순서 5/5꼭 내보내야 할 때만 쓰는 해제 옵션(--allow-unready)을 따로 두고, 예약 실행에는 넣지 않아요
  8. 8알아 두기빼지 않고 미루는 이유
  9. 9알아 두기실제로 막아 준 때
  10. 10막혔던 곳그림은 코드가 올리지 못했어요
  11. 11막혔던 곳숫자를 손으로 적으면 어긋났어요
한 쪽에 모두 보기

운영자의 영어 블로그는 글을 미리 써서 쌓아 두고, 예약 실행이 매일 아침 한 편씩 블로거 API로 올려요. 쓰는 시점과 올리는 시점이 나뉘어 있어서, 글을 몰아 써 두어도 블로그에는 하루 한 편씩 나가요.

2026년 7월 31일 블로그 저장소의 상태판에 운영자 지적이 적혔어요.

«표지없는 첫편이 왜나가?»

무엇이 비어 있었나

블로그 AI가 코드를 열어 보니 막는 장치가 없었어요.

  • 다음 글을 고르는 함수는 «아직 안 나간 글 가운데 순서가 앞선 것»만 봤어요. 표지와 본문 그림이 있는지는 보지 않았어요.
  • 올리는 스크립트는 그림이 없으면 글만 있는 글로 여기고 그대로 올렸어요. 실패하지 않으니 막을 길이 없었어요.

함수 설명에 남긴 문장이에요.

이미지가 없어도 발행 자체는 성공하므로 아무도 못 막는다.

고친 순서

글을 미리 쓰고, 사람이 표지와 그림을 올리고, 스크립트가 준비됐는지 보고, 매일 아침 한 편을 올리고, 올린 주소를 적는 다섯 단계. 준비 안 된 글은 건너뛰고 기록만 남겨요.
글을 미리 쓰고, 사람이 표지와 그림을 올리고, 스크립트가 준비됐는지 보고, 매일 아침 한 편을 올리고, 올린 주소를 적는 다섯 단계. 준비 안 된 글은 건너뛰고 기록만 남겨요.
  1. 글마다 상태 파일 한 장을 둬요. 이 블로그는 글 폴더마다 발행.yaml 이 있고, 표지가 있는지(assets.cover), 본문 그림이 몇 장인지(assets.card_count), 올린 주소(posted.blogger)를 적어요.
  2. «나간 글»은 올린 주소가 적혀 있는지로만 세요. 상태판에 손으로 편수를 적던 때는 크론이 그사이에도 글을 올려 «네 번 연속 어긋났다»고 기록돼 있어요. 그 뒤로 편수는 손으로 적지 않고 스크립트가 파일에서 직접 세요.
  3. «준비됨» 조건을 함수 하나로 만들어요. 이 블로그는 표지가 있고 본문 그림이 한 장 이상이면 준비됨이에요.
  4. 다음 글을 고를 때 준비 안 된 글은 건너뛰어요. 큐에서 빼지 않고, 건너뛴 글은 기록에 남겨요.
  5. 꼭 내보내야 할 때만 쓰는 해제 옵션(--allow-unready)을 따로 두고, 예약 실행에는 넣지 않아요.

원본 코드를 줄이면 이래요.

파이썬 코드

def is_ready(m):
    a = m.get("assets") or {}
    return bool(a.get("cover")) and int(a.get("card_count") or 0) > 0

def find_next(items, n=1):
    items = [m for m in items if not (m.get("posted") or {}).get("blogger")]   # 아직 안 나간 글
    items.sort(key=lambda m: (str(m.get("publish_date", "")), m["episode_id"]))
    for m in items:
        if not is_ready(m):
            print("건너뜀:", m["episode_id"])   # 조용히 사라지지 않게 남긴다
    return [m for m in items if is_ready(m)][:n]

글 세 편으로 돌려 보면 이미 나간 첫 글은 빠지고, 표지 없는 둘째 글은 «건너뜀»으로 찍히고, 셋째 글이 골라져요. 둘째 글에 표지를 붙이고 다시 돌리면 둘째 글이 골라져요.

빼지 않고 미루는 이유

원본 함수 설명에 이렇게 적혀 있어요.

큐에서 빼는 게 아니라 미루는 것이라, 나중에 표지가 붙으면 정렬 순서상 가장 앞이므로 자동으로 다시 잡힌다(자기 치유). 건너뛴 편은 로그에 남긴다 — 조용히 사라지면 그게 더 나쁘다.

그림 없이 나간 글을 고치려면 이미 올린 글 전체를 다시 그리는 작업을 또 돌려야 했어요. 함수 설명은 «아예 내보내지 않는 편이 싸다»고 적었어요.

7월 31일 게이트를 켜고 확인하니, 준비된 13편만 잡히고 그 뒤 글들은 빠진 것(표지, 그림)을 적은 채 건너뛰어졌어요.

실제로 막아 준 때

8월에 GitHub Actions 무료 시간이 바닥나 13일 동안 발행이 멈췄어요(그 이야기). 8월 19일 재개일을 정할 때 블로그 AI는 다시 켜면 준비된 아홉 편이 이어 나가고 열 번째 글에서 그림이 없어 멈출 거라고 계산했어요. 그래서 원래 8월 28일이던 그림 업로드 마감을 9월 9일로 다시 잡았어요. 9월 1일 다시 켜기 전 점검에서도 앞의 9편만 그림이 준비돼 있었어요.

9월 7일 운영자의 PC에서 밀린 그림 업로드 39건을 한꺼번에 돌렸고 실패는 없었어요. 원격 발행 기록에는 9월 30일까지 매일 한 편씩 찍혀 있어요.

막혔던 곳

그림은 코드가 올리지 못했어요

글을 쓰는 AI가 돌던 환경은 이미지 사이트 접속이 막혀 있었어요(프록시가 403 Forbidden). 그래서 표지 사진을 받아 올리는 일은 운영자의 PC에서 했고, 상태 파일의 표지·그림 칸도 그때 채워졌어요. 쓰는 쪽과 올리는 쪽 사이에 사람 손이 한 번 들어가는 구조라, 그 손이 늦으면 게이트가 글을 붙잡아요.

숫자를 손으로 적으면 어긋났어요

상태판에 발행 편수를 손으로 적던 동안 숫자가 네 번 연속 틀렸어요. 적는 사이에도 크론은 기다리지 않고 글을 올렸어요. 지금은 편수를 상태판에 적지 않고, 필요할 때 스크립트로 세요.

확인하지 못한 것

  • 운영자가 물은 «첫편»이 이미 표지 없이 나간 글인지, 나갈 차례였던 글인지. 나갔다면 어느 글이었는지
  • 블로거 API 자체의 예약 발행 기능을 검토했는지

근거

  • 운영자의 영어 블로그 저장소 · 2026-10-10 열어 확인. 다음 글 고르는 코드(is_ready·find_next 와 함수 설명), 올리는 스크립트의 해제 옵션, 상태판(7월 31일 게이트 항목, 8월 19일 재개 계산과 마감, 9월 1일 재개 점검, 9월 7일 업로드 39건, 편수를 적지 않게 된 까닭), 7월 31일 커밋.
  • 9월 발행 기록은 이 PC의 복제본이 9월 7일에서 멈춰 있어 GitHub 쪽 기록을 읽어 확인했어요.
  • 글 속 줄인 코드는 2026-10-10 글 세 편짜리 예시로 실제로 돌려 봤어요.

이 글을 만든 방법

  • 바탕운영자가 실제로 돌린 작업의 기록(작업 일지·설정 파일·오류 기록)
  • 쓴 쪽AI(Claude)가 썼어요
  • 독립 검수2026-10-10에 쓴 AI와 다른 AI가 원본과 대조해 통과시켰어요
  • 사실 확인2026-10-10

발행 2026-10-10