Claude + WordPress REST API로 RSS 수집 → 본문 생성 → 예약 발행까지 완전 자동화 가능합니다.
핵심 흐름은 세 단계: RSS 수집·Notion 적재 → Claude 드래프트 생성 → WP 예약 발행.
Haiku tool_use 스키마 고정, LiteSpeed WebP 변환, timeout 분리가 실제 안정화 포인트였습니다.
처음엔 LinkedIn RSS 자동 포스트로 시작했습니다. 그런데 직접 경험이 빠진 콘텐츠는 타임라인에 이미 넘쳐납니다. yjflow.com 블로그로 피봇하고, 9주에 걸쳐 수집-생성-발행 파이프라인을 직접 셋업했습니다. “한 번도 안 해본 인프라를 며칠짜리 시도 비용으로 끝낼 수 있다”는 감각이, 이 글을 쓰는 이유입니다.
왜 만들었나 — RSS 포스트의 한계와 피봇
LinkedIn에 RSS를 자동으로 붙이는 파이프라인은 만들기 쉽습니다. 그런데 그 결과물을 실제로 보면, 타임라인에 비슷한 포맷이 이미 가득합니다. 본인 브랜딩에 남는 것도 없고, 검색 유입도 기대하기 어렵습니다.
자체 경험과 실무 프레임을 녹이면 달라집니다. 다만 그렇게 가면 NDA 마스킹이 따라옵니다. 그래서 첫 글을 쓰기 전에 마스킹 룰북부터 정립했습니다. 회사명·고객사명·매출 절대값은 지우고, 도구명과 성능 지표는 실명으로 보존하는 방식입니다.
이커머스 SaaS 조직에서 콘텐츠 파이프라인을 운영해본 경험상, 기준 없이 시작한 콘텐츠는 3~4편 이후 방향이 흔들립니다. 룰북 선정립이 퀄리티 일관성의 기반이 되었습니다.
준비물
- WordPress 사이트 (Application Password 발급 가능한 관리자 권한)
- Rank Math SEO + WPCode + LiteSpeed Cache 플러그인 설치 완료
- Anthropic API 키 (Haiku, Sonnet 모델 접근 권한)
- OpenAI API 키 (GPT-Image-1 이미지 생성용)
- Notion API 토큰 + 뉴스 DB, Blog Drafts DB 두 개
- Railway 계정 (cron 스케줄러 + 컨테이너 배포용)
- Pexels API 키 (본문 스톡 이미지 삽입용)

