April 7, 2009

ruby で OAuth を使ってみる実験

ruby で OAuth を使ってみる実験です。

twitter にアプリケーションを登録

まず twitter に自分の作ったアプリケーションを登録します。
自分のアプリケーションが無い場合でも適当なのでいけるんじゃないんでしょうか。
設定画面(Settings)の以下のリンク(丸で囲んだところ)からアプリケーションの登録画面に辿り着けるはずです。

registration

登録画面はこんな感じです。

registration2

登録すると以下のような画面が見れて、「Consumer key」と「Consumer secret」というのが発行されているのがわかります。

registration3

この「Consumer key」と「Consumer secret」を使って認証処理を行います。

oauth をインストール

oauth ライブラリを gem でインストールします。

sudo gem install oauth

irb で実験

irb で実験してみます。

% irb

まず、irb 上で以下を実行してください。

require 'rubygems'
require 'oauth'

consumer = OAuth::Consumer.new(
  "< Consumer key >",
  "< Consumer secret >",
  :site => "http://twitter.com"
)
request_token = consumer.get_request_token
puts request_token.authorize_url

処理に少し時間がかかるかもしれませんが、最後に URL が出力されるはずです。
この irb はまた後で使うので、終了せずにそのまま置いといてください。
出力された URL にアクセスすると以下のような画面が出てくると思います。

registration4

深く考えずに「Allow」をクリックしましょう。
その後、irb に戻り、以下を実行してください。

access_token = request_token.get_access_token

以上で twitter.com での OAuth による認証は完了です。
内部的には「Consumer key」と「Access token」の交換みたいなことが行われています。
取得した「Access token」の情報(token と token_secret の二つ)をアプリケーション側で保持しておけばいつでも認証を通してのアクセスができます。

試しに twitter に何かメッセージをポストしてみましょう。
以下を実行してみてください。

access_token.post('/statuses/update.json', :status => 'test for oauth')

うまく行きましたか?
http://twitter.com/ にアクセスしてみて、ちゃんとメッセージが投稿されていれば実験成功です。

rubytter の OAuth 対応の話

ちなみに、rubytter の OAuth 対応を昨日行いました。
上記で取得した「access_token」を OAuthRubytter というクラスに渡して new すると Rubytter と同じインターフェイスで OAuth な rubytter が楽しめます。

例:

r = OAuthRubytter.new(access_token)
r.update('Hello OAuth!!')
February 14, 2009

Rubytter

Rubytter は Ruby で書かれたシンプルな Twitter ライブラリです。
Twitter API を Ruby から利用しやすいようにラップしているだけで、それ以外のことは何もしていません。
現状、API のほとんどのメソッドに対応してます。

インストール方法

gem で簡単にインストールできます。

sudo gem install rubytter

開発に使っている GitHub から直接 gem をインストールすることもできます。

gem source -a http://gems.github.com
sudo gem install jugyo-rubytter

ソースコード

http://github.com/jugyo/rubytter

使い方

Rubytter の使い方は非常にシンプルで簡単です。

まず始めに Rubytter のインスタンスを作ります。
その際、引数に Twitter のログインID(ユーザーID or メールアドレス)とパスワードを指定します。

rubytter = Rubytter.new('login_id', 'password')

メッセージの投稿には update メソッドを使います。

rubytter.update('ただいまー!')

タイムラインの取得には friends_timeline メソッドを使います。

client.friends_timeline.each do |status|
  puts "#{status.user.screen_name}: #{status.text}"
end

タイムライン取得時に一度に取ってこれるデータ件数は 20 件で、ページを指定することで 20 件以降のデータを取ってくることができます。

client.friends_timeline(:page => 2).each do |status|
  puts "#{status.user.screen_name}: #{status.text}"
end

API とメソッドの対応

Rubytter と Twitter API とのメソッドの対応は以下のようになっています。

Rubytter Twitter
update(message) /statuses/update
remove_status(id, params = {}) /statuses/destroy/
public_timeline() /statuses/public_timeline
friends_timeline() /statuses/friends_timeline
replies() /statuses/replies
user_timeline(id) /statuses/user_timeline/
show(id) /statuses/show/
friends(id) /statuses/friends/
followers(id) /statuses/followers/
user(id) /users/show/
direct_messages() /direct_messages
sent_direct_messages() /direct_messages/sent
direct_message(message) /direct_messages/new
remove_direct_message(id, params = {}) /direct_messages/destroy/
follow(id, params = {}) /friendships/create/
leave(id, params = {}) /friendships/destroy/
friendship_exists() /friendships/exists
followers_ids(id) /followers/ids/
friends_ids(id) /friends/ids/
favorites() /favorites
favorite(id, params = {}) /favorites/create/
remove_favorite(id, params = {}) /favorites/destroy/
verify_credentials(params = {}) /account/verify_credentials
end_session(params = {}) /account/end_session
update_delivery_device(params = {}) /account/update_delivery_device
update_profile_colors(params = {}) /account/update_profile_colors
limit_status() /account/rate_limit_status
update_profile(params = {}) /account/update_profile
enable_notification(id, params = {}) /notifications/follow/
disable_notification(id, params = {}) /notifications/leave/
block(id, params = {}) /blocks/create/
unblock(id, params = {}) /blocks/destroy/
search(query or params) (search.twitter.com)/search

Twitter API の詳細については以下を参照してください。
Twitter API Wiki / REST API Documentation

enjoy!