Pythonでwordpressに自動で投稿する(python-wordpress-xmlrpc)

絹田
絹田

プラグインやライブラリをPython側に入れるかWordPres側に入れるかで2通りの方法があるよ

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

でライブラリを入れました。
(conda install ***だとファイルが見つからなかったので、 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
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

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
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

絹田
絹田

読んでくれてありがとう.これからもよろしくね

コモディティ化するビックデータ分析と今後求められるスモールデータ分析

ビックデータというのは10年くらい前から言われた言葉で、センサが安価になって多くのデータが得られるようになったり、Web上で多くのデータが得られるようになって言われた言葉です。データの量とマシンパワーで力づくでモデルを構築し、原因を分析したらモデル作成を行う方法です。特に深層学習のように人の判断を介在させず、データからのみで判断させるような解析は素晴らしいと思います。

しかし、今後、より注目されるのがスモールデータ分析だと思います。

ビックデータ解析ではもはやいかにデータを集められるかというのがポイントとなっています。ハードウェアの値段は下がっていますし、クラウドサービスで一時的にマシンパワーを借りることもできます。方法も公開されているものが多いので、既にビックデータ分析はレッドオーシャンという意見もあります。

それに対して、スモールデータは

  • 装置の故障データのようにその発生自身稀であるデータ
  • 疾患データのように多くのデータが集められないようなデータ

のことでビックデータのようにブルートフォースな解析ができません。したがって、専門家の知見に基づく考察やデータのより繊細な前処理が必要となります。スモールデータでは、データからすべてを判断することができるほどのデータがありませんので固有技術的な考察を駆使してメカニズムを推定し、知見や仮説につなげることが重要です。

スモールデータの特徴

ビックデータと比べてスモールデータには下記のような特徴があります。

  • カラム数に比べてサンプルデータ数が少ない
  • カラム同士で相関がある
  • 疾患数や故障数のように正常と異常データの数が違う不均衡データ

企業のドメスティックな環境で得られるデータというのはほとんどこれに相当すると思います。

スモールデータ分析の心構え

そして、このスモールデータを解析するにあたって重要なのは

  • 目的に対して適切な問題設定を行う
  • データの質が命

ということです。これはビックデータでも重要であることには違いありませんが、データ数が少ないと問題設定に応じたデータを選択的に取得する必要が出てきますのでよりその傾向は強くなると思います。

また、1番目の「目的に対して適切な問題設定を行う」という件についてはAIや機械学習になると途端に問題設定が曖昧になる傾向があると思います。しかし、何が目的なのか、そのためにどういう問題設定が適切なのかというのが人が行うべき業務なわけで解析でもこれが定まらないと成功するのは困難となります。例えば機械学習で株価を当てるということを考えたとき、目的は儲けるということですので、上がるか下がるかを予測するのが大事であって1円単位で予測することではないはずです。問題を適切に設定することで難易度は変わりますし、スモールデータだと今言った目的設定や課題設定がより重要になってきます。

必要なこと

今後スモールデータ分析が重要になる中で何を学べばいいかというと

  • 機械学習やデータ前処理に関するアルゴリズムへの最低限の理解
  • 専門知識

だと思います。ビックデータだとライブラリに放り込んで比較的いい感じに分析してくれることがあってもスモールデータだと中身を理解していないと導く結論が大きく変わってしまうことがあります。またもう一つが専門的な知見です。固有技術的な考察を駆使してメカニズムを推定することでデータを効率的に活用することが求められますので、データサイエンスのみならず専門的な知見というのが大事になってくると思います。

データサイエンティストという職業がすっかり普及しましたが、今後はデータサイエンスに関する知識というのは専門家に求められる教養や素養という位置づけになり、各分野の専門家の役割というのが復活していくかもしれませんね。

Angularで再読み込み時に404エラーがでる

なぜ404エラーとなるのか

AngularをはじめとするSPAでは、URLごとに実態のあるページが存在する一般的なサイトとは異なり、index.htmlをクライアント側で書き換えるため直接特定のアドレスにアクセスするとエラーがでます。

開発環境では出ない理由

開発環境だと開発サーバ側でindex.htmlを読み込んでくれているので問題にならないのですが、デプロイ時には自分で設定することになります。設定内容はファイルが見つからない時はindex.htmlを参照してくれというものですので、Angularではなくサーバ側のapacheやnginxなどの設定ということになります。なのでデプロイ時に顕在化する問題となります。

APacheの場合

.htaccessファイルに下記を指定します。サブドメインを使ってホスティングする場合、サブドメインのルート(サブドメインのindex.htmlのある場所)に下記を設置すればいいです。

<pre class="wp-block-syntaxhighlighter-code">RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^ /index.html</pre>

Nginxの場合

こちらのページ(Front Controller Pattern Web Apps)に記載されているtry_filesを使ってindex.htmlに対して下記を設定します

try_files $uri $uri/ /index.html;

Firebaseでホスティングする場合

rootにある設定ファイル(確かfirebase.jsonだったと記憶)を下記のように直せばいいです

"rewrites": [ {
  "source": "**",
  "destination": "/index.html"
} ]

その他の場合

IISやRubyの場合は公式を見ていただくのが良いかと思います。

https://angular.io/guide/deployment#server-configuration

その他

写真から文字情報を抽出して爆速でレポートや記事を作成するアプリを作成しています。無料なのでよかったらどうぞ。

iOS => https://apps.apple.com/app/id1497498494

Android => https://play.google.com/store/apps/details?id=com.rainbowsv2.ocr