중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날
"매일 수집한 환율·날씨 데이터를 자동으로 블로그에 발행하고 싶다", "엑셀에 정리된 상품 정보를 쇼핑몰 블로그에 자동으로 올리고 싶다", "예약 발행 글을 코드로 일괄 등록하고 싶다"…
워드프레스는 REST API를 기본으로 지원합니다. 파이썬으로 이 API를 호출하면 글 작성, 카테고리·태그 설정, 이미지 업로드, 예약 발행까지 모두 자동화할 수 있습니다. 별도 플러그인 없이 워드프레스 기본 기능만으로 구현됩니다.
파이썬에서 워드프레스 API를 사용하려면 일반 로그인 비밀번호가 아닌 앱 비밀번호를 발급받아야 합니다.
내사이트.com/wp-admin)에 로그인합니다.⚠️ 주의: 앱 비밀번호 기능은 워드프레스 5.6 이상에서 기본 지원됩니다. "애플리케이션 비밀번호" 섹션이 보이지 않는다면 사이트가 HTTPS를 사용하는지 확인하세요. HTTP 사이트에서는 보안상 이유로 비활성화됩니다.
터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install requests
워드프레스 REST API는 HTTP 요청 방식으로 동작하기 때문에 requests 라이브러리만 있으면 됩니다. 이미 설치되어 있다면 넘어가도 됩니다.
아래 코드를 그대로 복사해서 메모장에 붙여넣고, wp_post.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
import requests
from requests.auth import HTTPBasicAuth
from datetime import datetime, timedelta
import json
# ① 설정
WP_URL = "https://내사이트.com" # ← 워드프레스 사이트 주소
WP_USER = "관리자아이디" # ← 워드프레스 로그인 아이디
WP_PASS = "xxxx xxxx xxxx xxxx xxxx xxxx" # ← 1단계에서 발급받은 앱 비밀번호
AUTH = HTTPBasicAuth(WP_USER, WP_PASS)
API_BASE = f"{WP_URL}/wp-json/wp/v2"
# ② 카테고리 ID 조회 함수
def get_category_id(category_name):
res = requests.get(f"{API_BASE}/categories",
params={"search": category_name}, auth=AUTH)
cats = res.json()
if cats:
return cats[0]["id"]
# 없으면 새로 생성
res = requests.post(f"{API_BASE}/categories",
json={"name": category_name}, auth=AUTH)
return res.json().get("id")
# ③ 태그 ID 조회 함수
def get_tag_ids(tag_names):
tag_ids = []
for tag in tag_names:
res = requests.get(f"{API_BASE}/tags",
params={"search": tag}, auth=AUTH)
tags = res.json()
if tags:
tag_ids.append(tags[0]["id"])
else:
res = requests.post(f"{API_BASE}/tags",
json={"name": tag}, auth=AUTH)
tag_ids.append(res.json().get("id"))
return tag_ids
# ④ 글 발행 함수
def publish_post(title, content, category=None, tags=None,
status="publish", schedule_date=None):
"""
title : 글 제목
content : 글 본문 (HTML 형식 가능)
category : 카테고리 이름 (없으면 기본 카테고리)
tags : 태그 이름 리스트 (예: ["파이썬", "자동화"])
status : "publish"(즉시) / "draft"(임시저장) / "future"(예약)
schedule_date : 예약 발행 시 날짜 (예: "2026-07-01T09:00:00")
"""
post_data = {
"title": title,
"content": content,
"status": status,
}
if category:
cat_id = get_category_id(category)
if cat_id:
post_data["categories"] = [cat_id]
if tags:
tag_ids = get_tag_ids(tags)
post_data["tags"] = tag_ids
if status == "future" and schedule_date:
post_data["date"] = schedule_date
res = requests.post(f"{API_BASE}/posts",
json=post_data, auth=AUTH)
if res.status_code in (200, 201):
post = res.json()
print(f" ✔ 발행 완료: {post['title']['rendered']}")
print(f" ✔ URL: {post['link']}")
return post
else:
print(f" ✘ 발행 실패: {res.status_code} / {res.text[:200]}")
return None
# ⑤ 실행: 글 발행 예시
now = datetime.now().strftime("%Y년 %m월 %d일")
# 즉시 발행
result = publish_post(
title = f"오늘의 업무 자동화 일지 ({now})",
content = """오늘 자동화 완료 목록
파이썬 자동화로 오늘도 업무를 효율적으로 처리했습니다.
""", category = "업무자동화", tags = ["파이썬", "자동화", "IT꿀팁"], status = "publish", ) print(f"\n✅ 완료!")WP_URL에 워드프레스 사이트 주소를, WP_USER에 관리자 아이디를, WP_PASS에 앱 비밀번호를 입력합니다.title, content, category, tags를 원하는 내용으로 수정합니다.python wp_post.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 발행 완료: 오늘의 업무 자동화 일지 (2026년 06월 15일) ✔ URL: https://내사이트.com/오늘의-업무-자동화-일지 ✅ 완료!
오류 1: 401 Unauthorized
앱 비밀번호가 잘못되었거나 REST API가 비활성화된 경우입니다. 앱 비밀번호에 공백이 포함되어 있는지 확인하세요. 워드프레스가 발급하는 앱 비밀번호는 "xxxx xxxx xxxx xxxx xxxx xxxx" 형태로 공백 포함이 정상입니다. 코드에 그대로 입력하면 됩니다.
오류 2: 404 Not Found (REST API 경로 오류)
워드프레스 REST API가 비활성화된 경우입니다. 관리자 페이지 → "설정" → "고유주소"에서 "글 이름"으로 설정하면 REST API가 활성화됩니다. 기본(Plain) 설정에서는 REST API가 작동하지 않습니다.
오류 3: 본문에 HTML이 적용되지 않고 태그가 그대로 출력됨
워드프레스 테마나 플러그인이 HTML을 필터링하는 경우입니다. 관리자 계정으로 발행하면 대부분 HTML이 그대로 적용됩니다. 에디터 설정에서 "비주얼 편집기 비활성화"가 체크되어 있는지도 확인하세요.
코드 ⑤ 실행 부분의 status를 "future"로 바꾸고 schedule_date를 지정하면 예약 발행이 됩니다.
# 내일 오전 9시 예약 발행
tomorrow = (datetime.now() + timedelta(days=1)).strftime("%Y-%m-%dT09:00:00")
publish_post(
title = "내일 발행될 자동화 포스팅",
content = "예약 발행 테스트입니다.
",
category = "업무자동화",
tags = ["파이썬", "자동화"],
status = "future",
schedule_date = tomorrow,
)
💡 이전 게시글과 결합하면: 날씨 데이터 수집 편이나 주식·환율 수집 편으로 데이터를 모은 뒤 이 코드로 블로그에 자동 발행하면, 데이터 수집부터 포스팅까지 완전 무인 자동화가 완성됩니다. 스케줄러 편과 결합하면 매일 정해진 시간에 자동으로 포스팅까지 됩니다.
이 코드를 응용하면 썸네일 이미지를 자동으로 업로드해 대표 이미지로 설정하거나, 엑셀 목록에서 여러 글을 한꺼번에 예약 발행하는 것도 가능합니다.