[연재] ads.txt와 동의 메시지 — 승인 후에 할 일
배포 기록은 290장이라고 했습니다
이 편은 원래 이런 글이 될 예정이었어요. "광고 승인이 나기 전에 미리 깔아두는 파일이 하나 있는데, 한 줄짜리인데도 이게 없으면 수익이 깎입니다." 그 파일 얘기를 하고, 유럽에서 뜨는 동의 창 얘기를 하고, 승인 나면 눌러야 할 것들을 순서대로 적어두는 글이요.
그래서 쓰기 전에 확인을 했습니다. 배포 기록에는 이렇게 찍혀 있었어요.
[adsense] 스크립트 주입 290개 페이지 · ads.txt 생성 · noindex 라 제외 12개
290장에 넣었고, 12장은 일부러 뺐다. 합쳐서 302장. 제 사이트 전체 장수와 정확히 맞습니다. 깔끔하죠.
그런데 이 글에 넣을 사진을 찍으려고 화면을 하나씩 열어보다가 이상한 걸 봤습니다. 시장 지표 화면에 광고 코드가 없더라고요. 기록은 넣었다고 했는데요.
그래서 다 세어봤습니다.
| 장수 | |
|---|---|
| 전체 페이지 | 302장 |
| 광고 코드가 있는 장 | 287장 |
| 일부러 뺀 장 (noindex) | 7장 |
| 설명이 안 되는 장 | 8장 |
8장이 비어 있었습니다. 그리고 그 8장에는 이 사이트에서 가장 자주 열리는 화면 중 하나가 들어 있었어요.
원인은 이 글 뒤쪽에 적겠습니다. 먼저 한 줄짜리 파일부터요. 결국 그 8장이 사라진 이유도, 이 파일이 어떻게 만들어지는지를 알아야 보이거든요.
한 줄이 수익률을 가릅니다
ads.txt는 이렇게 생겼습니다. 전부입니다. 진짜로 한 줄이에요.

google.com, pub-9975848405834605, DIRECT, f08c47fec0942fa0
쉼표로 네 칸이고, 뜻은 이렇습니다.
google.com— 광고를 파는 곳이 구글이라는 뜻pub-9975848405834605— 파는 권한을 가진 계정 번호. 제 계정입니다DIRECT— 중간에 대행사 없이 제가 직접 계약했다는 뜻f08c47fec0942fa0— 구글이라는 회사를 가리키는 고정 식별자. 구글 광고를 쓰는 사이트는 전부 이 값이 같습니다
풀어 쓰면 "이 사이트의 광고 자리를 팔 권한은 이 계정 하나뿐이다" 라는 선언이에요. 그리고 이 선언은 광고주가 읽습니다.
왜 필요하냐면, 광고 시장에는 남의 사이트인 척하고 광고 자리를 파는 일이 있기 때문입니다. 광고주 입장에서는 "victor-house.com에 광고를 걸었다"고 돈을 냈는데 실제로는 엉뚱한 데 걸릴 수 있는 거죠. 그래서 사이트 주인이 자기 뿌리에 "내 자리를 파는 건 얘뿐"이라고 명단을 붙여두게 한 겁니다.
이 파일이 없으면 광고가 붙어도 값이 떨어집니다. 광고 계정 쪽에서 "승인되지 않은 판매자" 경고가 뜨고, 그 상태의 자리는 광고주가 잘 안 사요. 코드에도 그렇게 적어뒀습니다.
# 2. 뿌리에 `ads.txt`.
# "이 사이트의 광고 지면을 팔 권한이 있는 건 이 퍼블리셔뿐"이라는 선언이다.
# 없으면 애드센스가 '승인되지 않은 판매자' 경고를 띄우고, 그 상태에서는
# 광고 단가가 떨어진다. 뿌리에 있는 것만 읽히므로 도구 경로마다 둘 필요는 없다.
한 줄짜리 텍스트 파일 하나가 같은 광고의 값을 가르는 겁니다. 만드는 데 3초 걸리는 파일이고요.
ca-pub- 과 pub- 은 다릅니다
여기서 처음 걸리는 자리가 나옵니다.
광고 계정에서 받는 제 번호는 ca-pub-9975848405834605 입니다. 앞에 ca-가 붙어 있어요. 페이지 머리에 넣는 스크립트에는 이 값을 그대로 씁니다.
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9975848405834605" crossorigin="anonymous"></script>
그런데 ads.txt에는 ca-를 떼고 pub-9975848405834605 로 적어야 합니다. 같은 번호인데 적는 자리에 따라 앞 두 글자가 달라요.
이런 건 사람이 옮겨 적으면 언젠가 틀립니다. 한 번은 맞게 적어도, 나중에 계정을 바꾸거나 도메인을 하나 더 붙일 때 한쪽만 고치거든요. 그래서 번호를 적는 자리를 한 곳으로 몰았습니다.
# 애드센스 퍼블리셔 ID. 승인(또는 신청) 후 받는 `ca-pub-` 로 시작하는 값.
ADSENSE_CLIENT="ca-pub-9975848405834605"
설정 파일에 한 번만 적고, 파일을 만드는 쪽에서 알아서 앞을 떼게 했어요.
# ads.txt — 퍼블리셔 ID 는 `pub-…` 형태로 적는다(`ca-` 접두는 뺀다).
pub = client.removeprefix("ca-")
이게 이 편에서 반복해서 나오는 얘기의 첫 번째 판입니다. 같은 값을 두 군데 적어야 하는 상황이 오면, 사람이 두 번 적지 말고 한 번 적어서 코드가 두 곳에 뿌리게 한다. 두 번 적는 순간 언젠가 갈라지거든요.
뿌리에 있는 것만 읽힙니다
두 번째 규칙입니다. ads.txt는 사이트 뿌리에만 있어야 합니다.
victor-house.com/ads.txt 는 읽힙니다. victor-house.com/leave/ads.txt 는 아무도 안 봐요. 도구 폴더 안에 넣으면 파일은 멀쩡히 있는데 아무 일도 안 일어납니다. 있는데 없는 거죠.
같은 규칙을 쓰는 파일이 둘 더 있어요. 검색로봇에게 하는 말(robots.txt)과 주소 목록(sitemap.xml)입니다.

