Rubyで実践 OAuth in Twitter

というコトで前回のエントリに引き続き, OAuthです. 今度はコードを書き, OAuthを用いてTwitterのユーザータイムラインを取得してみようと思います.

コードはGitHubの方に置いてみました. 初めてのGitHubわくわくです.

OAuth examples

ちなみにターミナルから起動します. 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でも見ていただければわかると思います.

さすがにいろいろ読んだし, コードも書いたので, 最初の流し読みのときよりもかなり理解が深まったかなー.