まとめ:最後の方にあるソース全体読んだほうがはやいです
はじめに
ちょっと前から作ってたemacs拡張で、Rubyでevernote_oauthというgemを使ってEvernoteを触っています。そのあたりのことをまとめて書いておこうと思い。とりあえずEvernoteにアクセスするためのトークンの取得までの自分のやり方をまとめました。トークン使ってEvernoteを操作うんぬんは別の記事に書く予定。(長いから)書きました→ http://qiita.com/items/ac05dee1c45c1543ed00
用語について
リクエストトークンとかアクセストークンとか色々用語が出てくるので、それぞれについて細かいことは公式のドキュメントを参照。ちなみに、この記事でいう「トークン」は、上記ページでの「OAuth トークンクレデンシャル ID」のことです。
トークン取得までの流れ
EvernoteはOAuth認証を使っています。OAuthを使わないやり方は、デベロッパトークンを使う他はないようです(OAuthになる前はできたらしい)。そんなわけで、ユーザ(自分含め使う人)にEvernoteへの権限を許可してもらいます。許可してもらうと、Evernoteにアクセスするためのトークンが取得できます。それを使ってEvernoteにアクセスします。
トークン取得するまでの流れとしてはざっくり言うとこんな感じです。
- ソフトウェア作成者はEvernoteにAPIキーをもらう
- ユーザに権限を許可してもらうためのWebアプリケーションを作り、入り口となるページにアクセスしてもらう(これとは別にトークンを表示するためのページも作る)
- 権限を許可してもらうためのURL(以下、認証用URL)をユーザに開いてもらって、権限を許可してもらう
- トークン表示のページでEvernoteにアクセスするためのトークンを表示する
トークン表示のページを作る関係で、(たとえWebアプリケーションを作ってないにしても)Webアプリケーションを作ります。ここではSinatraを使ってやります。Sinatraで作るのは、入り口となるページ(認証用URLを表示するところ)とトークン表示のページです。トークン表示のページは認証用URLにコールバック用ページとしてパラメータで指定します。私はWebアプリケーションを作ってはいないのでこれだけです。Webアプリケーションの場合は作ってるアプリケーションに対して追加する格好になるような気がします。
この手順を踏まずにやる(デベロッパトークンでやる)方法は記事の最後でほんのり触れます。
次から実際にAPIキーをもらうところを書いていきます。
APIキーをもらう
とにもかくにもAPIキーをもらいます。なお、この時点でアプリケーション名やアプリケーションの説明が必要です。(説明は2行ぐらい書いた記憶がある)
http://dev.evernote.com/intl/jp/ にアクセスして、右上にある「API KEYの取得」ボタンを押します。出てくるフォームを埋めて「キーの申請」ボタンを押します。ここでアプリケーション名や説明が必要です。
申請した後、メールでAPIキー(consumer keyやconsumer secret)が送られてきます。どれくらいの時間で送られてくるのかはわかりませんが、私のときはその日じゅうに来ました。
Webアプリケーションの作成
SinatraでWebアプリケーションを作ります。Webアプリケーション内でAPIキーを使って認証用URLを作成します。この認証用URLにはコールバックのURLについての情報が必須で、このコールバック先のURLに、Evernoteがトークンを取得するのに必要なパラメータを付属します。その認証用URLにユーザにアクセスしてもらいます。そのページで認証してもらった後に表示されるコールバック先ページ(前述のトークン表示のページ)にて、パラメータを用いてトークンを表示します。
つまり、入り口にアクセス→認証用URLにアクセス→権限を許可→コールバック先ページが開かれてトークンを表示、という流れをユーザにしてもらうために作ります。
まず入り口のページ。ユーザにはここにまずアクセスしてもらいます。
require "sinatra"
require "evernote_oauth"
require "haml"
use Rack::Session::Cookie,
:key => "rack.session",
:domain => "localhost",
:path => "/",
:expire_after => 3600,
:secret => SecureRandom.hex(32)
get "/" do
client = EvernoteOAuth::Client.new(
:consumer_key => "your consumer key",
:consumer_secret => "your consumer secret",
:sandbox => true
)
callback_url = "#{request.url}callback"
request_token = client.request_token(:oauth_callback => callback_url)
session[:request_token] = request_token
@authorize_url = request_token.authorize_url
haml :index # ここで@authorize_urlを表示している
end
まずAPIキーと、sandboxかどうかを引数にEvernoteOAuth::Clientオブジェクト(client)を作ります。
Evernoteから送られてくるAPIキーは本番用ではなく、練習用(sandbox用)のものなので、ここでは:sandbox => true
です。そのため、普通に登録するEvernoteのアカウントでは使えません。Sandbox用のアカウントを作成する必要があります。[1] [2]
[1]: アカウント作成方法はAPIキーをもらったメールに書いてあるのでそちらを参照。やることは普通のEvernoteアカウント作成と変わりません。
[2]: 本番用がほしい場合は開発者サポートから「APIキーの有効化」に進んでください。でもしばらく砂場から出ないほうが安全です。
その後、コールバック先ページのURL(callback_url)を用意します。認証された後はこのページが開かれます。で、このURLを:oauth_callbackとしてclient#request_token
に渡します。ここで返ってくるリクエストトークン(request_token)はコールバック先ページでも使うのでsessionに保存します。
認証用URLはrequest_token#authorize_url
で取得できます。テンプレートではこのURLをリンクにして表示しています。(テンプレートは後述します)
コールバック先でトークンを取得
入り口用ページができたのでコールバック先ページ。先ほどのcallback_urlで書いたとおり、/callbackをgetしたときの挙動として書きます。
以下、サンプル。
get "/callback" do
request_token = session[:request_token]
verifier = params[:oauth_verifier]
access_token = request_token.get_access_token(oauth_verifier: verifier)
@token = access_token.token
haml :callback # ここでトークンを表示している
end
:oauth_verifierというパラメータを取得します。request_token#get_access_token
にこのパラメータを渡すと、今度はアクセストークンというものが得られます(access_token)。access_token#token
が今回必要なトークンです。そいつを:callbackテンプレートで表示しています。テンプレートは後述。
これで、入り口にアクセス→認証用URLにアクセス→権限を許可してもらう→コールバック先ページが開かれてトークンが表示される、という流れが実現できます。
ソース全体
テンプレート込みの、Webアプリケーション全体のコード。これをちょっと(APIキーとか)書き換えたやつを実際に使っています。
# -*- coding: utf-8 -*-
require "sinatra"
require "evernote_oauth"
require "haml"
use Rack::Session::Cookie,
:key => "rack.session",
:domain => "localhost",
:path => "/",
:expire_after => 3600,
:secret => SecureRandom.hex(32)
get "/" do
client = EvernoteOAuth::Client.new(
:consumer_key => "your consumer key",
:consumer_secret => "your consumer secret",
:sandbox => true
)
callback_url = "#{request.url}callback"
request_token = client.request_token(:oauth_callback => callback_url)
session[:request_token] = request_token
@authorize_url = request_token.authorize_url
haml :index
end
get "/callback" do
request_token = session[:request_token]
verifier = params[:oauth_verifier]
access_token = request_token.get_access_token(oauth_verifier: verifier)
@token = access_token.token
haml :callback
end
__END__
@@ layout
!!!
%html(lang="ja")
%head
%meta(charset="UTF-8")
%title #{@page_title}
%body
= yield
@@ index
- @page_title = "Authorize my app"
%p
%a(href=@authorize_url)<Click to authorize my app
@@ callback
- @page_title = "Your token for Evernote access"
%p
Your token is:
%form
%input(type="text" value=@token size=40)
英語がおかしいですね!
おわりに
デベロッパトークンを使うと、今回の手順をすっとばしてEvernoteをRubyから操作できます。ただ、そのトークンを使うとなんでもできるので扱いには注意、というやつです。
デベロッパトークンを取得するにはデベロッパトークンについてのページからリンクを踏んでアカウント作ったりするともらえるはず(やり方忘れた)。
ところでこれって、デスクトップアプリケーション作りたい場合もいちいちこれをしないとあかんのでしょうか……。デスクトップだけで完結するか、もしくはトークンを表示する何がしかがあると便利なんだけどなあ。
(130522 22:11 追記)
トークン使ってノートを作ったり更新したり検索したりする方法を書きました→ http://qiita.com/items/ac05dee1c45c1543ed00