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

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

요즘은 2잡, 3잡이 유행입니다. 저도 퇴근 후에 3개의 수익형 워드프레스 블로그를 관리했는데요. 글을 기획하거나 실제로 작성하는 시간보다 마크다운으로 작성한 원고를 각 블로그에 복사하고 카테고리를 일일이 맞추는 데 시간을 훨씬 더 많이 뺏겼습니다. 특히 여러 사이트를 일일이 방문해 로그인하고 글쓰기 버튼 누르고 엑셀에서 글 복사하고 다시 붙여넣고 하는 과정은 번거롭고 반복적이어서 꽤 번잡했습니다. 이런 수작업이 한두 번이면 참을 만한데, 매일 반복되다 보니 자연스럽게 자동화 욕구가 커졌죠. 그래서 “파이썬으로 클릭 한번에 세 개 블로그에 예약 발행을 한꺼번에 처리하면 얼마나 편할까” 하는 생각이 들었습니다.

그래서 저는 무겁고 기능이 과도한 플러그인을 설치하는 대신, 워드프레스에 기본적으로 들어있는 REST API라는 기능을 활용하기로 마음먹었습니다. 이 API를 사용하면 백엔드에서 직접 글을 원격으로 발행할 수 있어, 불필요한 무거움 없이 깔끔하게 작업이 가능했습니다. 만약 저처럼 반복적인 업로드 작업에 지친 분들이라면 한번 고려해보세요.

 

wordpress-user-setting

 


목차


1. 워드프레스 연결 준비하기

워드프레스 파일이나 복잡한 서버 FTP 설정을 만질까봐 걱정 할 필요는 전혀 없습니다. 필요한 건 파이썬 환경과, 외부 스크립트가 내 워드프레스에 안전하게 접속할 수 있도록 발급하는 ‘애플리케이션 비밀번호’뿐입니다. 이 간단한 절차 덕분에 서버 설정을 건드리지 않고도 REST API를 사용할 수 있었습니다. 저의 개발 환경은 다음과 같습니다.

  • 운영체제 및 기기: Windows 11 Pro와 macOS Sonoma (파이썬 코드를 그대로 돌릴 수 있어 환경 차이 걱정은 덜었습니다)
  • 사용 언어: Python 3.12.2
  • 필수 라이브러리: requests (REST API 통신용), python-dotenv (비밀번호 노출을 막기 위해 환경변수로 관리)
  • 타겟 사이트: WordPress 6.0 이상 (이 버전부터 REST API가 기본 활성화되어 있습니다)

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

워드프레스 에디터에서 글을 복사하는 대신 파이썬이 글을 작성하게 하려면, 정확한 형식의 JSON 데이터를 포장해서 내 웹사이트 주소로 POST 요청을 보내야 합니다. 주요 절차는 크게 세 단계로 나눌 수 있습니다.

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

워드프레스에 파이썬 스크립트가 글쓰기로 접근하려면 당연히 전용 비밀번호가 꼭 필요합니다.아무나 들어가면 큰일나자나요? 관리자 페이지(wp-admin)에서 좌측 메뉴의 [사용자] – [프로필]로 이동하면, 맨 아래에 ‘애플리케이션 비밀번호(Application Passwords)’라는 항목이 보입니다. 여기에 새 비밀번호 이름으로 ‘Python_Bot’을 입력하고 추가 버튼을 누르면, 24자리의 긴 비밀번호가 xxxx xxxx xxxx xxxx xxxx xxxx 형태로 나타납니다. 이 비밀번호 화면은 한번 닫으면 다시 확인할 수 없으니 나오는 즉시 반드시 복사해둬야 합니다.

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

VS Code에서 터미널을 열어 아래 명령어로 필요한 라이브러리를 설치합니다. requests는 HTTP 요청을, python-dotenv는 환경 변수 관리를 담당합니다. 그런가보다 라고 생각하시면 됩니다.

pip install requests python-dotenv

그다음, 코드가 위치한 폴더에 .env 파일을 만들고, 민감한 정보를 아래처럼 저장합니다. 이 부분에서 실수로 비밀번호를 잘못 입력하거나, URL 끝에 슬래시 유무가 달라서 오류가 나는 경우가 종종 있더군요. 정확히 입력하는 게 중요합니다.

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

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

자 전 단순한 텍스트 발행을 넘어서 구텐베르크 블록 에디터와 충돌 없이 게시글이 제대로 보여지도록 HTML 출력에 신경 썼습니다. 특히, 워드프레스 REST API가 구텐베르크 주석 형식을 제대로 인식하지 못하면 에디터에서 글이 깨지는 일이 빈번합니다. 아래 코드는 그 부분을 반영한 기본 구조입니다.

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=[])

