自動投稿する方法として,プラグインやライブラリといったツールをPython側に入れるかWordPres側に入れるかで2通りの方法があります.
- REST:WordPressの「WP REST API」プラグインを使用する
- XML-RPC:WordPressにデフォルトで備わっているwordpresのxmlrpcのインターフェースを利用する
RESTの方が汎用性は高い一方で、テーマによっては使えないことがあります。XML-rpcの場合は昔からあるので追加設定はいらず安定感はあります。Pythonを使ってxmlrpcでWordPressサイトを操作する場合、python-wordpress-xmlrpcをpipすれば使えるようになります。私はWordPressのプラグインを増やしたくなので後者の方を利用するようにしています。
環境
動作環境はWindows10 64bitでPython3.6.5(Anaconda3.5.1-0)。 Mac Python3.8とXserverのターミナル(Python3.8)からもうまく動作しました。
コード
pip install python-wordpress-xmlrpc
でライブラリを入れました(Pypi)。 Anacondaリポジトリにはないので、仮想環境を作ってPipすればいいです。
あとは下記のコードを実行するだけです。
新規に投稿する場合
# -*- coding: utf-8 -*-
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
#SSL通信をするときにLocal側に証明書が必要
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
def main():
"""
変数を定義
"""
id="******"
password="******"
#idとpasswordはwordpressの管理画面に入るためのもの
url="https:***/xmlrpc.php"
#第3者が閲覧するURLの後ろに/xmlrpc.phpをつける。
#ワードプレスの管理画面の後ろにつけるとエラーになった
which="publish"
#which="draft"
#下書きに投稿するか本番で投稿するか選択
"""
クライアントの呼び出しなど
"""
wp = Client(url, id,password)
post = WordPressPost()
"""
実際に投稿する
"""
post.post_status = which
post.title = "タイトルをここに書く"
post.content = "本文をここに書く"
post.terms_names = {
"post_tag": ['希望するtag1', '希望するtag2'],
"category": ['希望するカテゴリー1', '希望するカテゴリー2'],
}
#過去に投稿した記事としたい場合、投稿日をここで指定。例として2018年1月1日10時5分10秒に投稿した例を示す。
post.date=datetime.strptime("2018/1/01 10:05:10","%Y/%m/%d %H:%M:%S")
wp.call(NewPost(post))
if __name__=="__main__":
main()
編集する場合
編集をする場合、編集したい記事のIDを取得したあと、その記事に対して操作します。
1.まず編集したい記事のIDを取得
# -*- coding: utf-8 -*-
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 GetPost, GetPosts, NewPost, EditPost
#SSL通信をするときにLocal側に証明書が必要
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
def main():
id="******"
password="******"
#idとpasswordはwordpressの管理画面に入るためのもの
url="https:***/xmlrpc.php"
#第3者が閲覧するURLの後ろに/xmlrpc.phpをつける。
#ワードプレスの管理画面の後ろにつけるとエラーになった
"""
クライアントの呼び出しなど
"""
wp = Client(url, id, password)
post = WordPressPost()
posts = wp.call(GetPosts({'number': 5}))
for post in posts:
print(post.id, post.title,str(post.terms[0]))
if __name__=="__main__":
main()
もし編集したい記事が決まっている場合、その記事の編集画面にいくとURLにIDが表示されますのでそちらを利用することも可能です。
2. 記事を編集する
上記で記事IDを調べて、その記事に対して操作します。pidが編集したい記事のID(post_id)です。
# -*- coding: utf-8 -*-
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 GetPost, GetPosts, NewPost, EditPost
#SSL通信をするときにLocal側に証明書が必要
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
def main():
id="******"
password="******"
#idとpasswordはwordpressの管理画面に入るためのもの
url="https:***/xmlrpc.php"
#第3者が閲覧するURLの後ろに/xmlrpc.phpをつける。
#ワードプレスの管理画面の後ろにつけるとエラーになった
"""
クライアントの呼び出しなど
"""
wp = Client(url, id, password)
pid = 1030
post = wp.call(GetPost(pid))
post.post_status = "publish"
post.content = "content"
post.terms_names = {
"post_tag": ['tag1'],
"category": ['diary',],
}
ret = wp.call(EditPost(pid, post))
if __name__=="__main__":
main()
動作環境の注意
手元のPCはWIndowsでも Macでも動作確認しています。Xserverのターミナルからもうまく動作しました。しかし、以前Google Cloud PlatformのCloud functionsでデプロイした場合はできなかった記憶があります。AWS lamdbaなどでもエラーが起きる可能性があるのでローカルで動作させる事をお勧めします。
動作しない場合
・siteGuardなどセキュリティ系のプラグインを入れると、デフォルトでxmlrpcをオフにしますので、解除が必要です
・Xserverなど一部のレンタルサーバでは意図的にデフォルト でアクセスをOFFにしていますので管理画面から設定変更が必要です
siteguardの設定をオフにする
ダッシュ画面の左下からsiteguardを選択します。その中にXMMRPC防御という項目があるのでクリックします。
左上の部分でOFFを選択します。
Xserverの場合
xserverの場合、公式が丁寧に説明してくれているのでこちらを見れば大丈夫だと思います。
https://www.xserver.ne.jp/news_detail.php?view_id=6875
https://www.xserver.ne.jp/manual/man_server_wpsecurity.php#link-b02