WordPressをいじっていると、自動投稿って試してみたくなりますよね。ということで、Pythonを使って記事の自動投稿をしてみます。
自動投稿の準備
プラグイン
自動投稿について書かれているサイトを見ると、「WP REST API プラグインを入れる」とか「Application Passwords プラグインを入れる」とか書かれていますが全部不要でした。
この記事を書いている時点の私のWordPressのバージョンは5.7.2です。
ということで、プラグインは不要でした。
自動投稿時のパスワード
Python から自動投稿するときに、ユーザー名とパスワードは必要です。そこで、パスワードを発行してみたいと思います。
WordPress左側Menuにある ユーザー => ユーザー一覧 から、自動投稿に使うユーザーを選択し編集を押します。
そして、下の方に「アプリケーションパスワード」という欄があります。ここでパスワードを発行します。
「新しいアプリケーションパスワード名」の欄に「Pythonから自動投稿用」とか適当な名前を入れます。何用のパスワードを発行するか?ってことです。
その後、「新しいアプリケーションパスワードを追加」ボタンを押すと、下にパスワードが表示されます。このパスワードは二度と表示されることがなさそうなので、スクショしておくといいと思います。
記事を自動投稿するコードを書く
では、自動投稿のコードを書いていきます。
自動投稿の全体の参考として、下記サイトを見ました。
WordPress REST API With Python
サーバーに記事を送るのは、Pythonのrequestsを使います。下記サイトのpost部分を参考にしました。
Requests クイックスタート
ユーザー認証は、下記サイトを参考にしました。
Basic Authentication
Create Postのときのパラメータの意味は、下記サイトを参考にしました。
REST API Handbook
実装したコードがこちらです。(※サンプルコードが見づらかったので、一部省略しました。)
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 = 'これは自動投稿テストです。下記記事参照。※ここ一部省略しました。' 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自動投稿テストこのコードを、そのままもう一度実行すると、どうなるのでしょう?
やってみると、post_idが異なる記事がもう一つ投稿されていました。
しかし、自動投稿した2つの記事の両方のパーマリンクに”-2″という文字列が最後に追加されていました。
さらに、後から自動投稿した記事をゴミ箱へ捨てると、先に自動投稿した記事のパーマリンクは元に戻っていました。
これはバグなのか、パラメータが足りていないのかは、まだわかっておりません。なので、同じslug名で自動投稿を繰り返さない方が良さそうです。
記事のカテゴリIDを複数指定する方法
カテゴリID、タグID は複数指定することができます。
下のハイライト行のように ‘categories’: ‘5, 8’ のように指定します。
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()
WordPressの投稿一覧を見ると、カテゴリID を複数指定できていることが確認できます。