文字っぽいの。

文字を書いています。写真も混ざります。

WordPressにOAuth認証してRubyでREST APIを叩いて記事投稿する。

やりたいこと

  • WordPressREST APIを使って記事を更新したい
  • 認証方法にはBasic認証ではなく、OAuthを使いたい
    • 公式ドキュメントでも開発やテスト以外でBasic認証は使うなと言っている
    • Note that this plugin requires sending your username and password with every request, and should only be used for development and testing i.e. not in a production environment.

手順

OAuth用のプラグインを入れる

wordpress.org

このプラグインを入れるだけでOK

アプリケーションを登録する

WP管理画面のメニューの[ユーザー] > [Applications] を開く

f:id:FromAtom:20220129180754p:plain

こういった画面が表示されるので、中身を入力していく。

f:id:FromAtom:20220129181004p:plain

  • Consumer Name
    • アプリの名前。なんでも良い。
  • Description
    • わかりやすい説明。自分で後からなにに使っているか分かるように書いておく。
  • Callback
    • 自分のWPサイトのドメインに変更してCallback先を指定しておく。
    • 例えば https://example.com/ というドメインなら https://example.com/successhttps://example.com/callback などと指定する。successcallback はかぶらなければ何でも良さそう
    • 後で使うのでメモっておく

入力が終わって Add Consumer ボタンを押すと

f:id:FromAtom:20220129181536p:plain

Client KeyClient Secret が表示される。これは後で使うのでメモっておく。他人には知られないようにする。

RubyでAccessTokenを取得する

Gemfileはこう

source "https://rubygems.org"

gem "oauth"

メインのコードはこんな感じ

require 'oauth'
require 'readline'

CONSUMER_KEY = 'XXXXX'
CONSUMER_SECRET = 'XXXXXXXXXXXX'

WP_OAUTH_ENDPOINT = 'https://[あなたのWPドメイン]/'
REQUEST_TOKEN_PATH = '/oauth1/request'
AUTHORIZE_PATH = '/oauth1/authorize'
ACCESS_TOKEN_PATH = '/oauth1/access'
CALLBACK_URL = 'https://[あなたのWPドメイン]/success'

consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => WP_OAUTH_ENDPOINT, :request_token_path => REQUEST_TOKEN_PATH, :authorize_path => AUTHORIZE_PATH, :access_token_path => ACCESS_TOKEN_PATH)
request_token = consumer.get_request_token(oauth_callback: CALLBACK_URL)

puts '下記のURLにアクセスして認証を行う。`oauth_verifier` というクエリパラメータがあるのでコピペして入力する。'
puts request_token.authorize_url

oauth_verifier = Readline.readline("oauth_verifier >")

access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier)

puts "token: #{access_token.token}"
puts "secret: #{access_token.secret}"

メモっておいた CONSUMER_KEY, CONSUMER_SECRET, CALLBACK_URL を入力してから実行する。

REQUEST_TOKEN_PATH などでPathを変えているが、これは https://[あなたのWPドメイン]/wp-json にアクセスすると取得できるJSONの "authentication" > "oauth1" に記載されているので、うまく動かない場合は確認すると良い。

このコードを実行するとTokenとSecretが取得されて表示されるので、あとはそれを利用してREST APIを叩けば良い。

WPのREST APIを叩いて新規投稿する

上で生成した consumeraccess_token をそのまま利用する。

require 'typhoeus'
require 'oauth/request_proxy/typhoeus_request'

hydra = Typhoeus::Hydra.new
uri = 'https://[あなたのWPドメイン]/wp-json/wp/v2/posts/'
oauth_params = { consumer: consumer, token: access_token, request_uri: uri }

data = { title: "タイトルです", content: "記事の本文です" }
req = Typhoeus::Request.new(
    uri,
    method: :post,
    params: data
)

oauth_helper = OAuth::Client::Helper.new(req, oauth_params.merge(request_uri: uri))
req.options[:headers]["Authorization"] = oauth_helper.header
hydra.queue(req)
hydra.run
response = req.response

これで新しい記事が下書き状態で追加される。最初から公開状態にしたり、CategoryやTagを追加することもできる。詳しいAPIの使い方やパラメータは、公式のハンドブックを見ると良い。

developer.wordpress.org