사실 이 코드를 처음 짤 때 인증 헤더에 토큰 생성 부분에서 한참 헤맸습니다. 인코딩 문제로 서버가 401 에러를 뱉었는데, 문자열에 불필요한 공백이 끼어 있었더군요. 그리고 카테고리나 태그 ID 같은 것도 배열로 넘기지 않으면 API가 무시하거나 에러가 발생해요.

3. 치명적인 서버 에러 2가지와 완벽 해결법

튜토리얼 영상이나 블로그 글에서는 코드를 돌리면 순식간에 글이 등록되는 것처럼 보입니다. 하지만 제가 처음 셋팅하고 돌렸을때는 안되더군요

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

정확하게 아이디와 애플리케이션 비밀번호를 철저하게 확인하고 입력했는데도 401 인증 실패가 계속 떴습니다. 비밀번호를 재발급받는 데만 10번 이상 시간을 허비했죠. 결국 원인은 웹 호스팅 서버가 자체적으로 설정한 방화벽이었습니다. 제가 쓰는 호스팅사와 클라우드웨이즈의 특정 세팅은 외부 국가 IP나 비정상 REST API 요청을 /wp-json/ 경로로 막고 있었습니다. 제어판(Cpanel)에서 ‘REST API 접근 허용’ 또는 ‘해외 IP 차단 해제’ 옵션을 켜자 비로소 서버와 통신이 가능해졌습니다. 내가 입력한 비밀번호가 정확하다면 무조건 이 부분부터 의심하고 설정을 점검해야 합니다.

두 번째 문제: HTTP 403 Forbidden (ModSecurity의 XSS 오인)

자동 발행 스크립트에 구글 광고 코드처럼 <script> 태그가 포함된 본문을 보내자 403 에러가 떴습니다. 웹 방화벽인 ModSecurity가 JSON 페이로드를 받아보더니, 이를 악의적인 크로스 사이트 스크립팅(XSS) 시도로 판단해 요청을 차단한 겁니다. 결국 저는 스크립트 태그를 제외하고, HTML 위주의 콘텐츠만 API로 전송하는 쪽으로 방향을 틀었습니다. 광고는 워드프레스의 플러그인에 맡겨 본문에 삽입되도록 바꿨어요.

4. 파이썬 원격 발행 도입 후

파이썬 자동 발행 시스템을 도입하고 약 두 달간 운영한 결과, 제 블로그 관리 방식이 크게 바뀌었습니다.

  • 시간 절약의 정도가 체감 이상: 이전에는 마크다운 에디터로 글 5개를 작성한 뒤, 워드프레스 관리자 페이지에 일일이 로그인해 이미지 넣고 태그 붙이고 게시 버튼 누르기까지 약 50분이 걸렸습니다. 지금은 파이썬 스크립트를 실행하면 폴더 안 텍스트 파일 5개를 순식간에 읽고, 예약 발행 상태로 서버에 등록하는 데 4.5초밖에 안 걸립니다. 이 차이는 정말 상상 이상입니다.
  • 심리적 부담이 눈에 띄게 줄었다: 블로그가 3개여서 탭을 계속 옮기다 보면 카테고리 헷갈리고 오타 내기 일쑤였는데, 스크립트 내 WP_URL만 바꾸면 원하는 블로그에 오류 없이 바로 글을 올릴 수 있어 그 스트레스가 거의 사라졌습니다. 덕분에 포스팅 자체가 훨씬 수월해졌고, 글쓰기에 집중할 수 있는 환경이 만들어졌죠.

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

워드프레스 자동 발행 워크플로우를 간단히 정리하면 다음과 같습니다.

  1. 워드프레스 관리자 계정에서 REST API용으로 ‘애플리케이션 비밀번호’를 발급받아야 합니다.
  2. 파이썬의 requests 모듈로 Basic Auth 인증을 거쳐 JSON 형식의 글 데이터를 POST 방식으로 전송합니다.
  3. 만약 401 또는 403 에러가 뜬다면, 파이썬 코드 문제보다 웹 호스팅 서버 방화벽이 차단하는 것인지 먼저 확인하세요.

이 방법은 여러 워드프레스를 동시에 운영하는 수익형 블로거나, 뉴스 기사와 주식 데이터 같은 대량 콘텐츠를 자동으로 올려야 하는 분이라면 특히 유용합니다. 개인적으로 이런 반복 작업을 코드로 처리하면서 콘텐츠 품질을 높일 시간을 확보한 점이 가장 큰 장점이라고 봅니다.

반대로, 무거운 페이지 빌더로 매 게시글마다 시각적 레이아웃에 신경 쓰는 디자이너나 포트폴리오 사이트 운영자라면 API를 통한 텍스트 삽입 방식은 오히려 불편할 수 있습니다. 저 또한 그런 환경에서는 기존 수동 발행 방식을 유지하는 게 낫다고 생각합니다.