【保存版】WordPress REST APIの徹底活用術マーケットレポートを自動投稿〜SNS投稿まで

WordPress REST APIを使えば外部からWordPressを操作できるようになります。

当サイトではPythonを使って自動操作する方法についてシェアしていきます。

この記事で学べるスキル

この記事を最後まで読めば、Pythonを使ってWordPressの投稿をコントロールできるようになります。
この記事では事前に作成した各種Pythonコードを実行して出力されたHTMLを自動で投稿するコードを制作していきます。

全体の構図

WordPress REST APIを使って自動投稿をするにはWordPress 4.7以前はプラグインを使ってOAuth認証するのが一般的でした。

最近のWordPressではAPIはデフォルトで搭載されているのと、認証プロセスも内蔵されていますので、Python(または他のプログラミング言語)を使って、簡単に使用することができます。

一応旧WordPressでのOAuth認証についてもメモしておきましょう。

プラグインを使ったOAuth認証に興味のない方は最近のやり方に進んでください。

OAuth認証プラグインのインストール

  1. プラグインの選択
    • WordPressのダッシュボードにログインします。
    • 「プラグイン」→「新規追加」に移動します。
    • 「WP OAuth Server」などのOAuth認証プラグインを検索します。
  2. プラグインのインストールと有効化
    • 検索結果から「WP OAuth Server」を見つけて「今すぐインストール」をクリックします。
    • インストールが完了したら「有効化」をクリックします。