제 사이트는 도구를 여섯 개 넘게 한 도메인 아래 경로로 붙여 놨습니다. 도구마다 따로 만들어져 있던 이 파일들이 배포할 때 딸려 오는데, 그걸 그대로 두면 뿌리에 뭐가 올라갈지 알 수 없어요. 그래서 배포 막바지에 한 번 정리합니다.
"""흩어진 robots.txt / sitemap.xml / _headers 를 뿌리 한 벌로 합친다.
한 도메인에는 robots.txt 도 sitemap.xml 도 _headers 도 뿌리에 있는 것만
읽힌다. /leave/robots.txt 는 아무도 보지 않는다."""
ads.txt도 같은 성격이라 같은 자리에서 만듭니다. 도구 폴더마다 뿌릴 필요가 없어요.
그 파일을 손으로 만들면 내일 없어집니다
여기가 이 편에서 실제로 제일 조심해야 했던 대목입니다.
파일이 한 줄이니까 그냥 손으로 만들어 두고 싶어져요. 텍스트 편집기 열고 한 줄 치고 저장, 끝. 그런데 그러면 안 됩니다.
제 배포 스크립트는 시작하자마자 이렇게 합니다.
OUT="$ROOT/site-all"
rm -rf "$OUT"; mkdir -p "$OUT"
올릴 폴더를 통째로 지우고 처음부터 다시 짓습니다. 어제 뭐가 들어 있었는지 신경 안 쓰고, 매번 백지에서 시작하는 방식이에요. 그래야 "옛날에 지운 페이지가 왜 아직 사이트에 있지?" 같은 일이 안 생기거든요.
대신 대가가 있습니다. 그 폴더에 손으로 둔 파일은 다음 배포에 사라집니다. 오늘 만들어 두면 오늘은 있고, 내일 아침 9시가 지나면 없어요. 그것도 조용히요 — 에러도 안 나고 경고도 안 뜹니다. 어느 날 광고 계정에 "승인되지 않은 판매자" 경고가 떠서야 알게 되는 겁니다.
실제로 이 함정에 걸릴 뻔한 적이 있어요. 다른 도구에서 내려받기용 파일 열세 개를 그 폴더에 뒀다가, 다음 배포에 통째로 없어질 자리라는 걸 뒤늦게 알았습니다. 그래서 코드에 별표를 붙여 적어놨어요.
# ★site-all 은 이 스크립트가 맨 앞에서 통째로 지우는 자리라,
# 받는 파일을 여기 두면 다음 배포에 404 가 된다(13개가 그럴 뻔했다).
그래서 ads.txt는 손으로 만들지 않습니다. 배포할 때마다 코드가 다시 만듭니다. 매번 새로 쓰니까 지워질 일이 없어요. 지워지고 다시 생기는 거죠.
승인 전에는 아무것도 안 붙입니다
설정 파일에 번호를 안 적으면 어떻게 되냐면, 아무 일도 안 일어납니다.
if not client:
print("[adsense] 퍼블리셔 ID 미설정 → 건너뜀")
return 0
스크립트도 안 들어가고 ads.txt도 안 만들어져요. 왜 이렇게 해뒀냐면, 승인이 안 났는데 광고 코드만 먼저 들어가면 화면에 빈 자리가 생기기 때문입니다. 광고가 들어올 자리는 잡혀 있는데 들어올 광고가 없으니까 그냥 빈칸이에요. 그게 여기저기 뚫려 있는 사이트를 심사원이 본다고 생각하면 좋을 게 없죠.
번호를 채우면 두 가지가 한꺼번에 붙습니다. 모든 페이지 머리의 스크립트 하나, 그리고 뿌리의 ads.txt 하나. 한 줄 고치고 배포하면 끝이에요.
얇은 장에는 광고를 안 붙입니다
지난 편에서 적었듯이 저는 8월에 광고 심사에서 두 번 떨어졌습니다. 사유는 둘 다 같았어요. 자료를 틀에 부어 찍어낸 얇은 페이지가 너무 많다.
그래서 규칙을 하나 더 넣었습니다. 검색엔진에 안 내미는 얇은 장에는 광고 코드도 안 붙입니다.
# noindex 페이지에는 광고를 안 붙인다. 검색엔진에 안 내미는 얇은 장에
# 광고만 얹어두면 심사에서 "가치가 별로 없는 콘텐츠"로 잡히는 자리를
# 늘리기만 한다(2026-08-02 거절 사유).
if NOINDEX_RE.search(html):
noindexed += 1
continue
이게 왜 중요하냐면, 두 규칙이 순서로 이어져 있기 때문입니다. 배포 중간에 "본문이 1,500자 미만인 낱개 페이지"를 찾아 표시를 다는 단계가 있어요. 그 단계가 먼저 돌고, 광고 코드를 넣는 단계가 나중에 돕니다. 그래서 표시가 달린 장은 자동으로 광고에서 빠져요.
# inject-adsense.py 는 noindex 페이지를 이미 건너뛰므로(그 파일의 규칙),
# 여기서 noindex 를 박으면 광고도 자동으로 안 붙는다.
앞으로 얇다고 판정되는 페이지가 새로 생겨도 광고 쪽은 손댈 게 없다는 뜻입니다. 규칙 하나가 두 곳에서 일하는 거죠.
이 판정이 글자수로만 이뤄진다는 게 좀 야박하긴 합니다. 예를 들어 육아휴직 제도를 설명하는 이 장은 사람이 읽기에는 멀쩡하거든요.

