워드프레스 글을 REST API로 자동 발행하기 — 앱 비밀번호부터 실제 코드까지

블로그를 여러 개 굴리다 보면 관리자 화면에 로그인해서 글을 하나하나 붙여넣는 게 병목이 된다. 워드프레스는 이걸 REST API로 자동화할 수 있다. 이 글은 내가 실제로 쓰는 방식 그대로, 로그인 없이 프로그램으로 글을 발행하는 최소 코드를 정리한다.

1. 앱 비밀번호(Application Password) 발급

일반 로그인 비밀번호를 코드에 넣으면 안 된다. 워드프레스 5.6부터 앱 비밀번호가 기본 내장돼 있다. wp-admin → 사용자 → 프로필 → 애플리케이션 비밀번호에서 라벨(예: “automation”)을 적고 발급하면 xxxx xxxx xxxx xxxx xxxx xxxx 형태의 24자리가 나온다. 이 값은 발급 시 한 번만 보여주니 바로 복사해 둔다.

2. 여기서 하루를 날린 함정 — 인증 사용자명

가장 많이 막히는 지점이다. 앱 비밀번호를 만들 때 적은 라벨(“automation”)은 사용자명이 아니다. Basic 인증에 쓰는 사용자명은 실제 로그인 ID다. 나는 이걸 헷갈려서 401만 계속 받았다.

# 틀림 (라벨을 사용자명으로 씀)
curl -u "automation:xxxx xxxx ..." https://yoursite.com/wp-json/wp/v2/users/me
# 맞음 (로그인 ID를 씀)
curl -u "your_login_id:xxxx xxxx ..." https://yoursite.com/wp-json/wp/v2/users/me

/users/me가 200과 함께 내 계정 JSON을 돌려주면 인증이 통과한 것이다.

3. 글을 초안으로 발행하는 최소 코드 (Python)

외부 라이브러리 없이 표준 urllib만으로 된다. statusdraft로 두면 공개되지 않고 초안으로만 들어간다. 바로 공개하려면 publish, 예약은 future + date다.

import json, urllib.request, base64

USER, APPPW = "your_login_id", "xxxx xxxx xxxx xxxx xxxx xxxx"
BASE = "https://yoursite.com/wp-json/wp/v2"

payload = {
    "title": "제목",
    "content": "<p>본문 HTML</p>",
    "status": "draft",       # draft / publish / future
    # "date": "2026-08-01T09:00:00",  # future일 때 예약 시각
    "categories": [12],       # 카테고리 id (선택)
}
data = json.dumps(payload).encode()
req = urllib.request.Request(BASE + "/posts", data=data, method="POST")
tok = base64.b64encode(f"{USER}:{APPPW}".encode()).decode()
req.add_header("Authorization", "Basic " + tok)
req.add_header("Content-Type", "application/json")
res = json.load(urllib.request.urlopen(req))
print(res["id"], res["status"])

4. 실전에서 유용한 것들

  • 전체 글 수 확인: GET /posts?per_page=1의 응답 헤더 X-WP-Total에 전체 개수가 들어온다.
  • 대량 상태 변경: 기존 글을 초안으로 내리려면 POST /posts/<id>{"status":"draft"}. 사이트 주제를 갈아엎을 때 이 한 줄이면 된다.
  • 필요한 필드만: _fields=id,title,link를 붙이면 응답이 가벼워져 목록 조회가 빠르다.

이 방식으로 나는 글 발행·예약·대량 정리를 전부 스크립트로 처리한다. 관리자 화면을 안 여는 만큼, 사람이 하는 실수(오타·누락)도 줄어든다.

댓글 남기기

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.ㅇ