블로그 자동포스팅이 며칠간 한 편도 안 나갔습니다 — 검사기가 정상 원고를 막고 있었습니다
블로그자동화를 만들어 자동포스팅을 켰는데 며칠간 한 편도 안 나갔습니다. 생성은 되는데 발행 직전에 전부 막혔습니다.
원인은 검사기였습니다. 정상 원고를 금지어가 있다고 막고 있었습니다.
1. 무엇에 걸렸는지 실제 값을 확인합니다 2. 그게 본문인지 태그 속성인지 봅니다 3. 검사 대상을 보이는 텍스트만으로 좁힙니다 4. 고친 뒤 막혔던 원고로 다시 돌려 봅니다
자동포스팅 증상 — 생성은 되는데 발행이 안 됩니다
증상 — 글은 만들어집니다. 로그에도 생성 성공이 찍힙니다. 그런데 발행 단계에서 매번 차단됩니다.
원인 — 표시광고 금지어 검사를 붙여 뒀는데, 그 검사에 원고 HTML을 통째로 넣고 있었습니다.
이미지를 넣으면 폭을 지정하는 속성이 붙습니다. 그 값에 백분율 표기가 들어갑니다.
금지어 목록에 그 표기가 들어 있었습니다. 광고에서 국내산 앞에 붙는 절대 강조 표현을 막으려던 것인데, 태그 속성값까지 같이 잡혔습니다.
저는 처음에 원고 쪽을 의심했습니다. 생성된 글에 광고 표현이 들어갔나 싶어 본문을 몇 번이나 읽었습니다. 아무리 봐도 문제가 없었습니다.
검사기에 넣는 값을 직접 찍어 보고서야 알았습니다. 본문이 아니라 태그였습니다.
실제로 돌려 보면 이렇게 갈립니다.

같은 원고입니다. 검사 대상만 다릅니다.
블로그자동화가 전부 막힌 이유
이미지를 넣은 글은 사실상 전부 걸립니다.

| 글 | 폭 지정 속성 | 결과 |
|---|---|---|
| 이미지 없는 글 | 없음 | 통과 |
| 이미지 1장 | 있음 | 차단 |
| 이미지 3장 | 있음 | 차단 |
블로그 글에 이미지를 안 넣는 경우는 드뭅니다. 그래서 거의 전부 막혔습니다. 저는 이미지를 넣는 기능을 붙인 날부터 발행이 멈췄는데, 그 둘을 연결해서 생각하지 못했습니다.
이미지를 많이 넣을수록 더 막히는 구조였습니다. 좋은 글을 쓸수록 안 나가는 셈입니다.
해결 — 검사 대상을 좁힙니다
해결 — 사람 눈에 보이는 텍스트만 뽑아서 검사합니다.

