WordPress REST API로 글 자동 발행하는 파이썬 스크립트 만들기

매일 밤 1시간씩 이어지던 ‘복붙 지옥’에서 탈출하기 위해

퇴근 후 3개의 수익형 워드프레스 블로그를 운영하다 보니, 글을 기획하고 쓰는 시간보다 마크다운(Markdown)으로 작성한 원고를 블로그에 복사해 붙여넣고 카테고리를 맞추는 단순 노동에 매일 1시간 이상을 허비하고 있었습니다. 한두 개면 참겠는데, 여러 사이트를 돌아다니며 로그인하고 에디터를 켜는 과정이 너무 고통스러웠습니다. ‘이럴 거면 파이썬으로 클릭 한 번에 3개 블로그에 예약 발행을 때려버리면 어떨까?’ 하는 오기가 생겼습니다. 무거운 플러그인을 덕지덕지 설치하는 대신, 워드프레스 코어에 기본적으로 내장된 REST API를 활용하면 백엔드 딴에서 깔끔하게 원격 발행이 가능하다는 사실을 알게 되었고, 며칠 밤을 새워가며 파이썬 자동 발행 스크립트를 완성했습니다. 저처럼 반복되는 업로드 노동에 지친 블로거분들을 위해, 제가 현재 실무에서 매일 돌리고 있는 자동화 코드를 100% 공개합니다.


목차


1. 워드프레스 원격 제어를 위한 개발 및 통신 환경 세팅

워드프레스의 코어 파일(PHP)이나 복잡한 서버 FTP 설정을 건드릴 필요는 전혀 없습니다. 오직 통신을 위한 기본적인 파이썬 환경과, 외부 스크립트가 내 워드프레스에 안전하게 접속할 수 있도록 허가해 주는 ‘애플리케이션 비밀번호’만 발급받으면 됩니다. 제 개발 환경은 다음과 같습니다.

  • 운영체제 및 기기: Windows 11 Pro / macOS Sonoma (파이썬 코드라 100% 동일하게 호환됩니다)
  • 사용 언어: Python 3.12.2
  • 필수 라이브러리: requests (REST API 통신용), python-dotenv (내 서버 비밀번호를 숨기기 위함)
  • 타겟 사이트: WordPress 6.0 이상 (REST API가 기본적으로 활성화되어 있는 버전)

2. 실전 가이드: 파이썬으로 자동 발행 스크립트 구축하기 (전체 코드)

파이썬이 워드프레스 에디터를 대신해 글을 써주게 만들려면, 정확한 양식의 데이터(JSON)를 포장해서 내 웹사이트 주소로 택배(POST 요청)를 보내야 합니다. 이 과정은 딱 3단계로 끝납니다.

1단계: 워드프레스 애플리케이션 비밀번호 발급받기

가장 먼저 파이썬이 내 워드프레스 관리자 권한을 가질 수 있도록 전용 비밀번호를 만들어야 합니다. 내 워드프레스 관리자 페이지(wp-admin)에 접속한 뒤, 좌측 메뉴에서 [사용자] – [프로필]로 들어갑니다. 화면을 맨 아래로 주욱 내리면 ‘애플리케이션 비밀번호(Application Passwords)’라는 섹션이 있습니다. 새 비밀번호 이름에 ‘Python_Bot’이라고 적고 추가 버튼을 누릅니다. 화면에 xxxx xxxx xxxx xxxx xxxx xxxx 형태의 24자리 비밀번호가 나타나는데, 이 창을 닫으면 다시는 볼 수 없으므로 반드시 복사해 둡니다. (이 비밀번호는 언제든 폐기할 수 있어 안전합니다.)

2단계: 파이썬 라이브러리 설치 및 보안 설정

VS Code의 터미널을 열고 통신에 필요한 패키지를 설치합니다.

pip install requests python-dotenv

