AI×Python×WordPressで記事投稿を自動化した話

AI自動化記事 AI活用

ブログの記事をAIと壁打ちしながら作るようになって、執筆自体はかなり効率化できました。ところが書き終わった後にWordPressの管理画面を開いて、タイトル・本文・メタディスクリプションをそれぞれ貼り付ける作業が地味にボトルネックになっていました。

そこでPythonとWordPressのアプリケーションパスワードを組み合わせて、この投稿作業を自動化してみました。記事が完成したらClaudeにスクリプト形式で出力してもらい、ターミナルで1コマンド実行するだけで下書き投稿まで完了します。

今回はmac環境(Python 3.9.6)で実際に動かしてみた手順と、ハマったポイントをまとめます。

なぜ自動投稿を考えたか

AIと壁打ちしながら記事を書くようになってから、執筆のスピードが上がりました。その分、書き終わった後の投稿作業の手間が相対的に気になり始めました。

具体的には記事が完成するたびに以下の作業を管理画面で行っていました。

  • タイトルをコピペ
  • 本文をコピペ
  • メタディスクリプションをコピペ
  • 下書き保存して確認

1回あたりの手間は小さいですが、AIで執筆が速くなった分この作業が毎回引っかかるようになりました。どうせなら記事の完成からWordPressへの投稿までを一気通貫で終わらせたい。そう考えてPythonでの自動化を試してみました。

仕組みの全体像

今回の自動化はシンプルに2つの要素を組み合わせています。

WordPressのREST API
WordPress 4.7以降に標準で搭載されている機能です。外部のプログラムからHTTPリクエストを送ることで、記事の投稿・取得・更新などの操作ができます。プラグインは不要です。

アプリケーションパスワード
WordPress管理画面から発行できる専用の認証情報です。通常のログインパスワードとは別物で、万が一漏れても管理画面へのログインには使えません。ただし発行したユーザーの権限を持つため、取り扱いには注意が必要です。不要になったらすぐに取り消せるので、用途ごとに発行して管理するのがおすすめです。

全体の流れはこうなります。

  1. Claudeと壁打ちして記事を完成させる
  2. 「wp_post.py用に出力して」とClaudeに依頼する
  3. 出力されたスクリプトをターミナルに貼り付ける
  4. python3 wp_post.py を実行する
  5. WordPressに下書きとして投稿される

事前準備

Pythonのバージョン確認

まずターミナル(macの場合はLaunchpadから「ターミナル」で検索)で以下を実行してPythonが使える状態か確認します。

python3 --version

Python 3.x.x と表示されれば問題ありません。macはPython 3系が標準で入っているので、追加インストールは不要です。筆者の環境はPython 3.9.6でした。

必要なライブラリのインストール

今回使うライブラリは requests 1つだけです。

pip3 install requests

インストール後にいくつか警告が出ることがありますが、Successfully installed と表示されていれば問題ありません。

アプリケーションパスワードの発行

  1. WordPress管理画面にログイン
  2. 左メニュー「ユーザー」→「プロフィール」
  3. 一番下までスクロール
  4. 「アプリケーションパスワード」の欄に任意の名前(例:auto-post)を入力
  5. 「新しいアプリケーションパスワードを追加」をクリック
  6. 表示されたパスワードをメモ(一度しか表示されません)

Pythonスクリプトの全コード

今回使うファイルは2つです。同じフォルダに置いて使います。

任意のフォルダ/
├── config.txt     ← 接続情報を書く(最初に一度だけ設定)
└── wp_post.py     ← 記事ごとに実行するスクリプト

config.txt

WP_URL=https://あなたのサイトのURL
WP_USERNAME=WordPressのユーザー名
WP_APP_PASSWORD=発行したアプリケーションパスワード

URLは末尾のスラッシュなしで入力してください。

wp_post.py

記事ごとにTITLECONTENTEXCERPTの3箇所を書き換えて使います。後述するClaudeへの依頼でこの部分を自動で埋めてもらう運用が便利です。

import requests
from requests.auth import HTTPBasicAuth
import os