그런데 1,500자가 안 돼서 얇은 장으로 분류됐고, 그래서 광고가 안 붙습니다. 저는 이 판정을 안 뒤집었어요. 기준을 내용으로 바꾸는 순간 "이건 좋은 글이니까 예외" 같은 판단이 매번 필요해지는데, 그 판단을 매일 아침 배포마다 할 수는 없으니까요. 기준이 조금 야박한 게 기준이 없는 것보다 낫습니다.
동의 메시지는 코드가 아니라 계정 화면에서 켭니다
여기서 성격이 완전히 다른 일이 하나 나옵니다.
유럽이나 영국에서 제 사이트에 들어오면, 광고 쿠키를 써도 되는지 묻는 창이 먼저 떠야 합니다. 안 물어보고 쿠키를 쓰면 그쪽 법을 어기는 거고, 광고 계정도 그 상태로는 광고를 안 내보내요.
그런데 이건 코드로 만드는 게 아닙니다. 광고 계정 화면에 들어가서 켜는 설정이에요. 문구를 고르고, 어느 나라에 보여줄지 고르고, 게시 버튼을 누르면 끝입니다. 제 사이트 코드에는 관련된 줄이 한 줄도 없어요. 이미 넣어둔 광고 스크립트가 알아서 그 창을 불러옵니다.
그래서 이 편의 할 일 목록은 처음부터 두 갈래로 갈라집니다.
코드로 하는 일
- 페이지 머리에 광고 스크립트 넣기
- 뿌리에
ads.txt만들기 - 얇은 장은 광고에서 빼기
- 설정 파일에 번호 한 번만 적기
계정 화면에서 하는 일
- 동의 메시지 만들고 게시하기
- 심사 요청 버튼 누르기
- 승인 후 자동 광고 켜기
두 갈래를 섞으면 "코드는 다 맞는데 왜 안 되지"로 며칠을 씁니다. 반대도 마찬가지고요.
확인할 수 없는 기능이 하나 있습니다
여기가 이 편에서 제일 불편한 대목입니다.
동의 창은 한국에서 접속하면 안 뜹니다. 유럽·영국에서 들어올 때만 뜨거든요. 제가 브라우저를 아무리 열어봐도 안 나와요. 안 뜨는 게 정상이니까요.
그래서 이 기능은 제가 눈으로 확인을 못 했습니다. 이 연재에서 제가 계속 지키려는 규칙이 "화면을 직접 열어보고 쓴다"인데, 이 항목만은 그렇게 못 했어요. 그래서 이 편에 "동의 창이 잘 뜨는 걸 확인했습니다"라는 문장은 없습니다. 없는 게 맞고요.
대신 제가 한 건 약속을 문서에 적어두는 것까지였습니다.