코드가 있는 폴더에 .env 파일을 생성하고, 내 사이트 정보와 방금 발급받은 비밀번호를 안전하게 저장합니다.

WP_URL=https://내사이트주소.com/wp-json/wp/v2/posts
WP_USER=워드프레스_로그인_아이디
WP_APP_PASSWORD=방금_발급받은_24자리_비밀번호_공백포함_그대로_입력

3단계: 자동 발행 전체 파이썬 코드 작성

이제 auto_post.py 파일을 만들고 아래 코드를 작성합니다. 저는 단순히 텍스트만 올리는 것을 넘어, 구텐베르크(블록 에디터) 형식에 완벽하게 호환되도록 HTML을 구성하는 노하우를 코드에 담았습니다.

import os
import requests
import base64
import json
from dotenv import load_dotenv

1. 환경 변수 로드
load_dotenv()
WP_URL = os.getenv("WP_URL")
WP_USER = os.getenv("WP_USER")
WP_APP_PASSWORD = os.getenv("WP_APP_PASSWORD")

def post_to_wordpress(title, content, category_ids, tag_ids):
# 2. 인증 정보(Basic Auth) 인코딩 생성
credentials = f"{WP_USER}:{WP_APP_PASSWORD}"
token = base64.b64encode(credentials.encode())

headers = {
    "Authorization": f"Basic {token.decode('utf-8')}",
    "Content-Type": "application/json"
}

# 3. 💡 여기서 주의할 점: 구텐베르크 블록 주석()을 포함해야 에디터에서 안 깨집니다.
formatted_content = f"<p>{content}</p>"

# 4. 발행할 데이터(Payload) 구성
post_data = {
    "title": title,
    "content": formatted_content,
    "status": "publish", # 임시저장을 원하면 'draft'로 변경
    "categories": category_ids, # 배열 형태 (예: [2, 5])
    "tags": tag_ids # 배열 형태 (예: [12])
}

print("워드프레스로 데이터를 전송합니다...")

# 5. POST 요청 보내기
response = requests.post(WP_URL, headers=headers, json=post_data)

if response.status_code == 201:
    print(f"✅ 성공적으로 발행되었습니다! 글 ID: {response.json()['id']}")
    print(f"확인 링크: {response.json()['link']}")
else:
    print(f"❌ 발행 실패 (HTTP {response.status_code})")
    print(response.text)
스크립트 실행
if name == "main":
my_title = "파이썬 REST API로 자동 발행한 테스트 글입니다"
my_content = "안녕하세요, 파이썬 스크립트가 워드프레스 백엔드에 직접 꽂아넣은 본문 텍스트입니다. 정말 빠르네요!"

# 내 워드프레스의 카테고리 ID 번호를 알아내어 입력해야 합니다. (기본 미분류는 보통 1)
post_to_wordpress(my_title, my_content, category_ids=[1], tag_ids=[])

3. 내가 직접 맞은 치명적인 서버 에러 2가지와 완벽 해결법

튜토리얼 영상들에서는 코드를 실행하면 마법처럼 글이 올라가지만, 현실의 서버 환경은 그렇게 호락호락하지 않았습니다. 제가 며칠 동안 구글링하며 해결해야 했던 뼈아픈 에러 두 가지를 공유합니다.

첫 번째 절망: HTTP 401 Unauthorized (클라우드웨이즈/카페24 방화벽)

아이디와 애플리케이션 비밀번호를 토씨 하나 안 틀리고 입력했는데 계속 401 인증 실패 에러가 떴습니다. 10번을 넘게 비밀번호를 재발급받다 깨달은 원인은 ‘웹 호스팅 서버의 자체 방화벽’이었습니다. 제가 사용하는 웹 호스팅사(특정 국내 업체 및 클라우드웨이즈 일부 세팅)는 봇(Bot)의 공격을 막기 위해 /wp-json/ 으로 들어오는 외부 국가 IP나 비정상적인 REST API 요청을 기본적으로 차단하고 있었습니다. 호스팅 제어판(Cpanel)에 들어가서 ‘REST API 접근 허용’ 또는 ‘해외 IP 차단 임시 해제’를 세팅하고 나서야 통신이 뚫렸습니다. 만약 비밀번호가 확실한데 401이 뜬다면 무조건 서버 방화벽부터 의심하셔야 합니다.

