Ruby で Twitter の OAuth を使うサンプル

Ruby で OAuth 認証を行うための OAuthSimple というライブラリを公開しました。 よろしければご利用ください。
前の記事 において Twitter OAuth 認証の Request Token を取得するサンプルコードを Ruby で書きましたが、さらに Twitter の OAuth 認証を利用するためのライブラリを Ruby で書いてみたので公開しておきます。

OAuth の勉強する時に参考になればと思います。 OAuth の勉強は OAuth Core 1.0 Revision A を読むのが一番わかりやすいと思うんで、それで勉強しつつ具体例をこのライブラリの中身を見る、という感じで。

VCTwitter::OAuth モジュール

下記が今回作成したライブラリです。

VCTwitter::OAuth モジュールの中には

  • VCTwitter::OAuth::Agent クラス
  • VCTwitter::OAuth::ParameterList クラス

が含まれています。

VCTwitter::OAuth::Agent オブジェクトを使用して Request Token や Access Token の取得、さらに Twitter への OAuth を介した GET メソッド、POST メソッドによるアクセスを行う事ができます。 VCTwitter::OAuth::ParameterList オブジェクトは GET メソッドや POST メソッドでアクセスする時にパラメータを VCTwitter::OAuth::Agent オブジェクトに渡すために使用します。 まあ詳しい動きなどは中身を見てもらえれば。

サンプル

VCTwitter::OAuth モジュールを使用して Access Token を取得するサンプルです。 Application Type は Client を想定してます。 (Application Type が Browser である Consumer Key で以下のサンプルを実行すると多分 "callback_url に oob を指定できるのは Client だけ!" みたいなエラーが出ると思います。)

#! /usr/bin/ruby1.9
# -*- coding: utf-8 -*-

STDOUT.set_encoding( Encoding.locale_charmap )

# vc_twitter_oauth.rb を Load path 以外の場所に置いた場合, 
# vc_twitter_oauth.rb へのパスを $LOAD_PATH に追加する必要がある
#$LOAD_PATH.push( "xxx" )

# vc_twitter_oauth.rb の読み込み
# これで VCTwitter::OAuth::ParameterList と VCTwitter::OAuth::Agent を使えるようになる
require "vc_twitter_oauth"

# Consumer Key と Consumer Secret の設定
consumer_key    = "XXXXXXXXXXXXXXXXXXXX"
consumer_secret = "XXXXXXXXXXXXXXXXXXXX"

# とりあえず VCTwitter::OAuth::Agent オブジェクトを取得
agent = VCTwitter::OAuth::Agent.new( consumer_key, consumer_secret )

# Request Token 取得 (引数 "oob" は callback_url なしの指定)
# 返り値として, req_pair には 2 つの要素を持つ Array オブジェクトが代入される.
# 1 つ目の要素が request_token を表す String, 2 つ目が request_token_secret を表す String.
req_pair = agent.obtain_request_token( "oob" )

# ユーザには Twitter の OAuth 認証ページにアクセスさせ, 暗証番号を入力させる
puts "http://twitter.com/oauth/authorize?" + 
      VCTwitter::OAuth::ParameterList.new( { "oauth_token" => req_pair[0] } ).
      to_query_string() + " にアクセスして暗証番号を取得し, 入力してください."
print "暗証番号 : "
verifier = STDIN.gets().chomp()

# 入力してもらった暗証番号で, Access Token を取得
acc_pair = agent.obtain_access_token( verifier )
p "Access token と Access token secret", acc_pair
token = acc_pair[0]
token_secret = acc_pair[1]

# このまま agent を使用して get や post もできるし,
# 取得した token と token secret を保存しておき, 次回からは
# agent = VCTwitter::OAuth::Agent.new( consumer_key, consumer_secret, token, token_secret )
# という風にインスタンス化できる.

# そのまま get を行う
puts agent.get( "twitter.com", "/statuses/mentions.xml" )

# 新たに VCTwitter::OAuth::Agent オブジェクトを生成し, get を行う
other_agent = VCTwitter::OAuth::Agent.new( consumer_key, consumer_secret, token, token_secret )
puts other_agent.get( "twitter.com", "/statuses/mentions.xml" )

exit 0

追記 【2009-12-11 02:22 JST

このモジュール内では Ruby ライブラリ openssl を使用しているのですが、環境によっては openssl がインストールされていない事もあるようです。

Ubuntu 9.10 (Karmic) の場合について、openssl のインストール方法 を書きましたので、openssl がインストールされていない場合は参考にしてください。