Rubyで実践 OAuth in Twitter
というコトで前回のエントリに引き続き, OAuthです. 今度はコードを書き, OAuthを用いてTwitterのユーザータイムラインを取得してみようと思います.
コードはGitHubの方に置いてみました. 初めてのGitHubわくわくです.
ちなみにターミナルから起動します. GitHubの方にはREADMEすら置いていないのであしからず.
$ ruby examples/twitter.rb
以下手順を追っていきますが, コードを部分ずつにわけて載せています. 全部が見たい人はGitHubの方で見てみてください.
認証トークンを取得する
consumer = OAuth::Consumer.new CONSUMER_KEY, CONSUMER_SECRET, { :signature_method => OAuth::SignatureMethod::HMAC::SHA1 } request_token = consumer.get_token REQUEST_TOKEN_URL puts "Request token: #{request_token.token}" puts "Request token secret: #{request_token.secret}"
まずコンシューマのキーと秘密の文字列でコンシューマオブジェクトを生成. Twitterは今のところ, signature_methodとしてHMAC-SHA1しか対応していないので, それも指定.
そしてOAuth::Consumer#get_tokenで認証トークンを取得.
Request token: REQUEST-TOKEN Request token secret: REQUEST-TOKEN-SECRET
ユーザーを認証する
%x{open #{AUTHORIZE_URL % request_token.token}} puts 'Press enter key after allowed.' gets
最初に断っておきますと, openを使っているのでMac OS Xでしか動きません(たぶん). まぁAUTHORIZE_URL % request_token.tokenの結果を出力して, 手動でアクセスしてあげれば問題はないはず.
puts AUTHORIZE_URL % request_token.token puts 'Press enter key after allowed.' gets
このアクセスしたページでユーザーの認証と, リソースへのアクセス許可をもらう. Callback URLで指定したURLに飛ぶがそれは無視して, Enterキーを押す.
アクセストークンを取得する
consumer.token = request_token access_token = consumer.get_token ACCESS_TOKEN_URL puts "Access token: #{access_token.token}" puts "Access token secret: #{access_token.secret}" unless access_token.empty? puts 'Optional values:' access_token.each_pair {|key, value| puts " #{key} => #{value}"} end
さっき取得した認証トークン(request_token)をコンシューマにセット. 再度get_tokenを行い, 今度はアクセストークンを取得. ちなみにTwitterはこのとき付随的な情報として認証されたユーザーのuser_idとscreen_nameも返す. OAuthの仕様書を読んでいないが, こういうコトもできるという認識でOK?
Access token: ACCESS-TOKEN Access token secret: ACCESS-TOKEN-SECRET Optional values: user_id => 14976270 screen_name => takkkun
サービスプロバイダ上のリソースにアクセスする
consumer.token = access_token response = consumer.get 'http://twitter.com/statuses/user_timeline.json' puts response.code puts response.body
取得したアクセストークンをコンシューマにセットし, 任意のリソースにリクエストを送る. 今回はユーザータイムラインを取得.
200 [{"text":"\u3055\u3063\u304d\u304b\u3089\u4e0b\u307e\u3076\u305f\u306b\u76ee\u85ac\u3057\u3066\u308b", ~
ちなみにアクセストークンとシークレットを保存しておけば, 次から認証トークンの取得からアクセストークンの取得のステップを飛ばして, いきなりリソースへのアクセスを行うコトができる.
consumer = OAuth::Consumer.new CONSUMER_KEY, CONSUMER_SECRET, { :signature_method => OAuth::SignatureMethod::HMAC::SHA1, :token => OAuth::Token.new('ACCESS-TOKEN', 'ACCESS-TOKEN-SECRET') } response = consumer.get 'http://twitter.com/statuses/user_timeline.json' puts response.code puts response.body
出力は上記と同じ.
取れました
というコトでOAuthによるリソースの取得ができました. 手順を追うといっても上っ面だけなので, 中で何をして, どんなリクエストを送っているかはoauth.rbでも見ていただければわかると思います.
さすがにいろいろ読んだし, コードも書いたので, 最初の流し読みのときよりもかなり理解が深まったかなー.