개인정보처리방침 2절에 이렇게 적혀 있어요.
유럽경제지역(EEA)·영국에서 접속하시면 광고 쿠키 사용에 대한 동의 창이 먼저 뜹니다. 한 번 고른 뒤에도 언제든 바꿀 수 있습니다 — 화면 좌하단의 개인정보 설정(또는 동의 관리) 버튼을 누르면 동의 창이 다시 열립니다. 동의하지 않으셔도 글과 도구는 그대로 쓰실 수 있습니다.
이 문단은 약속입니다. 그리고 약속은 지켜지지 않으면 거짓말이 돼요. "좌하단 버튼을 누르면 다시 열립니다"라고 적어놨는데 그 버튼이 없으면, 유럽에서 들어온 분한테 제 사이트가 거짓말을 하는 겁니다.
지난 편에 적었던 그 사고랑 똑같은 모양이에요. 푸터에 "서버도 데이터베이스도 쓰지 않습니다"라고 써놓고 38분 뒤에 데이터베이스를 붙였던 그 건이요. 화면에 적은 문장은 그 순간의 사실이지, 계속 사실인 게 아닙니다.
그래서 이건 "언젠가 확인해야 하는 항목"으로 남겨뒀습니다. 유럽에서 접속할 수 있는 방법이 생기거나, 그쪽에서 들어온 분이 알려주시면 그때 맞추는 거죠. 이렇게 열어놓는 게 찝찝하지만, 확인 안 한 걸 확인했다고 적는 것보다는 낫습니다.
승인이 나면 순서대로 할 일
아직 결과를 못 받았습니다. 8월 13일에 재심사를 넣었고, 이 글을 쓰는 지금까지 소식이 없어요. 그래서 이 목록은 미리 적어두는 것입니다.
미리 적어두는 이유가 있어요. 승인 메일이 오면 기분이 좋아서 이것저것 눌러보게 되는데, 그때 순서를 틀리면 며칠을 날립니다. 차분할 때 적어두는 게 낫죠.
① 심사 모드를 뗀다 — 그런데 밖에서는 못 끕니다
심사 기간 동안 저는 자동으로 찍어낸 페이지 5,188장을 배포에서 아예 빼고 있습니다. 검색엔진에 표시만 달아두는 게 아니라 파일 자체를 안 올려요. 심사원은 표시를 읽는 게 아니라 문을 직접 열어보니까요.
승인이 나면 이걸 되돌립니다. 배포 스크립트의 이 칸이에요.
# 승인이 나면 이 줄의 REVIEW_MODE 를 빼고 다시 배포하면 원래대로 돌아온다.
if [ -n "${REVIEW_MODE:-1}" ]; then
python3 "$ROOT/review-mode.py" "$OUT"
fi
그런데 이 줄을 자세히 보다가 하나 알았습니다. 이 스위치는 밖에서 못 끕니다.
보통 이런 설정은 명령 앞에 값을 붙여서 끄거든요. REVIEW_MODE=0 bash publish-all.sh 이런 식으로요. 그런데 저 줄은 그렇게 안 됩니다. 직접 돌려서 확인했어요.
REVIEW_MODE=0 → 심사모드 켜짐
REVIEW_MODE=빈값 → 심사모드 켜짐
아무것도 안 줌 → 심사모드 켜짐
셋 다 켜집니다. ${REVIEW_MODE:-1} 이라고 적으면 "값이 없으면 1로 친다"는 뜻인데, 0을 넣든 빈칸을 넣든 결국 켜진 것으로 판정되는 자리예요. 끄는 유일한 방법은 파일을 열어서 그 줄을 지우는 겁니다.
이게 실수인지 일부러인지 따져봤는데, 결과적으로는 일부러 그런 편이 맞다고 봤습니다. 심사 모드가 실수로 풀리면 세 번째로 떨어지거든요. 밖에서 툭 끌 수 있는 스위치는 언젠가 툭 꺼집니다. 파일을 열어야만 끌 수 있으면 그럴 일이 없죠.
다만 이걸 모르면 "분명히 껐는데 왜 안 돌아오지" 로 한나절을 씁니다. 그래서 여기 적어둡니다.
② 페이지는 6배가 되는데 광고 자리는 거의 안 늡니다
되돌리면 페이지가 302장에서 5천 장 넘게 늘어납니다. 여섯 배가 넘죠. 여기서 "그럼 광고 자리도 여섯 배가 되나?" 싶은데, 아닙니다.
돌아온 페이지 대부분이 얇은 장이라 표시가 달리고, 표시가 달린 장은 광고에서 빠지거든요. 심사 모드에 들어가기 직전 배포 기록을 보면 이렇습니다.
[thin] /switch 931장 내림
[thin] /housing 310장 내림
[thin] /bible 91장 내림
[thin] /market 5장 내림
[thin] /leave 4장 내림
[thin] 1500자 미만 1341장 noindex · 사이트맵에 남긴 2222장
1,341장이 표시를 받았고, 그 장들은 광고를 안 답니다. 그러니까 페이지 수가 늘어난다고 수입이 따라 늘지 않아요. 이걸 미리 알고 있어야 승인 후에 "페이지는 5천 장인데 왜 이래" 하지 않습니다.