| 검사 대상 | |
|---|---|
| 본문 글자 | ✅ 검사합니다 |
| 제목 | ✅ 검사합니다 |
| 이미지 설명(alt) | ✅ 검사합니다 — 화면에 나올 수 있습니다 |
style·src·class 속성 |
❌ 빼야 합니다 |
| 태그 이름 | ❌ 빼야 합니다 |
def visible_text(html: str) -> str:
"""태그를 걷어내고 사람 눈에 보이는 글자만 남긴다."""
text = re.sub(r"<script.*?</script>", " ", html, flags=re.S)
text = re.sub(r"<style.*?</style>", " ", text, flags=re.S)
text = re.sub(r"<[^>]+>", " ", text) # 태그와 속성 제거
return re.sub(r"\s+", " ", text).strip()
hits = banned_in(visible_text(html)) # 이제 정상 원고는 안 걸린다
alt 는 빼면 안 됩니다. 이미지가 안 뜨면 그 글자가 화면에 나옵니다. 표시광고 규제 대상입니다.
고쳤는지 확인하는 법
고친 뒤 막혔던 원고를 그대로 다시 넣어 봅니다. 새 원고로 확인하면 진짜 고쳐졌는지 모릅니다.
# 차단됐던 원고들을 모아 두고 회귀 검사로 돌린다
for html in previously_blocked:
assert not banned_in(visible_text(html)), "아직 막힌다"
for html in truly_banned_samples:
assert banned_in(visible_text(html)), "막아야 하는데 통과한다"
두 방향을 다 확인해야 합니다. 정상 원고가 통과하는 것만 보면, 진짜 금지어까지 놓치게 고쳐 놨을 수 있습니다.
저는 이 두 번째 검사를 나중에 추가했습니다. 처음에는 "이제 통과된다" 만 확인하고 넘어갔는데, 그러면 검사기를 망가뜨려 놓고도 고쳤다고 착각할 수 있습니다.
왜 며칠이나 몰랐나
차단이 정상 동작으로 보였기 때문입니다. 검사기가 일하고 있다는 뜻이니까요.
| 보이던 것 | 실제 |
|---|---|
| "검수에서 차단됨" 로그 | 검사기가 제대로 도는 것으로 보임 |
| 발행 0건 | "오늘은 통과한 글이 없구나" |
| 오류 없음 | 정상 종료 |
차단 사유에 실제 값을 안 남긴 것이 결정적이었습니다. "금지어 발견" 만 적혀 있어서, 어떤 단어에 걸렸는지 몰랐습니다.
해결 — 로그에 걸린 값을 그대로 남깁니다.
log(f"차단: 금지어 {hits} · 원고 {title[:20]}")
걸린 값 한 줄만 로그에 보였어도 그날 알았을 겁니다. 저는 그걸 안 남겨서 며칠을 썼습니다.
며칠 연속 0건은 이상입니다
대안으로 아예 결과 쪽에서 잡는 장치도 같이 붙였습니다.
if published_today == 0:
state["zero_days"] += 1
if state["zero_days"] >= 2:
notify(f"{state['zero_days']}일 연속 발행 0건 — 검수 쪽을 확인하세요")
발행이 목적인 자동화에서 며칠 연속 0건은 성공이 아닙니다. 차단도 결과지만, 계속되면 이상입니다.
확인 못 한 것
금지어를 문맥까지 보고 판단하게 만들 수 있는지는 확인하지 못했습니다. 광고 문구로 쓰인 것은 막고 태그 속성값은 통과시키는 식으로요.
지금은 검사 대상을 좁히는 방식으로 풀었습니다. 본문 안에서 그 표기가 정당하게 쓰이는 경우가 있을지는 아직 모르겠습니다. 그런 사례를 아직 못 만나서 그대로 두고 있습니다.
덧붙이면 이 글을 쓰면서도 같은 일을 겪었습니다. 이 사이트에도 같은 검사기가 걸려 있어서, 원인이 된 표기를 본문에 그대로 적었더니 이 글 자체가 막혔습니다. 그래서 본문에서는 말로 풀어 쓰고 실제 값은 위 화면으로 대신했습니다.
판정 — 계속 쓴다
검사기 자체는 있어야 합니다. 표시광고 규제는 실제 위험이고, 사람이 매번 볼 수는 없습니다.
다만 검사 대상을 정확히 잡아야 합니다. 넓게 잡으면 안전한 게 아니라 아무것도 안 나갑니다. 그건 안전이 아니라 정지입니다.
차단 사유에 실제 값을 남기는 것이 이 글에서 제일 중요합니다. 이게 없으면 며칠을 잃습니다.
직접 하실 분께
하나. 금지어 검사는 보이는 텍스트에만 겁니다. HTML을 통째로 넣지 마세요.
둘. 차단 로그에 걸린 값을 그대로 남깁니다. "금지어 발견" 만으로는 아무 도움이 안 됩니다.
셋. 고친 뒤 막혔던 원고로 다시 확인합니다. 그리고 진짜 막아야 할 원고도 같이 확인합니다.
넷. 며칠 연속 발행 0건이면 알림이 오게 해두세요. 차단도 결과라고 넘기면 계속 멈춰 있습니다.
다음에는 본문 안에서 정당하게 쓰이는 표현과 규제 대상을 문맥으로 가를 수 있는지 확인해보려고 합니다. 되면 이어서 적겠습니다.