at posts/single.html

Ruby で OAuth を使ってみた (3)

RubyのOAuthライブラリが動くようになったので、Twitterへの接続用ライブラリ OAuth::Twitter を作ってみた。

使い方はこんな感じ。

require 'oauth/twitter'

# consumer_keyとconsumer_secretはTwitterのページで事前に取得
tw = OAuth::Twitter.new(consumer_key, consumer_secret)
# リクエストトークンを取得
req_token = tw.request_token
# このURI (twitterの認証(認可?)ページ) へユーザをリダイレクトさせる
uri = tw.authorize_url(req_token)

# 以下はユーザの認可後に実施する。認可前にやると403 Forbiddenになる。
access_token = tw.access_token(req_token)

これでTwitter APIにアクセスするためのトークンが取得できる。 OAuth::Twitterの中身は以下の通り。Twitter以外のサービスでもuriを変えれば使えるはず。

require 'oauth'
require 'oauth_token'
require 'oauth_request'
require 'oauth_consumer'
require 'oauth_signature'
require 'base64'
require 'uri'
require 'openssl'

require 'open-uri'

module OAuth
  class Twitter
    attr_accessor :request_token, :secret_token

    def initialize(consumer_key, consumer_secret)
      @consumer = OAuth::Consumer.new(consumer_key, consumer_secret)
    end

    def request_token
      uri = "http://twitter.com/oauth/request_token"
      get_token(uri)
    end

    def authorize_url(token, callback = nil)
      url = "http://twitter.com/oauth/authorize"
      url << "?oauth_token=#{token.token}"
      url << "&oauth_callback=#{callback}" if callback
      url
    end

    def access_token(request_token)
      uri = "http://twitter.com/oauth/access_token"
      get_token(uri, request_token)
    end

    def get_token(uri, token = nil)
      params = {
        :method => 'GET',
        :uri => uri,
        :parameters => { :oauth_version => '1.0' }
      }
      req = OAuth::Request.new(@consumer, token, params)
      query = req.parameters.map {|k,v|
        "#{k}=#{v}" unless v.empty?
      }.compact.join("&");
      res = {}
      open("#{uri}?#{query}").readlines.first.split('&').each do |item|
        key, val = item.split('=')
        res[key] = val
      end
      OAuth::Token.new(res['oauth_token'], res['oauth_token_secret'])
    end
  end
end