Yoで学ぶはじめてのAPI開発

Yoしてますか。

どうやら、Yo APIとやらがある模様。遊んでみます。Yoされたら、ツイッターでやぁするやつを作ってみます。 #ちょっと何言ってんのか

今回は、YAHYAHWORKSにYoすると、@yahyahworks がナンカ言うやつを作ります。

heroku アプリケーションを作成

heroku create ppworks-yo

悲しい事故が起きないようにremoteの名前を変えておく。

git remote rename heroku ppworks-yo

これは、複数のherokuアプリケーションを管理していることを考慮して

間違えて別のローカルリポジトリから意図せずherokuにpushしてしまう

ことを防ぐためです。git push heroku master でリリースできるのは便利なのですが、herokuのどのアプリケーションにdeployしようとしているかのコンテキストが今いるローカルリポジトリになってしまうので、上記のような悲しい事故が起こりがち。であればコマンドにコンテキストを持たせようという考えです。

今回のアプリであれば、以下のようにdeploy出来るようになるわけです。

git push ppworks-yo master

twitter アプリ作成

https://dev.twitter.com/ へアクセスしてログイン。https://apps.twitter.com/ から「Create New App」を選択。

ナンカ適当に埋める。

f:id:naoto5959:20140724094533p:plain

permissonを Read and Write に変更する。

f:id:naoto5959:20140724094544p:plain

更新しても Read Only のままで意味わからないけど、少し経てば反映されるので我慢する。

API Keys にあるAPI key, API secretをメモ。「Create my access token」からアクセストークンを作成。これまたすぐに表示されないのでつらいけど我慢する。少しすると、Your access token というところに、 Access tokenAccess token secret が表示されるのでメモ。Access levelがRead and writeとなっていることを確認。

f:id:naoto5959:20140724075505p:plain

Yo callback用のapi 作成

Yoが来たらtwitter gemを使ってメッセージを返すコードです。コードは、ppworks/ppworks-yoに置いてあります。

大したことしないsinatraでいいかなと思います。credentialは環境変数に持たせたいのでdotenvというgemを使います。.envファイルに書いた内容を環境変数に展開してくれる便利なgemです。twitterへのアップデートはずばりそのままtwitterというgemを使います。

require 'sinatra'
require 'twitter'
require 'dotenv'

set server: 'webrick' # twitter gemを使うと、これが必要になる
Dotenv.load

get '/:yo_callback_path' do
  return status 400 unless params[:username] # username parameterがない場合は Bad Requestとして扱う
  return status 400 unless params[:yo_callback_path]==ENV['YO_CALLBACK_PATH'] # Yoに設定したパスは開発者しか知り得ないはずなのでそれが一致しない場合はBad Request
  client = Twitter::REST::Client.new do |config|
    config.consumer_key        = ENV['API_KEY']
    config.consumer_secret     = ENV['API_SECRET']
    config.access_token        = ENV['ACCESS_TOKEN']
    config.access_token_secret = ENV['ACCESS_TOKEN_SECRET']
  end
  message = ENV['MESSAGES'].split(',').sample # 環境変数MESSAGES内の候補をランダムに抽出
  client.update "#{message} #{params[:username]}さん" # twitterでつぶやく
end

specはこんな感じ。

App
  API access
    has YO_CALLBACK_PATH
      has username parameter
        should be ok
      has no username parameter
        should eq 400
    has invalid YO_CALLBACK_PATH
      has username parameter
        should eq 400
      has no username parameter
        should eq 400
    has no YO_CALLBACK_PATH
      has username parameter
        should eq 404
      has no username parameter
        should eq 404

herokuにdeploy

環境変数にcredentialを設定します。YO_CALLBACK_PATHは推測しずらい適当な文字列を設定してください。後ほど使います。

pwgen -s 12

の結果とか。

  • API_KEY: 前述のtwitter API key
  • API_SECRET: 前述のtwitter API secret
  • ACCESS_TOKEN: 前述のtwitter アカウントの Access token
  • ACCESS_TOKEN_SECRET: 前述のtwitter アカウントの Access token secret
  • YO_CALLBACK_PATH: あとでYO API設定で設定するcallbackのパス。
heroku config:set \
API_KEY=your_api_key \
API_SECRET=your_api_secret \
ACCESS_TOKEN=your_access_token \
ACCESS_TOKEN_SECRET=your_access_token_secret \
MESSAGES='message1,message2' \
YO_CALLBACK_PATH ='api_path'
heroku config

してみて、設定されていればokです。

git push ppworks-yo master

YOのapiアカウントを作る

f:id:naoto5959:20140724093200p:plain

YO API用のユーザー名と、そのユーザーにYOが来た時に呼び出すURLなどを指定します。YOが来た時に呼び出すURLは今回作って herokuにdeployしたもの + 先ほど設定したYO_CALLBACK_PATHです。

例えば、herokuアプリケーション名がppworks-yo、YO_CALLBACK_PATHをFDolzFF97a12にしていた場合は、https://ppworks-yo.herokuapp.com/FDolzFF97a12 となります。

YOしてみる

f:id:naoto5959:20140724100741p:plain

出来た。

Sinatra: Up and Running: Ruby for the Web, Simply

Sinatra: Up and Running: Ruby for the Web, Simply