🐫
wordpress への自動投稿(python)
こちらの記事を参考にさせてもらいました。
自動投稿する際,プラグインやライブラリをPython側に入れるかWordPres側に入れるかで2通りの方法があるらしく、 今回は簡単に出来そうな、xmlrpcを使う方法を用いました。
- REST:WordPressの「WP REST API」プラグインを使用する
- XML-RPC:WordPressにデフォルトで備わっているwordpresのxmlrpcのインターフェースを利用する
RESTの方が汎用性は高い一方で、テーマによっては使えないことがあります。XML-rpcの場合は昔からあるので追加設定はいらず安定感はあります。Pythonを使ってxmlrpcでWordPressサイトを操作する場合、python-wordpress-xmlrpcをpipすれば使えるようになります。私はWordPressのプラグインを増やしたくなので後者の方を利用するようにしています。
コード
ライブラリのインストール
pip install python-wordpress-xmlrpc
新規に記事を投稿する場合
必要な情報
- url:ブログのトップURLの後ろに/xmlrpc.phpをつける。
- user:ユーザー名。管理画面のユーザー一覧の「ユーザー名」列に表示される
- password:管理者画面にログインするためのパスワード
import time
from datetime import datetime
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.users import GetUserInfo
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
import locale
# 時間を日本時間にセットする
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
url="https://~~~~~~~~~~~~~~~~~~/xmlrpc.php"
# ブログのトップURLの後ろに/xmlrpc.phpをつける。
user="XXXXXXXXXX"
password="XXXXXXXXXX"
# クライアントの呼び出しなど
wp = Client(url, user, password)
post = WordPressPost()
# 記事の編集 ##########
post.post_status = "publish" #publish:投稿 or draft:下書き
# 過去の日付にするとその日に投稿されたことになる。
# 未来の日付にすると投稿が予約にされる
post.date = datetime.now()
post.title = "タイトル"
post.content = "本文(HTML形式でも良い)"
post.terms_names = {
"post_tag": ['希望するtag1', '希望するtag2'],
"category": ['希望するカテゴリー1', '希望するカテゴリー2'],
}
# 記事の編集おわり ##########
# 投稿 返り値として記事のid(pid)が得られる
wp.call(NewPost(post))
"""output
1598
"""
既に投稿済みの記事を更新する場合
必要な情報
- url:ブログのトップURLの後ろに/xmlrpc.phpをつける。
- user:ユーザー名。管理画面のユーザー一覧の「ユーザー名」列に表示される
- password:管理者画面にログインするためのパスワード
- pid:記事のid。記事の編集画面のurlに「post=XXXX」の様な形で表示されている
url="https://~~~~~~~~~~~~~~~~~~/xmlrpc.php"
# ブログのトップURLの後ろに/xmlrpc.phpをつける。
user="XXXXXXXXXX"
password="XXXXXXXXXX"
pid = XXXX
# クライアントの呼び出しなど
wp = Client(url, user, password)
# 編集したい記事を呼び出す
post = wp.call(GetPost(pid))
# 記事を編集する(新規投稿時と同じ)
post.post_status = "publish"
post.title = "タイトル"
post.content = "本文(HTML形式でも良い)"
post.terms_names = {
"post_tag": ['希望するtag1', '希望するtag2'],
"category": ['希望するカテゴリー1', '希望するカテゴリー2'],
}
post.date = datetime.now()
# 記事の投稿
wp.call(EditPost(pid, post))
Discussion