카드 도구를 예로 들면, 카드 1,180장이 저마다 자기 주소를 갖고 돌아옵니다. 그런데 그 낱개 장들은 대부분 같은 틀에 값만 바뀐 페이지라 광고가 붙을 자리가 아니에요. 광고가 붙는 건 지금 보이는 이 첫 화면 쪽입니다.
③ 감시를 끈다
심사가 도는 동안 매일 아침 점검이 돌고 있습니다. 라이브가 아직 심사 모드인지, 낱개 주소가 정말 닫혀 있는지, 도구 화면에 읽을 게 있는지를 봐요. 어긋나면 그때만 메일이 옵니다.
결과가 나오면 이 감시는 필요 없어집니다. 표시 파일 하나 만들면 조용히 멈추게 해뒀어요.
# - 결과가 나오면 `.adsense-verdict` 를 만들어 감시를 끈다.
쓸모가 끝난 자동화를 안 끄면 며칠 뒤부터 그 메일을 안 읽게 되고, 안 읽는 메일이 하나 생기면 옆에 있는 진짜 경고도 같이 안 읽게 됩니다. 끄는 것까지가 한 세트예요.
④ ads.txt가 살아 있는지 확인한다
승인 뒤에는 광고 계정이 이 파일을 읽으러 옵니다. 그때 없으면 경고가 뜨고 값이 깎여요. 확인은 주소창에 치면 끝입니다.
victor-house.com/ads.txt
한 줄이 보이면 됩니다. 안 보이면 배포가 어디서 어긋난 거고요. 그리고 이 확인은 한 번 하고 끝이 아닙니다. 왜 그런지가 이제부터 나옵니다.
그래서 8장은 왜 비어 있었나
맨 앞으로 돌아갑니다. 배포 기록은 290장에 넣었다고 했는데 지금 살아 있는 건 287장이었고, 설명이 안 되는 8장이 있었죠.
범인은 다른 배포 스크립트였습니다.
제 사이트에는 시장 지표 화면이 있어요. 코스피·코스닥·환율 같은 값이라 하루 한 번 올려서는 의미가 없습니다. 아침 9시 값이 하루 종일 그대로 서 있으면 그건 틀린 값을 자신 있게 보여주는 거니까요. 그래서 30분마다 시장 부분만 다시 올리는 스크립트를 따로 뒀습니다.

