devlog.md

[블로그, 인스타 업로드_자동화] 블로그 자동화 완결편: TCC 샌드박스가 진범이었다_08

[이전 글: 블로그 자동화 삽질기: launchd 오류부터 SEO까지]에서 원인을 못 찾고 보류했던 launchd 오류를 오늘 드디어 끝까지 추적했다. 그 김에 인스타 계정 잠금과 애드센스 준비까지 같이 정리했다.

HANDOFF부터 확인: 어제도 실패했던 자동 게시

세션을 이어받으며 HANDOFF.md를 먼저 읽었다. 직전 세션이 "BTM(Background Task Management) 승인 지연 레이스 컨디션" 때문이라고 잠정 결론 내려둔 상태였다. 새 Label로 등록한 지 몇 시간 안 지나서 kickstart하면 실패하고, 시간이 지나면 성공한다는 관찰에서 나온 가설이었다.

밀린 작업부터: 코스피 활성화, 게시글 정리

launchd 문제와 별개로 밀린 작업부터 처리했다. 공공데이터포털 코스피 API 키가 활성화된 걸 확인했고, AI 리서치 도구를 그대로 복붙해서 생긴 인라인 스타일 폭탄 게시글 11건을 정리 도구로 청소했다. 하나는 781KB에서 32KB까지 줄었다. 이쪽은 순조로웠다.

다음 세션: BTM 가설이 틀렸다

다음 날 "07:00 실행 결과 확인해줘"라는 요청에 launchd 상태를 봤더니 또 실패였다. exit code 78. BTM이 완전히 정착된 지 20시간이 지난 뒤였는데도 실패한다는 건, 어제 세운 가설 자체가 틀렸다는 뜻이었다.

진짜 범인: TCC가 Desktop 폴더를 막고 있었다

통합 로그에서 "Sandbox" 키워드로 검색하니 커널 로그에 이런 줄이 있었다. kernel: (Sandbox) System Policy: xpcproxy(pid) deny(1) file-read-data /Users/.../Desktop/blogger-automation/logs/pipeline.out.log. macOS TCC가 Desktop 폴더를 특별 보호하는데, GUI 승인 팝업을 띄울 수 없는 LaunchAgent가 그 하위 로그 파일을 열려다 영구 거부당하고 있었다. 실패한 4번의 사례(자연 실행 2번, 수동 실행 2번)가 전부 이 한 줄로 설명됐다. Label 이름도, 코드서명도, 절전/기상도 전부 무관했다.

프로젝트를 Desktop 밖으로 옮기다

가장 확실한 해결책은 프로젝트를 통째로 옮기는 것이었다. Desktop 하위 경로를 홈 폴더 바로 아래로 이동하고, 파이썬 가상환경은 절대경로가 실행 파일에 박혀 있어서 새로 만들었다. launchd 설정 파일 2개와 코드 안의 경로 참조를 전부 갱신하고 재등록했다. 실제 게시 없이 검증하려고 echo만 실행하는 임시 테스트 작업을 만들어 돌렸더니 정상 종료됐다.

다음날 아침, 드디어 성공

진짜 검증은 다음날 아침이었다. 자연 실행 결과 exit code 0, 블로그 4건이 전부 실제로 게시됐다. 며칠을 끌던 문제가 끝났다.

인스타그램도 막혀 있었다

그런데 같은 실행에서 인스타그램 카드뉴스 게시가 한/영 둘 다 "API access blocked"로 실패했다. API를 직접 호출해서 재현해보니 코드나 토큰 문제가 아니었다. 개발자 콘솔에 로그인하자 이상 활동 경고가 떴다. 매일 같은 시간에 같은 패턴으로 API를 호출하는 자동화가 보안 시스템 눈에는 봇처럼 보였던 것 같다. 본인 인증으로 계정을 복구한 뒤 다시 호출해보니 정상 응답이 돌아왔다.

애드센스 준비: 없던 개인정보처리방침 만들기

애드센스 심사 방법을 정리하다가 영문 블로그에 정적 페이지가 0건이라는 걸 발견했다. 개인정보처리방침이 없으면 심사가 사실상 자동 거부된다. 한/영 두 버전을 초안으로 써서 게시하고, 테마 하단 링크도 추가했다. 다만 실제 신청은 게시글이 더 쌓일 때까지 보류하기로 했다.

Trouble Shooting

증상원인해결 방법
launchd 07시 실행이 계속 오류로 실패macOS TCC가 Desktop 하위 로그 파일 접근을 영구 거부(LaunchAgent는 승인 팝업을 띄울 수 없음)프로젝트를 Desktop 밖으로 이동, 가상환경 재생성, launchd 설정 재등록
가상환경 이동 후 실행 오류 가능성실행 파일 내부에 이전 절대경로가 박혀 있음이동 후 가상환경을 삭제하고 새로 생성
인스타그램 API가 접근 차단 반환보안 시스템이 매일 반복되는 자동화 호출 패턴을 의심 활동으로 판단해 계정 잠금본인 인증으로 계정 복구 후 API 재확인으로 정상화 확인
애드센스 심사 준비 중 정적 페이지 0건 발견블로그 개설 이후 개인정보처리방침 페이지를 만든 적 없음한/영 초안 작성 후 게시, 테마 하단에 링크 추가

느낀 점 / 다음에 할 일

같은 오류라도 재현 조건이 조금만 달라져도 완전히 다른 원인일 수 있다는 걸 다시 배웠다. 어제 세운 가설은 그럴듯했지만 다음날 자연 실행이 다시 실패하지 않았다면 계속 틀린 결론으로 남았을 거다. 커널 로그까지 내려가서 확인한 게 결정적이었다. 다음에는 하루 3회 발행 스케줄 확장을 설계하고, 게시글이 목표치까지 쌓이면 애드센스 신청을 진행할 예정이다.

댓글