wordpress への自動投稿(python)

本ブログにて、京都市の体育館の最新情報を発信しています。

これは、京都市のHPにて各条件(体育館と日時)を選択して一件ずつ確認しなければならなかった予約状況を、一つの表にまとめて表示したものです。

4時間おきに以下のプログラムが自動で走る様になってます。

  1. 京都市体育館予約HPの中身をスクレイピングして情報を取得(スクレイピング用ライブラリ selenium を使用)
  2. まとめた表を本ブログに投稿(記事を更新)
  3. 同様の内容をtwitterで発信

本記事は、ワードプレスで作成したブログに自動投稿するプログラムの備忘録になります。

こちらの記事を参考にさせてもらいました。

自動投稿する際,プラグインやライブラリを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))

参考

参考HP

関連書籍