1. RSS 수집 후 Notion 뉴스 DB에 적재하기
파이프라인의 시작점입니다. 20개 RSS 피드를 수집해 ContentAnalyzer가 이모지 카테고리 레이블을 붙이고, NotionArchiver가 Notion 뉴스 DB에 적재합니다.
Notion 페이지 생성 시 아래 구조로 properties를 구성합니다.
# Notion 뉴스 DB row 생성 예시
properties = {
"Title": {"title": [{"text": {"content": item["title"]}}]},
"URL": {"url": item["url"]},
"Source": {"select": {"name": item["source"]}},
"Label": {"select": {"name": item["label"]}}, # ContentAnalyzer 이모지 레이블
"Published": {"date": {"start": item["pub_date"]}},
"Status": {"select": {"name": "수집완료"}},
}Railway cron을 KST 06:00 기준으로 설정하면, 매일 아침 전날 뉴스가 DB에 쌓입니다. 중복 방지는 URL을 기준으로 Notion filter 쿼리로 처리하는 것이 가장 단순합니다.
2. Claude로 드래프트 생성 후 Notion 검수 큐에 올리기
BlogFilter가 dedup → 중요도 → Haiku tool_use 적합성 → 7:2:1 비율 선별 순서로 기사를 추립니다. Haiku의 tool_use는 반드시 `input_schema`로 고정해야 합니다. 스키마 외 임의 필드가 추가되면 max_tokens 한도에서 JSONDecodeError가 발생합니다.
# Haiku tool_use 스키마 고정 예시
tools = [{
"name": "submit_evaluation",
"description": "뉴스 적합성 평가 결과 제출",
"input_schema": {
"type": "object",
"properties": {
"suitable": {"type": "boolean"},
"category": {"type": "string", "enum": ["guide", "trend", "tool"]},
"score": {"type": "integer", "minimum": 1, "maximum": 5},
},
"required": ["suitable", "category", "score"],
"additionalProperties": False, # 임의 필드 차단 핵심
},
}]
response = client.messages.create(
model="claude-haiku-4-5",
tools=tools,
tool_choice={"type": "tool", "name": "submit_evaluation"},
# ...
)본문 생성은 Sonnet 모델로 분리하고, 가이드 모드 기사는 timeout을 120s로 별도 설정합니다. 필터용 Haiku는 60s 유지입니다.
3. WordPress REST API로 예약 발행 연동하기
Notion 검수 큐에서 `검수완료` 상태 row를 DraftArchiver가 조회하고, WordPressPublisher가 `status=future` + 현재 시각 기준 최신 예약일 +1d로 스케줄링합니다.
# WordPress 예약 발행 + slug 직접 조립
import requests
from datetime import datetime, timedelta
def publish_scheduled(post_data: dict, wp_url: str, auth: tuple):
schedule_dt = (datetime.utcnow() + timedelta(days=1)).strftime("%Y-%m-%dT%H:%M:%S")
payload = {
"title": post_data["title"],
"content": post_data["content"],
"status": "future",
"date": schedule_dt,
"slug": post_data["slug"],
"meta": {
"rank_math_focus_keyword": post_data["focus_keyword"],
"rank_math_description": post_data["meta_description"],
},
}
res = requests.post(f"{wp_url}/wp-json/wp/v2/posts", json=payload, auth=auth)
data = res.json()
# WP REST는 future 상태에서 link를 ?p=<id>로 반환 → slug로 직접 조립
permalink = f"{wp_url}/{data['slug']}/"
return permalinkRank Math meta를 REST로 쓰려면 `register-rank-math-rest.php` MU-plugin이 필요합니다. 이 설정 없이는 focus_keyword와 meta_description이 저장되지 않습니다.
마무리
목표: Claude + WordPress REST API 기반 AI 뉴스 자동 발행 파이프라인을 처음부터 재현한다.
기술 스택: Python 3.11, Anthropic SDK (claude-haiku-4-5 필터 / claude-sonnet-4-6 본문), OpenAI SDK (gpt-image-1), Notion API, WordPress REST API + Application Password, Railway cron, Pillow (PNG to WebP), Pexels API, Rank Math SEO MU-plugin (register-rank-math-rest.php), LiteSpeed Cache + Disable Emojis plugin.
단계 순서:
1. RSS 20개 피드 수집 → ContentAnalyzer 레이블 부여 → Notion 뉴스 DB 적재 (URL 중복 필터 포함)
2. BlogFilter: Haiku tool_use + input_schema additionalProperties:false 로 적합성 평가 → 7:2:1 비율 선별
3. BlogPostGenerator: Sonnet 본문 생성 (가이드 모드 분기, timeout=120s) → GPT-Image-1 히어로 + Pillow WebP 변환 → Pexels 본문 스톡 → Notion Blog Drafts DB 적재
4. DraftArchiver: 검수완료 row 조회 → WordPressPublisher status=future + latest+1d 스케줄 → slug 직접 조립 → permalink 반환
5. 검증: Railway cron KST 06:00 실행 → Notion 검수 큐 → WP 예약 발행 end-to-end 확인따라하기 시작점으로 Step 2의 Haiku tool_use 스키마 고정 코드를 먼저 복사해서 필터 단계만 로컬에서 돌려보는 것을 권합니다. 필터가 안정적으로 돌아가면 나머지 단계는 붙이기가 훨씬 수월합니다.
엄두가 안 났던 인프라 셋업이 9주짜리 사이드 프로젝트가 될 수 있습니다. 시작 비용이 그만큼 줄었습니다. 🙂