문제는 이 스크립트가 하는 일입니다. 시장 화면을 새로 만들어 덮어쓰고, 쿠팡 배너를 다시 붙이고, 신고 버튼을 다시 붙이고, 도구 설명을 다시 붙입니다. 그리고 광고 코드는 다시 안 붙입니다.
python3 "$ROOT/inject-ads.py" "$OUT/market/index.html"
python3 "$ROOT/inject-report.py" "$OUT/market/index.html" "시장 지표"
python3 "$ROOT/inject-home.py" "$OUT/market/index.html"
python3 "$ROOT/inject-intro.py" "$OUT" "$ROOT/intro" 2>/dev/null | grep market || true
네 줄 중에 광고 코드를 넣는 줄이 없죠. 전체 배포에는 있는데 여기엔 없습니다.
그래서 이렇게 됩니다. 아침 9시 전체 배포가 302장 전부에 광고 코드를 넣습니다. 9시 30분에 시장 스크립트가 돌면서 시장 관련 여섯 장을 새로 만들어 덮어씁니다. 덮어쓴 장에는 광고 코드가 없습니다. 그리고 그 상태가 다음날 아침 9시까지 갑니다.
여섯 장은 이렇습니다. 시장 지표 첫 화면 하나, 그리고 지표별 상세 화면 다섯 장이에요.

나머지 두 장은 더 얄궂습니다. 마지막 줄에 있는 도구 설명을 다시 붙이는 명령이 시장 폴더만이 아니라 사이트 전체에 대고 돕니다. 화면에 찍히는 글자만 시장 것으로 걸러낼 뿐이에요.
지분 도구와 기술사 도구는 화면을 꽉 쓰는 물건이라 설명을 화면 안에 못 붙였습니다. 그래서 설명을 자기 장으로 뺐어요. /equity/about/ 과 /study/about/ 입니다.

그런데 그 설명 장은 돌 때마다 틀에서 새로 찍어냅니다. 아침에 넣어둔 광고 코드가 있든 없든 신경 쓰지 않고 새 파일로 갈아엎어요. 그러니까 30분 뒤면 없어지는 겁니다.
여섯 장 더하기 두 장. 8장. 숫자가 정확히 맞았습니다.
그리고 덤이 하나 더 있었어요. 시장 상세 다섯 장은 원래 얇은 장으로 분류돼서 검색엔진에 안 내밀도록 표시가 달려 있었습니다. 그 표시도 같이 날아갔어요. 심사 중인데 얇은 장 다섯 개가 표시 없이 열려 있었던 겁니다. 다행히 주소 목록에는 안 들어가 있었지만요.

