Posted at

Wordpress.comのREST APIで投稿済みエントリーを更新してみる

More than 5 years have passed since last update.


手順


  1. Client idとClient Secretを発行してもらう

  2. access tokenを取得する

  3. REST APIを使う


Client idとClient Secretを発行してもらう



  1. https://developer.wordpress.com/apps/ から Create New Application する

  2. フォームを埋める

Redirect URIについて:

access token取得作業中、wordpress.comからリダイレクトされる先を指定します。

リダイレクトを受ける事ができなくとも、access tokenを取得する事は可能です。(文末のsinatraコードを使えば、この辺の作業は楽になります)

リダイレクトが受けられない場合は、存在しないURIを記載しておきましょう。(自己責任)


access tokenを取得する



  1. https://public-api.wordpress.com/oauth2/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=code にブラウザでアクセス

  2. アプリケーション認証画面でAuthorizeする


  3. REDIRECT_URI+code=XXXXというURIにリダイレクトされる


  4. https://public-api.wordpress.com/oauth2/token上記のcode等をPOSTし、access tokenを取得する

Redirect URIについて:

3の時、存在しないURIが指定されていた場合は、当然ブラウザアクセスができません。

しかし、ブラウザのロケーションバーのcodeが取得できれば、4でPOSTする事は可能です。


REST APIを使う

POST_IDの内容を、標準入力からの入力内容で上書きします

require 'net/http'

require 'uri'
require 'date'

access_token = ACCESS_TOKEN
site = SITE_NAME
post_id = POST_ID

token_type = 'bearer'
bd = {content: STDIN.read, date: DateTime.now.iso8601}

uri = URI.parse("https://public-api.wordpress.com/rest/v1/sites/#{site}/posts/#{post_id}?pretty=1")
req = Net::HTTP::Post.new(uri.request_uri)
req['authorization'] = "#{token_type} #{access_token}"
req.set_form_data(bd)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
#http.set_debug_output STDERR
res = http.start{|h| h.request(req)}
STDERR.puts res.body


access token取得用 sinatra

文中 access tokenを取得する を行うSinatraコードです

require 'sinatra'

require 'net/http'
require 'uri'

# lookup on https://developer.wordpress.com/apps/
bd = { client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
redirect_uri: 'http://localhost:4567/oauth2'}

get '/' do
"https://public-api.wordpress.com/oauth2/authorize?client_id=#{bd[:client_id]}&redirect_uri=#{bd[:redirect_uri]}&response_type=code"
end

get '/oauth2' do
bd.merge!(code:params[:code], grant_type:'authorization_code').to_s
uri = URI.parse('https://public-api.wordpress.com/oauth2/token?pretty=1')
req = Net::HTTP::Post.new(uri.request_uri)
req.set_form_data(bd)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.set_debug_output $stderr
res = http.start{|h| h.request(req)}
res.body
end