【Python】XMLRPCを使ってPythonでWordPress記事を投稿する

Python
スポンサーリンク
スポンサーリンク

目的

表題ママです。

頑張ってブログを続けたいと思いつつ、なかなか更新に時間をとれないため、なんとか簡略化できないかと思い、至ったのが半自動化。

Pythonで話題を集めつつトピックスとして投稿して、細かいところを手直しする、みたいな方法で何とかモチベを保てないかなと画策しました。

というわけで、まずはPythonを使ってWordPressに記事を投稿するまでを実現したいと思います。

 

準備

主にPython側の準備とWordPress側の準備があります。

また、レンタルサーバを使っている場合は場合によってはそのサーバの設定が必要です。

今回は私が使っているXserverでの設定となります。

Python

バージョン

$ python3 --version
Python 3.7.3

 

モジュール

pythonでRPCを使うには以下のモジュールをインストールする必要がある(訳でもないけど自力でやるとめんどくさい)ので、pipでインストールします。

$ pip install python-wordpress-xmlrpc

とりあえずこれだけインストールしておけばPython側はOK

 

XServer(WP)

バージョン

WordPress 6.1

 

RPC動作チェック

https://[ブログのドメイン]/xmlrpc.php

にアクセスしてみて、以下のような画面が出ればOK

 

404が出力される場合

xmlrpc.phpのパスが違うところにある可能性があるので、レンタルサーバなどの仕様を確認してみてください

 

403が出力される場合

サーバの設定でフィルタリングされている可能性があります。

ファイアウォールやセキュリティなどを再確認すると何かわかるかも。

 

RPCのフィルタリング設定

xmlrpc.phpは便利な反面、攻撃を受けやすいファイルでもあります。

そのため、自分以外のアクセスはできるだけされないような設定を導入します

※以下の設定はXServerのものとなります。

 

海外からのアクセスを制限

海外のIPアドレスからのアクセスを制限することで、攻撃の約8割を防ぐことができると言われています。

そのため、RPC APIを国内IPのみ許可しましょう。

XServerにログインしてメインメニューを表示し、

[WordPress]のメニューの中にある[WordPressセキュリティ設定]をクリック

[国外IPアクセス制限設定]の中の[XML-RPC APIアクセス制限]をONにします

これで国外からの攻撃は防ぐことができます。

 

IPアドレスを指定して許可

これだけだと国外からの攻撃は防げても国内からの攻撃はスルーしてしまいます。

もし固定IPアドレスを持っている人であれば、そのIPアドレスだけ許可するようにすれば一番安全です。

.htaccessファイルを編集することで実現することができます。

[ホームページ]のメニューの中にある[.htaccess編集]をクリック

 

編集のページを開き、以下を追記しましょう。

<Files xmlrpc.php>
    Order deny,allow
    Deny from all
    allow from [自分の固定IPアドレス]
</Files>

固定IPを持っていない場合、IPアドレスが更新されるタイミングで自分ですらアクセスできなくなってしまうので、よくわからない人は海外からのアクセス制限だけやっておくのが良いと思います。

 

Python投稿用のユーザーを作成

いつもは管理者権限を持っているアカウントで記事を書いたりしているのですが、

さすがにbot投稿させる際に管理者権限を使わせるのは色々な意味で怖いので、

bot用のユーザーを作成します。

WordPressに管理者でログインして、[ユーザー]→[新規追加]をクリック

bot用のユーザーを作成しましょう。

権限はとりあえず「編集者」にしておきます。(もっと低いレベルでよさそうなら後で変える)

 

Pythonプログラム作成

準備が終わったのでとりあえずテスト記事を投稿するPythonを書いてみます。

記事投稿プログラム

wp_rpc.py

# coding:utf-8

#==========================
# インポートモジュール
#==========================
import sys
from wordpress_xmlrpc import Client, WordPressPost, methods
#==========================
# グローバル変数
#==========================
args = sys.argv
XMLRPC_URL = 'RPC動作チェックで確認したURL'
USERNAME = '投稿するユーザー名(今回は上で作ったユーザー)'
PASSWD = 'ユーザーのログインパスワード'

#==========================
# 関数
#==========================

# RPCを使うユーザーの認証
def auth_rpc_client(url = XMLRPC_URL, username = USERNAME, passwd = PASSWD):
  client = Client(url, username, passwd)
  return client

# 記事を投稿する
def post_wp(client, wp_title, wp_content):
  post = WordPressPost()
  post.title = wp_title
  post.content = wp_content
  post.terms_names = {"post_tag": ["Python", "WordPress"], "category": ["Python"]}
  
  post_id = client.call(methods.posts.NewPost(post))
  print(post_id)

#==========================
# MAIN関数
#==========================
def main():
  print(" ---- exec " + args[0] + " python program ----")
  client = auth_rpc_client()
  post_wp(client, 'テスト記事', 'テストです')
  

if __name__ == "__main__":
  main()

超ざっくりと作成しました。

実行するとテスト記事を投稿してくれます。

 

実行結果

$ python3 wp_rpc.py
 ---- exec wp_rpc.py python program ----
5403

投稿に成功すると、投稿された記事のIDを出力します。

ブログのほうを見てみると

ちゃんと投稿されていそうです。

下書き状態で投稿されるようですね。

おそらくこのあたりはPOSTするときのパラメータでいきなり公開状態で投稿できたりするのでしょう。

そのあたりはまた今度調べておきます。

 

まとめ

  • RPCを使って外部から記事を投稿できるようになった
  • Pythonを使うとライブラリが使えてとっても楽
  • htmlを送ったりもできるのかな?今後確認する

あとは何のデータを集めて記事にするかとか、GoogleSearchConsoleへ自動でクロール申請できたりするのかとか、

そのあたりをちょっと調べてみようかな・・・

 

 

コメント

タイトルとURLをコピーしました