주소 목록을 보면 /equity/about/ 은 멀쩡히 들어 있습니다. 검색엔진에는 내밀고 있는데 광고 코드는 없는 장인 거죠.
제일 씁쓸한 건 이겁니다. 그 시장 스크립트에는 이런 주석이 붙어 있었어요.
# publish-all.sh 의 8-1 과 같은 차례. 두 곳이 어긋나면 사이트가 다른 그림을
# 그리는 날이 오므로, 고칠 때는 양쪽을 같이 고칠 것.
어긋날 걸 알고 적어놨는데 어긋났습니다. 주석은 경고를 할 뿐이고, 경고는 그 파일을 여는 사람만 읽으니까요. 광고 코드를 넣는 줄을 전체 배포 쪽에 추가할 때 이 파일은 안 열었던 거예요.
고칠 자리는 명확합니다. 시장 스크립트 끝에 얇은 장 표시와 광고 코드 넣는 단계를 두 줄 더하면 됩니다. 다만 그게 30분마다 도는 자동 배포라, 손대기 전에 하루 정도 돌려보고 넣으려고 합니다.
사람이 붙잡은 자리
이 편에서 사람이 한 일은 딱 하나였어요. 화면을 열어본 것.
배포 기록은 성공이라고 했습니다. 290개 페이지 · ads.txt 생성. 실패한 데가 하나도 없고, 숫자도 안 맞는 데가 없었어요. 저 줄만 보면 아무 문제가 없습니다.
그런데 저 줄은 9시 배포가 끝난 그 순간의 이야기입니다. 그 뒤에 다른 스크립트가 30분마다 와서 여덟 장을 덮어쓴 건 저 줄에 안 적혀요. 적힐 수가 없죠. 그 스크립트는 자기 몫만 알거든요.
그래서 이렇게 정리했습니다.
배포 기록과 지금 살아 있는 사이트는 다른 것이다. 기록은 그때 무슨 일이 있었는지를 말하고, 사이트는 마지막에 덮어쓴 쪽을 보여줍니다. 자동으로 도는 게 하나뿐이면 둘이 같지만, 둘 이상이 되는 순간 갈라져요. 그리고 갈라진 걸 알려주는 장치는 어디에도 없습니다.
이 연재에서 계속 나오는 얘기랑 같습니다. 성공했다는 말은 증거가 아니에요. 증거는 지금 그 주소를 열었을 때 화면에 있는 것입니다.

그리고 이번 건은 우연히 걸렸다는 것도 적어둬야 공평합니다. 이 글에 넣을 사진을 찍느라 화면을 하나씩 열어보지 않았으면 못 봤을 거예요. 승인이 나고 몇 달 뒤에 "왜 이 화면만 수입이 없지"로 알았겠죠.

우연에 기대는 건 방법이 아니니까, 다음에는 배포가 끝난 뒤에 라이브 주소를 몇 개 열어서 광고 코드가 있는지 세어보는 걸 붙이려고 합니다. 세는 일은 사람보다 스크립트가 잘하고, 지금은 그걸 사람이 눈으로 하고 있었어요.

정리
첫째, ads.txt는 한 줄인데 값을 가릅니다. 없으면 "승인되지 않은 판매자" 경고가 뜨고 같은 광고를 싸게 팝니다. 만드는 데 3초 걸리는 파일이에요.
둘째, 뿌리에만 둡니다. 도구 폴더 안에 넣으면 파일은 있는데 아무 일도 안 일어납니다.
셋째, 손으로 만들지 말고 코드가 만들게 합니다. 배포 폴더를 매번 지우고 다시 짓는 구조라면, 손으로 둔 파일은 다음 배포에 조용히 사라집니다.
넷째, 번호는 한 곳에만 적습니다. 머리 스크립트에는 ca-pub-, ads.txt에는 pub- 이라 두 번 적으면 언젠가 갈라져요.
다섯째, 동의 메시지는 코드가 아니라 계정 화면입니다. 코드로 할 일과 화면에서 할 일을 갈라 적어두지 않으면 엉뚱한 데서 며칠을 씁니다.
여섯째, 확인 못 한 건 확인했다고 쓰지 않습니다. 동의 창은 한국에서 안 뜨니까 저는 못 봤어요. 그래서 이 글에 봤다고 안 적었습니다.
일곱째, 배포 기록은 지금 사이트가 아닙니다. 자동으로 도는 게 둘 이상이면 나중에 도는 쪽이 이깁니다. 기록에는 그게 안 남고요.
승인이 났는지는 여전히 못 씁니다. 다만 이번에 알게 된 건, 승인이 나도 그날 할 일이 네 가지쯤 남아 있고 그중 하나는 밖에서는 안 꺼지는 스위치라는 겁니다. 승인은 끝이 아니라 설정의 시작이더라고요.
다음 편은 반대쪽 얘기입니다. 광고로 붙여보려다 안 된 것들, 그리고 할 수 있었는데 안 하기로 정한 것들이요.
#ads.txt #애드센스 #구글애드센스 #애드센스승인 #애드센스ads.txt #승인되지않은판매자 #퍼블리셔ID #동의메시지 #GDPR #EEA #개인정보처리방침 #광고쿠키 #쿠키동의 #자동광고 #쿠팡파트너스 #블로그수익화 #광고수익 #배포자동화 #크론 #셸스크립트 #정적사이트 #CloudflarePages #개인홈페이지 #웹사이트만들기 #noindex #사이트맵 #SEO #AI코딩 #클로드 #빅터하우스