WordPressへ、Pythonではじめての自動投稿

自動投稿してみる

WordPress をいじっていると、やはり自動投稿って試してみたくなりますよね。ということで、Python を使って自動投稿をしてみます。

自動投稿の準備

自動投稿について書かれているサイトを見ると、「WP REST API プラグインを入れる」とか「Application Passwords プラグインを入れる」とか、書かれていますが、全部、不要でした。この記事を書いている時点の私の WordPress のバージョンは 5.7.2 です。ということで、準備は何もいりませんでした。

自動投稿時のパスワード

Python から自動投稿するときに、ユーザー名とパスワードは必要です。そこで、パスワードを発行してみたいと思います。

WordPress 左側にある [ユーザー]-[ユーザー一覧] から、自動投稿に使うユーザーを選択し、[編集]を押します。

そして、下の方に「アプリケーションパスワード」という欄があります。ここでパスワードを発行します。

「新しいアプリケーションパスワード名」の欄に「Pythonから自動投稿用」とか適当に入れます。何用のパスワードを発行するか?ってことです。その後、「新しいアプリケーションパスワードを追加」ボタンを押すと、下にパスワードが表示されます。このパスワードは二度と表示されることがなさそうなので、スクショしておくといいと思います。

自動投稿する

では、自動投稿のコードを書いていきます。

自動投稿の全体の参考として、下記サイトを見ました。
WordPress REST API With Python

サーバーに記事を送るのは、Pythonのrequestsを使います。下記サイトのpost部分を参考にしました。
Requests クイックスタート

ユーザー認証は、下記サイトを参考にしました。
Basic Authentication

Create Postのときのパラメータの意味は、下記サイトを参考にしました。
REST API Handbook

実装したコードがこちらです。

auto_post.py

import requests
from urllib.parse import urljoin
from datetime import datetime

def wp_post():
    url_base = 'https://kamiki.blog/'
    url = urljoin(url_base, 'wp-json/wp/v2/posts/')

    user = '****' # ユーザー名
    password = 'AIGV W6AI 9PSX F8pI POXc M3qA'

    content = 'これは自動投稿テストです。下記記事参照。<br>[kanren id="394"]'

    post = {
        'title': 'WordPress自動投稿テスト',
        'status': 'publish', # draft(下書き), publish(公開)
        'slug': 'wordpress-auto-post-test', # パーマリンク
        'categories': 5, # カテゴリID
        'date': datetime.now().isoformat(),
        'content': content,
    }

    res = requests.post(
        url,
        json=post,
        auth=(user, password),
        )
    return

if __name__ == '__main__':
    wp_post()

自動投稿された記事は、こちらです。

WordPress自動投稿テストWordPress自動投稿テスト

気になること

このコードを、そのままもう一度実行すると、どうなるのでしょう?やってみると、post_idが異なる記事がもう一つ投稿されていました。
しかし、自動投稿した2つの記事の両方のパーマリンクに"-2"という文字列が最後に追加されていました。
さらに、後から自動投稿した記事をゴミ箱へ捨てると、先に自動投稿した記事のパーマリンクは元に戻っていました。
これはバグなのか、パラメータが足りていないのかは、まだわかっておりません。なので、同じslug名で自動投稿を繰り返さない方が良さそうです。

カテゴリIDを複数指定する

カテゴリID、タグID は複数指定することができます。'categories': '5, 8' のように指定します。

wp_post.py

import requests
from urllib.parse import urljoin
from datetime import datetime

def wp_post():
    url_base = 'https://kamiki.blog/'
    url = urljoin(url_base, 'wp-json/wp/v2/posts/')

    user = 'xxx'
    password = 'xxx'

    post = {
        'title': 'WordPress自動投稿テスト2',
        'status': 'draft', # draft(下書き), publish(公開)
        'slug': 'wordpress-auto-post-test2', # パーマリンク
        'categories': '5, 8', # カテゴリID
        'date': datetime.now().isoformat(),
        'content': 'test2',
    }

    res = requests.post(
        url,
        json=post,
        auth=(user, password),
        )
    print(res)
    return

if __name__ == '__main__':
    wp_post()

"投稿一覧" を見ると、カテゴリID を複数指定できていることが確認できます。