ブログやWebサイトを作成する際はWordPressを用いることが一般的ですが、Pythonを使うとWordPressの投稿を自動で更新したり、複数の記事を一括で処理したりなどといった自動処理が可能になります。ここではPythonからWordPressを操作するためのモジュールとしてpython-wordpress-xmlrpcを用いた方法を紹介します。
開発環境
- Python 3.7.9
- python-wordpress-xmlrpc 2.3
python-wordpress-xmlrpcについて
WordPressに外部プログラムからアクセスする方法
Pythonスクリプトなどの外部プログラムからWordPressに接続し操作する方法は、次の2通りあります。
- XML-RPCプロトコルを用いる方法
- REST APIを用いる方法
XML-RPCプロトコルは従来からある方法で、Webサービスと外部プログラムとを接続させるための伝統的な方法です。WordPressでもこれを介してコンテンツの投稿や更新を行うためのAPIが用意されており、デフォルトで有効になっているので特に何も設定しなくても使うことができます。それに対してREST APIは比較的新しい技術で、より汎用的に様々な操作が可能になっています(WordPress REST API)。WordPressにおいてもバージョン4.7以降は標準サポートされるようになりました。
汎用性の点からはREST APIの方が軍配が上がり将来的にはこちらが主流になる可能性もあります。ただし、XML-RPCプロトコルもデフォルト機能の一つであり、Pythonから扱うためのライブラリ(モジュール)も整備されていて簡単に使うことができるので、ここではXML-RPCを用いた方法を説明していきます。
python-wordpress-xmlrpcのインストール
WordPressに対してXML-RPCを介してPythonから操作するためのモジュールとして、python-wordpress-xmlrpcがあります。ここではこのモジュールを導入してみましょう。なお、python-wordpress-xmlrpcのWindows版はAnacondaに登録されていないので、ここではpipを用いてインストールしました。
pip install python-wordpress-xmlrpc
python-wordpress-xmlrpcのライブラリについては以下をご覧ください。
python-wordpress-xmlrpcの基本的な使い方
WordPressのユーザー認証を行う
まずはpython-wordpress-xmlrpcを用いてWordPressへのユーザー認証を行い、認証済みのクライアントをClientインスタンスとして取得します。
from wordpress_xmlrpc import Client
url = '<xmlrpc.phpのURLを指定>'
user = '<ユーザー名を指定>'
password = '<パスワードを指定>'
client = Client(url, user, password)
この時、上記のようにxmlrpc.phpのURLと、WordPressのユーザー名・パスワードを指定する必要があります。
xmlrpc.phpのURLはWordPressの管理画面のURLのwp-admin/をxmlrpc.phpに置き換えたものになります。例えば、管理画面が「https://〇〇〇〇.com/wp-admin/」であればxmlrpc.phpのURLは「https://〇〇〇〇.com/xmlrpc.php」になります。ユーザー名、パスワードは各自のWordPressのログイン時に使っているものに合わせて指定してください。
認証済みクライアントを用いたWordPressの操作
認証済みのクライアントをClientインスタンスとして取得したら、そのcallメソッドを使って引数に実行したい処理を表すXML-RPCメソッドのインスタンスを指定して、処理を実行します。python-wordpress-xmlrpcではXML-RPCメソッドはすべてXmlrpcMethodクラスを継承して作成されていて、callメソッドではXmlrpcMethodクラスを継承したクラスのインスタンスを引数として受け付けることができます。
なお、このように実行させる処理をオブジェクトとして表現して作成し、最後に実行するスタイルをCommandパターンと呼び、よく用いられるオブジェクト指向プログラミングデザインパターンの一つです。
WordPressの操作の例:投稿一覧(直近10件)を取得する
それでは例としてWordPressの投稿記事の直近10件を取得するコードを書いてみましょう。
from wordpress_xmlrpc import Client, methods
url = '<xmlrpc.phpのURLを指定>'
user = '<ユーザー名を指定>'
password = '<パスワードを指定>'
client = Client(url, user, password)
posts = client.call(methods.posts.GetPosts())
for post in posts:
print(post.id, post.title)
10906 二値化画像から関心領域(ROI)の輪郭を検出する【OpenCV】 10669 DataFrameを1行ずつ処理する(forループ)【Python】 10885 matplotlibで日本語を表示する【Python】 10877 グラフに凡例を追加する【Python】 10875 棒グラフを描く【Python】 10440 COVID-19 オープンデータを可視化する②:ワクチン接種状況の可視化【Python】 10590 「Python-UWP サンプルアプリ」をMicrosoft Storeに提出する【UWP】 9985 UWPアプリにPythonでコーディングした処理を組み込む【UWP】 10392 FullTrustProcessとして起動したランチャーを介して外部プログラムを実行する【UWP】 10377 外部プログラムに引数を渡して実行する【UWP】
7行目で認証済みのクライアントを取得し、8行目でそのcallメソッドの引数に実行したい処理(XML-RPCメソッド)を表すGetPostsクラスのインスタンスを渡しています。これにより投稿記事の一覧がWordPressPostインスタンスのリストとして取得され、上記のように直近10件の投稿のIDとタイトルを表示させることができました。
トラブルシューティング
python-wordpress-xmlrpcは上記の通り簡単に扱うことができるのですが、実は自分の環境でテストしてみると認証済みのクライアントを取得するところで以下のようなエラーが発生してしまいました。
例外が発生しました: ExpatError XML or text declaration not at start of entity: line 2, column 0
これに関してはGitHubのIssueにも挙がっていて、WordPressの環境によってはxmlrpc.php生成の際に不必要な改行が入ってしまうことがあるというバグに起因するもののようです。使用しているテーマやプラグインなどに依存するのだと思いますが、どのような環境で発生するのかは分かりませんでした。
このエラー自体はpython-wordpress-xmlrpcの内部で使用されているPythonの標準ライブラリのxmlrpcモジュールで発生しているので、そのxmlrpcモジュールのエラーの原因となっている関数で不必要な改行を削除する処理を加えることで解決できます。なお、この方法はPythonの標準ライブラリの関数を書き換える必要があるので、自信のない場合は避けた方がいいかもしれません。
以下でAnacondaを用いてPython3.7.9をインストールしている場合の解決方法をお示しします。(GitHubで提示されている方法はPython2.xの方法なので若干の差異があります)
問題となっているコードは以下のxmlrpcフォルダ内のclient.pyにあるので、まずはこれをテキストエディタで開きます。フォルダの階層はAnacondaをインストールした場所によって異なりますので、自分の環境に合わせて読み替えてください。
続いて、client.pyの439行目のを以下のように書き換えて上書き保存します。
(旧) self._parser.Parse(data, 0) ↓ (新) self._parser.Parse(data.strip(), 0)
これで実行すればエラーが出なくなりました。
なお繰り返しになりますが、Pythonの標準ライブラリの関数をいじる必要があるので、あくまでも自己責任でお願いします。(適宜仮想環境を作成するなりして修正することをお勧めします)
コメント