OAuthクライアントの設定

  1. WordPressダッシュボードへのアクセス
    • WordPressのダッシュボードにログインします。
  2. WP OAuth Serverの設定へ移動
    • ダッシュボード内のメニューから「WP OAuth Server」または「OAuth Server」を選択します。メニュー名はプラグインのバージョンによって異なる場合があります。
  3. クライアントの追加
    • 「Clients」または「クライアント」タブを選択します。
    • 「Add New Client」または「新しいクライアントを追加」をクリックします。
  4. クライアント情報の入力
    • クライアント名を入力します(例:「My Python App」)。
    • 「Redirect URI」フィールドには、OAuth認証が完了した後にリダイレクトされるURIを入力します。このURIは、OAuth認証プロセス中にトークンを受け取るために使用します。PythonスクリプトでOAuth認証を完全にコントロールしている場合、ここには適当なURIを設定しても問題ありません(例:http://localhost/callback)。
  5. クライアントの登録
    • 必要な情報を入力したら、「Add Client」または「クライアントを追加」をクリックしてクライアントを登録します。
  6. クライアントIDとシークレットの取得
    • 新しく作成されたクライアントのエントリを見つけ、表示されている「Client ID」と「Client Secret」をメモしておきます。これらは後でPythonスクリプトからAPIにアクセスする際に使用します。

これで、WordPress側でのOAuthクライアント設定は完了です。次に、PythonスクリプトでOAuthトークンを取得し、WordPress REST APIへの認証済みアクセスを行うコードを書く必要があります。

PythonスクリプトでのOAuthトークン取得

このステップでは、「requests_oauthlib」ライブラリを使用して、OAuth認証プロセスを通じてアクセストークンを取得します。以下はその基本的な手順です。

  1. 必要なライブラリのインストール: Pythonでこのスクリプトを実行する前に、必要なライブラリをインストールする必要があります。以下のコマンドでrequestsrequests_oauthlibをインストールできます。
pip install requests requests_oauthlib

スクリプトの準備: 下記のサンプルコードは、クライアント資格情報を使用してアクセストークンを取得するための基本的な流れを示しています。client_idclient_secretはWordPressから取得したものに置き換えてください。

from requests_oauthlib import OAuth2Session
from oauthlib.oauth2 import BackendApplicationClient

# クライアントIDとシークレットの設定
client_id = 'YOUR_CLIENT_ID'
client_secret = 'YOUR_CLIENT_SECRET'

# OAuth2セッションの初期化
client = BackendApplicationClient(client_id=client_id)
oauth = OAuth2Session(client=client)

# トークンの取得
token = oauth.fetch_token(
    token_url='https://money.kotarohattori.com/wp-json/wp/v2/token',
    client_id=client_id,
    client_secret=client_secret
)

print(token)
  1. このコードは、指定されたclient_idclient_secretを使用して、WordPress REST APIからOAuthトークンを取得します。
  2. スクリプトの実行とトークンの確認
    • 上記のスクリプトを実行します。
    • 正常に実行されると、アクセストークンがコンソールに表示されます。
  3. APIリクエストのテスト
    • 取得したトークンを使用して、WordPress REST APIに対するリクエストを行い、正しく動作するか確認します。

注意点

  • YOUR_CLIENT_IDYOUR_CLIENT_SECRETは、WordPressのOAuthクライアント設定から取得した実際の値に置き換えてください。
  • トークンURL (token_url) は、実際のWordPress OAuthサーバーのトークンエンドポイントに合わせて変更する必要があります。上記のURLは一例です。

最近のやり方

WordPress5以上になると、プロフィールからユーザーのページに移行し、アプリケーションパスコードを発行して、Pythonで簡単に使用できるようになりました。

必要になってくるのが次の項目になります。

アプリケーションパスワード:プロフィールから下部のアプリケーションパスワードの発行でメモ
ユーザーネーム:管理者の名前(管理者)
サイトのURL:https://あなたのドメイン

となります。

基本的にWordPress REST APIを使用するにあたってはドキュメント等を参照してもらいたいわけです。

記事の自動投稿

さて、当サイトはトレードやマネーに関する情報を掲載するサイトです。

マーケットレポートなどは毎日の単純な作業になります。

これを自動化できないものでしょうか?

十分自動化できます。

作成したPythonコードのHTML出力

今回実行するのは毎日の記録として、米国マーケットの前日比と、主要なニュースを取得して、毎日のマーケットレポートとして出力するということ。

当然すべて日本マーケット、EUマーケットその他に応用することが可能になります。

前日比に関してはこちらのコードを使用しています。

【PYTHON】前日比を取得 / ヒートマップで表示, DF &HTML出力〜セクター別パフォーマンスまで

主要なニュースに関してはNews APIを使って、元ソースを取得し、deeplにて翻訳するプログラムを使います。

これらはすべてHTML出力することによってWordPress REST APIと組み合わせて自動投稿が可能になります。

【コピペOK保存版】NEWS API徹底ガイド~複数のサイトから一括取得してリンク

自動投稿

それぞれ個別に作成したプログラムコードを実行して、print出力せずに格納し、自動投稿の要素として読み込みます。

以下はprogramAとprogramBの自動投稿をシュミレートしたPythonコードです。

pip install requests
import requests
from requests.auth import HTTPBasicAuth

# 設定
username = "あなたの名前(管理者である必要あり)"  # ユーザーネーム
password = "ユーザーからプロフィールの下部から発行してください"  # アプリケーションパスワード
url = "https://あなたのサイトのドメイン/wp-json/wp/v2/posts"

# 投稿内容〜まずはテスト
data = {
    "title": "テスト",
    "content": "テスト記事",
    "status": "publish"
}

# REST APIを使用して投稿
response = requests.post(url, auth=HTTPBasicAuth(username, password), json=data)

# 結果の表示
if response.status_code == 201:
    print("投稿成功!")
    print("投稿された記事のURL:", response.json()["link"])
else:
    print("投稿失敗:", response.status_code)
    print(response.text)

自動投稿をまずはテストしてみましょう。

これで自動投稿ができたはずです。

複数のプログラムコードを走らせる場合

複数のコードを走らせる場合はHTML出力が基本になるかと思います。

HTML出力を定義しているプログラムの場合は変数 html_output_from_code_aを定義していないためにエラーが発生することがあります。

個々のプログラムでは当然print関数を使うと思いますが、自動投稿プログラムの場合は必ず一旦変数に格納してそれを投稿の定義で呼び出すという全体のプロセスをしっかりと把握しておきましょう。

これは、コードA(仮名)の出力を変数に格納していない、コードAの実行が適切に行われません。

問題を解決するために、以下の点を確認してみてください:

  1. コードAの実行確認:コードAが正しく実行されているかを確認し、その出力を html_output_from_code_a という変数に格納しているか確認してください。
  2. 変数のスコープhtml_output_from_code_a がコードA内で定義されている場合、その変数がコードの他の部分からアクセス可能なスコープ内にあることを確認してください。

自動投稿のアドレスとカテゴリー

from datetime import datetime

# 現在の日付を取得(スラグ用にフォーマット)
current_date_formatted = datetime.now().strftime('%Y-%m-%d')

# WordPressへの投稿データ準備
title = f"{current_date_formatted}マーケットレポート"
slug = current_date_formatted  # スラグとして日付を使用
categories = [123]  # 'Report'カテゴリのIDをここに設定(例: 123)

content = f"<h2>前日比</h2>{html_output_from_code_a}<h2>主要なニュース</h2>{html_output_from_code_b}"

# 投稿
data = {
    "title": title,
    "slug": slug,
    "categories": categories,
    "content": content,
    "status": "publish"
}

# 投稿の実行部分は以前と同様
# ...

WordPress側でも設定できますが、プログラム上でも設定できます。

今回だと、マーケットレポートですから、日付が重要になります。

カテゴリーのIDとは!?

WordPressでカテゴリーIDを確認するには、いくつかの方法があります。

以下に簡単な方法をいくつか紹介します。

WordPress管理画面を使用する方法

  1. カテゴリーページにアクセス: WordPressのダッシュボードにログインし、「投稿」->「カテゴリー」に移動します。
  2. カテゴリーのリストを見る: カテゴリーのリストが表示されます。目的のカテゴリーにマウスをホバー(カーソルを合わせる)します。
  3. リンクの確認: マウスをホバーすると、そのカテゴリーの編集、クイック編集、ゴミ箱、表示のオプションが出てきます。ここで「編集」にマウスをホバーし、そのリンクのURLを確認します。URLの末尾に tag_ID=123 のような形式でカテゴリーIDが含まれています。

WordPress REST APIを使用する方法

WordPress REST APIを使用してカテゴリーの一覧を取得し、それぞれのIDを確認することもできます。これを行うには、以下のURLにアクセスします(サイトのURLに合わせて変更してください

WordPressのカテゴリーIDは通常、数値で表されますが、その長さは一定ではありません。

カテゴリーIDが2桁の数字であることは十分あり得ます。

WordPressではカテゴリーが作成されるたびに、システム内部で連続したIDが割り当てられます。

これらのIDは1桁から始まり、サイトによっては数桁にわたることもあります。

もしカテゴリーIDが2桁の数字であることを確認されたならば、それは正しいIDである可能性が高いです。

このIDをスクリプトに使用して、カテゴリーを指定することができます。

例えば、カテゴリーIDが 12 である場合、スクリプト内のカテゴリー指定部分は以下のようになります:

categories = [12]  # 'Report'カテゴリのIDを指定

自動投稿はこのように、タイトルと、アドレス、カテゴリーにわけ、複数のプログラムを実行して投稿する場合もすべてHTMLで出力したものを変数として格納することで、記事が完成します。

SNS各種との連携について

記事の投稿を自動化し、SNSとの連携も自動化できたら最高ですよね。

Twitter

Twitterでの連携の共通部分をまずはクリアしておきましょう。

Twitter APIを設定するプロセスは、複数のステップを含みます。

順番に進めます。

Twitter Developerアカウント

Twitter Developerアカウントにログインしていることを確認してください。

まだアカウントを持っていない場合は、Twitter Developerのウェブサイトでアカウントを作成してください。

アプリケーションの作成

Twitter APIを利用するためには、Twitterアプリケーションを作成する必要があります。

これにより、APIキー、APIシークレットキー、アクセストークン、アクセストークンシークレットが提供されます。

Developerポータルで「Projects & Apps」セクションに移動し、「Create an app」をクリックします。

もし「Create an app」オプションが見当たらない場合、既にプロジェクトやアプリケーションが設定されている可能性があります。

その場合、以下の手順でAPIキーとトークンを取得することができます。

APIキーとシークレットの取得

Twitter Developer Portalの「Projects & Apps」セクションにアクセスし、既存のプロジェクトまたはアプリを選択します。

「Keys and tokens」タブを開きます。

このセクションに、「API Key」と「API Key Secret」が表示されているはずです。

これらを安全な場所にコピーして保存してください。

ベアラートークンの取得

同じ「Keys and tokens」タブで、「Bearer Token」も見つけることができます。

ベアラートークンは、アプリケーション認証に使用されるトークンです。

必要に応じて、これも保存してください。

アクセストークンとシークレットの生成

「Access Token and Secret」セクションに移動します。

「Generate」ボタンをクリックして、アクセストークンとアクセストークンシークレットを生成します。

これらのトークンも、APIとの認証に使用されるため、安全な場所に保存してください。

アプリケーション情報の入力

アプリケーションの名前、説明、およびウェブサイトのURL(持っていない場合は、一時的なものでも構いません)を入力します。

使用目的や機能に関する質問に答えることが求められる場合があります。これは、TwitterがどのようにAPIが使用されるかを理解するためです。

APIキーとアクセストークンの取得

アプリケーションが作成されると、APIキーとAPIシークレットキーが表示されます。

これらを安全な場所に保存してください。

次に、「Keys and tokens」タブに移動し、「Access Token & Access Token Secret」を生成します。

これらも同様に保存してください。

アプリケーションの権限設定

あなたのアプリケーションがツイートを投稿する予定なら、適切なアクセス権限(読み取り、書き込み、ダイレクトメッセージのアクセス)を設定する必要があります。

「Permissions」タブでアプリケーションの権限を「Read and write」に設定します。

Twitterへの投稿プログラム

まず、Pythonプロジェクトで必要なライブラリをインストールする必要があります。

主にrequests(WordPress APIから記事を取得するため)とtweepy(Twitter APIにアクセスするため)を使用します。

pip install requests tweepy

WordPress REST APIを使用して、サイトから記事のリストを取得します。

ここでは、最近の投稿を取得する例を示します。

import requests

def get_wordpress_posts(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        return None

# 例: 'https://yourwordpresssite.com/wp-json/wp/v2/posts'
posts = get_wordpress_posts('YOUR_WORDPRESS_API_ENDPOINT')

取得した記事の中からランダムに一つ選ぶ場合はこのようになります。

import random

def select_random_post(posts):
    if posts:
        return random.choice(posts)
    else:
        return None

selected_post = select_random_post(posts)

tweepyライブラリを使用して、選択した記事をTwitterに投稿します。

import tweepy

def post_to_twitter(api_key, api_key_secret, access_token, access_token_secret, message):
    auth = tweepy.OAuthHandler(api_key, api_key_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)

    try:
        api.update_status(message)
        print("Tweet posted successfully!")
    except Exception as e:
        print("Error during tweeting: ", e)

# Twitter API キーとトークンを使用
api_key = 'YOUR_API_KEY'
api_key_secret = 'YOUR_API_KEY_SECRET'
access_token = 'YOUR_ACCESS_TOKEN'
access_token_secret = 'YOUR_ACCESS_TOKEN_SECRET'

# 投稿するメッセージを作成
if selected_post:
    tweet = f"Check out this post: {selected_post['title']['rendered']} {selected_post['link']}"
    post_to_twitter(api_key, api_key_secret, access_token, access_token_secret, tweet)

WordPressからランダムに記事を選らんで投稿

それでは実際にコードを書いていきます。

import requests
import random
import tweepy

# WordPress APIから記事を取得する関数
def get_wordpress_posts(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        print("Failed to retrieve posts")
        return None

# Twitterに投稿する関数
def post_to_twitter(api_key, api_key_secret, access_token, access_token_secret, message):
    auth = tweepy.OAuthHandler(api_key, api_key_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)

    try:
        api.update_status(message)
        print("Tweet posted successfully!")
    except Exception as e:
        print("Error during tweeting: ", e)

# WordPressサイトのURL
wordpress_api_url = 'https://yourwordpresssite.com/wp-json/wp/v2/posts'

# Twitter API キーとトークン
api_key = 'YOUR_API_KEY'
api_key_secret = 'YOUR_API_KEY_SECRET'
access_token = 'YOUR_ACCESS_TOKEN'
access_token_secret = 'YOUR_ACCESS_TOKEN_SECRET'

# WordPressから記事を取得
posts = get_wordpress_posts(wordpress_api_url)

# ランダムに記事を選択
if posts:
    selected_post = random.choice(posts)
    tweet = f"Check out this post: {selected_post['title']['rendered']} {selected_post['link']}"
    post_to_twitter(api_key, api_key_secret, access_token, access_token_secret, tweet)
else:
    print("No posts found to tweet.")

ここで不思議に思った方もいらっしゃるかもしれません。

WordPressのアプリケーションパスワードを記載する行がない?

WordPressのアプリケーションパスワードが必要かどうかは、あなたがアクセスしようとしているデータの種類と、あなたのWordPressサイトの設定によります。

先述のコード例では、WordPress REST APIを使って公開されている記事を読み取っています。

このケースでは、以下の理由でアプリケーションパスワードは通常必要ありません:

  1. 公開データのアクセス:WordPress REST APIは、デフォルトで公開されているコンテンツ(記事、ページなど)への読み取りアクセスを提供します。これらの情報は公開されているため、追加の認証は不要です。
  2. 非認証リクエスト:サイトの公開データにアクセスするための非認証リクエストは、アプリケーションパスワードを必要としません。この種のリクエストは、Webブラウザやrequestsライブラリなどを通じて簡単に行うことができます。

しかし、もし以下のような場合はアプリケーションパスワードが必要になる可能性があります:

  • 非公開データへのアクセス:非公開の記事やユーザー情報など、限定されたデータにアクセスする場合。
  • コンテンツの作成、編集、削除:WordPressサイト上でコンテンツを操作する場合(例:新しい記事の投稿、既存の記事の編集)。

アプリケーションパスワードは、これらのようなより高い権限が必要な操作に対して、追加のセキュリティレイヤーとして機能します。

つまりエンドポイントさえわかれば、他人が運営するウェブサイトも同様に公開済みの記事であれば投稿できると言うわけです。

エラーとデバッグアプローチ

Error during tweeting: 403 Forbidden 453 – You currently have access to a subset of Twitter API v2 endpoints and limited v1.1 endpoints (e.g. media post, oauth) only. If you need access to this endpoint, you may need a different access level. You can learn more here:

などのエラーが出る場合は多くはアクセスレベルや権限に関することになります。

まずはアプリ自体の権限が読み書きになっているかチェック。

tweepyのバージョン

Twitter API v2とv1.1では、利用できるエンドポイントが異なります。

tweepyライブラリのバージョンによっては、デフォルトで使用しているAPIのバージョンが異なる場合があります。

バージョンをチェックしてください。

pip show tweepy

tweepyバージョン(4.5.0)以降だと、API v1.1とv2の両方をサポートしています。

ただし、具体的にどのエンドポイントを使用しているかを確認する必要があります。

Facebookに自動投稿

WordPressとFacebookに自動投稿するPythonプログラムの基本的なステップをご案内できます。

まず、WordPress APIとFacebook APIを使用するために必要なアクセス権限とトークンを取得する必要があります。

次に、WordPressから記事を取得し、Facebookに投稿するプログラムを書きます。

基本的なコードの構造

import requests
import random

# WordPressから記事を取得
def get_random_wordpress_post(wp_api_url):
    response = requests.get(wp_api_url)
    posts = response.json()
    return random.choice(posts)

# Facebookに投稿
def post_to_facebook(fb_api_url, access_token, message):
    payload = {
        'message': message,
        'access_token': access_token
    }
    response = requests.post(fb_api_url, data=payload)
    return response.json()

# メイン関数
def main():
    wp_api_url = 'https://yourwordpresssite.com/wp-json/wp/v2/posts'
    fb_api_url = 'https://graph.facebook.com/v9.0/me/feed'
    fb_access_token = 'your_facebook_access_token'

    post = get_random_wordpress_post(wp_api_url)
    message = post['title']['rendered'] + "\n" + post['link']

    result = post_to_facebook(fb_api_url, fb_access_token, message)
    print(result)

if __name__ == "__main__":
    main()

Facebook APIの取得方法

Facebookアプリの登録

  1. Facebook Developersウェブサイトにアクセス: Facebook for Developersにアクセスしてログインします。アカウントがない場合は作成します。
  2. 新しいアプリの作成: 「My Apps」メニューから「Create App」を選択します。
  3. アプリタイプの選択: 用途に応じて適切なアプリタイプを選びます。一般的には「Consumer」が適していることが多いです。
  4. アプリの詳細の入力: 必要な情報(アプリ名、連絡先メールアドレスなど)を入力します。
  5. アプリIDの取得: アプリが作成されると、アプリIDが割り当てられます。これはAPIを使用する際に必要です。

必要な製品の追加

  1. ダッシュボード: アプリのダッシュボードで「製品の追加」を選択します。
  2. Facebook Loginの設定: 「Facebook Login」を追加し、その設定を行います。ここで、OAuthリダイレクトURIを設定する必要があります。

アクセストークンの取得

  1. Graph API Explorer: FacebookのGraph API Explorerを使用してアクセストークンを取得します。
  2. アクセストークンの生成: 必要なパーミッションを選択し、「アクセストークンを生成」をクリックします。
  3. パーミッションの確認: アプリがユーザーデータへのアクセスを要求する場合、Facebookの審査プロセスを通過する必要があります。

注意点

  • セキュリティ: アクセストークンは機密情報です。安全に保管し、不正利用されないようにしてください。
  • アクセス権限: 必要なアクセス権限のみを要求し、ユーザーのプライバシーを尊重してください。
  • 審査プロセス: 特定のパーミッションはFacebookによる審査を必要とします。アプリが公開される前にこのプロセスを完了する必要があります。
  • ポリシーの遵守: Facebookのプラットフォームポリシーと利用規約を遵守してください。

プログラムの定時実行とデプロイ

今回の筆者のような用途の場合、毎週火曜日から土曜日の朝(日本時間)7時を定時としてプログラムを実行すれば、前日比と主要ニュースの投稿は自動化できるわけですよね。

そうすると、自分でプログラムを実行させるボタンをクリックするのでさえ面倒になります。

デプロイして定時実行したら半永久(API等のメンテナンスを除く)に毎日の米国マーケットのデータを自動投稿できると言うわけです。

デプロイに関しては是非こちらの記事を参照してください。

【保存版】PYTHONプロジェクトをデプロイするための環境10選

こういう目的にプログラムですので、ラズパイやM5よりも、WEB上のデプロイサービスの方がおすすめです。

上部へスクロール