def load_config(path="config.txt"):
    config = {}
    script_dir = os.path.dirname(os.path.abspath(__file__))
    config_path = os.path.join(script_dir, path)
    with open(config_path, "r", encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if line and "=" in line and not line.startswith("#"):
                key, _, value = line.partition("=")
                config[key.strip()] = value.strip()
    return config

TITLE = "ここにタイトル"

CONTENT = """
ここに本文
"""

EXCERPT = "ここにメタディスクリプション(120文字以内)"

def post_to_wordpress():
    config = load_config()
    endpoint = f"{config['WP_URL']}/wp-json/wp/v2/posts"
    payload = {
        "title":   TITLE,
        "content": CONTENT,
        "excerpt": EXCERPT,
        "status":  "draft"
    }
    response = requests.post(
        endpoint,
        json=payload,
        auth=HTTPBasicAuth(config["WP_USERNAME"], config["WP_APP_PASSWORD"])
    )
    if response.status_code == 201:
        post_data = response.json()
        print("✅ 投稿成功!")
        print(f"   タイトル : {TITLE}")
        print(f"   記事ID   : {post_data['id']}")
        print(f"   確認URL  : {config['WP_URL']}/wp-admin/post.php?post={post_data['id']}&action=edit")
    else:
        print(f"❌ 投稿失敗 (ステータス: {response.status_code})")
        print(response.text)

if __name__ == "__main__":
    post_to_wordpress()

Claudeと組み合わせた使い方

記事が完成したら、Claudeに以下のように依頼します。

「この記事をwp_post.py用に出力して」

するとClaudeがTITLECONTENTEXCERPTを埋めた状態のスクリプトをそのまま出力してくれます。あとはターミナルに貼り付けて実行するだけです。

実際の運用はこの流れになります。

  1. Claudeと壁打ちしながら記事を完成させる
  2. 「wp_post.py用に出力して」と依頼する
  3. 出力されたスクリプトをターミナルに貼り付ける
  4. python3 wp_post.py を実行する
  5. WordPressの管理画面でドラフトを確認して公開する

管理画面を開くのは最後の確認と公開のときだけになります。タイトル・本文・メタディスクリプションをそれぞれ貼り付ける手間がなくなり、投稿作業がワンコマンドに集約されます。

実際に動かしてみた・ハマったポイント

実際にmac環境で動かしてみたところ、2つのポイントでハマりました。同じミスをする方がいると思うので共有します。

① `python` コマンドが使えない

スクリプトを実行しようとして以下のコマンドを打つと、

python wp_post.py

zsh: command not found: python というエラーになります。macは python ではなく python3 で呼び出す必要があります。

python3 wp_post.py

これで動きます。

② config.txtのURLに `/wp-admin` を付けてしまった

接続情報を設定する際にWordPressの管理画面URLをそのままコピーしてしまい、以下のように設定してしまいました。

WP_URL=https://example.com/wp-admin

これだと404エラーになります。正しくはサイトのルートURLだけです。

WP_URL=https://example.com

スクリプト側で /wp-json/wp/v2/posts を自動で付けるので、URLはドメインまでで大丈夫です。

404エラーが出たときの切り分け方として、ブラウザで以下のURLにアクセスしてJSONが表示されるか確認するのが確実です。

https://あなたのサイトのURL/wp-json/wp/v2/posts

JSONが表示されればREST APIは有効なので、あとは認証情報の確認で解決できます。

まとめ

  • WordPressのREST APIとアプリケーションパスワードを使えば、Pythonから記事投稿できる
  • 必要なライブラリは requests 1つだけ
  • 接続情報はconfig.txtに分離しておくとスクリプトを触らずに済む
  • Claudeに「wp_post.py用に出力して」と依頼すればスクリプトをそのまま貼り付けられる
  • 投稿作業が python3 wp_post.py の1コマンドに集約される

AIで記事を書くスピードが上がった分、投稿作業がボトルネックになっていた方はぜひ試してみてください。

なお今回はドラフト投稿までの自動化です。カテゴリ・タグの自動設定やアイキャッチ画像の設定など、さらに自動化できる余地はあります。この辺りは別記事で紹介予定です。

コメント

タイトルとURLをコピーしました