두 번째 위기: HTTP 403 Forbidden (ModSecurity의 XSS 오인)

자동 발행 스크립트에 구글 애드센스 광고 코드를 포함한 <script> 태그를 본문에 넣어 쏘아 보냈더니 403 에러가 반환되었습니다. 이번엔 웹 방화벽(WAF)인 ModSecurity가 파이썬이 보내는 JSON 페이로드를 악의적인 크로스 사이트 스크립팅(XSS) 해킹 공격으로 간주해 패킷을 드랍시켜버린 것입니다. 이 문제를 피하기 위해, 코드 단에서 악성 태그로 오인받을 수 있는 날것의 자바스크립트는 제외하고 순수 HTML 위주로 전송한 뒤, 광고는 워드프레스 내부의 ‘Ad Inserter’ 같은 플러그인을 통해 자동으로 본문에 삽입되도록 역할을 분리하여 문제를 완벽히 해결했습니다.

4. 파이썬 원격 발행 도입 후의 압도적인 업무 시간 변화

이 파이썬 자동 발행 시스템을 구축하고 약 두 달간 운영해 본 결과, 제 블로그 운영 루틴은 완전히 혁신되었습니다.

  • 소요 시간의 증발: 마크다운 에디터(Typora)로 글 5개를 써둔 뒤, 워드프레스 관리자 페이지에 일일이 로그인해서 이미지를 넣고 태그를 달고 발행 버튼을 누르기까지 수동으로 약 50분이 걸렸습니다. 지금은 파이썬 스크립트 실행 버튼 하나 누르면 폴더 안의 텍스트 파일 5개를 순식간에 읽어들여 단 4.5초 만에 예약 발행 상태로 서버에 꽂아버립니다.
  • 심리적 피로감 제로: 블로그가 3개다 보니 탭을 이리저리 옮겨 다니며 카테고리를 헷갈려 오타를 내는 일이 잦았는데, 코드 단에서 WP_URL만 바꿔주면 정확한 타겟에 에러 없이 꽂히기 때문에 포스팅 행위 자체에 대한 스트레스가 완전히 사라졌습니다.

5. 핵심 3줄 요약 및 이런 분들께 강력 추천합니다

오늘 구축한 워드프레스 자동 발행 워크플로우를 요약합니다.

  1. 워드프레스 관리자 프로필에서 REST API 통신 전용 ‘애플리케이션 비밀번호’를 발급받습니다.
  2. 파이썬 requests 모듈을 활용해 Basic Auth 방식으로 인증하고 JSON 형태의 글 데이터를 POST 방식으로 전송합니다.
  3. 401이나 403 에러가 발생한다면 파이썬 코드 오류가 아니라 웹 호스팅 서버의 방화벽(WAF) 차단 여부를 점검해야 합니다.

이 시스템은 여러 개의 워드프레스를 동시에 운영하는 수익형 블로거, 대량의 뉴스 기사나 주식 데이터를 자동으로 포스팅해야 하는 (Programmatic SEO) 개발자분들께 제 경험을 걸고 강력하게 추천합니다. 단순 노동을 코드로 대체하면 글의 퀄리티를 높일 절대적인 시간을 확보할 수 있습니다. 반면, 엘리멘터(Elementor) 같은 무거운 페이지 빌더를 사용하여 매 글마다 시각적 레이아웃을 화려하게 꾸미는 디자이너나 포트폴리오 사이트 운영자분들에게는 API 텍스트 삽입 방식이 맞지 않으니 기존의 수동 발행을 유지하시는 것이 훨씬 좋습니다.