しばらく時間が経ってしまったが、引き続き ruby + twitter の組み合わせで小物作りは継続している。今回は oauth を使った認証と、 oauth に対応したライブラリ 「rubytter」を使ってみる。

oauth

why oauth?

セキュリティの問題とかはおいといて。twitter に何か POST するクライアントを作るなら、クライアント名を設定したい。ところが現在のところ、Basic認証での API 利用 (twiter4rなど) ではクライアント名を設定できず、oauth で認証したクライアントによる POST のみが設定可能となっている。読み込むだけならともかく、書き込みもするならやっぱりクライアント名を設定したいよね!というわけで今回は oauth を使うことにした。

ちなみにクライアント名とは以前の記事で紹介した、status[:source] の値のことである。

準備

oauth を利用するにあたっては以下のような準備が必要。

  • ログインした状態で「API」→「OAuth FAQ」→「Where do I create an application?」とリンクをたどり、新しいアプリケーションの登録画面へ進む。
  • 必須なのは「Application Name」「Description」「Application Website」。このアプリケーションを通して POST した status の source (投稿元)に Name と Website が設定される。
  • bot なので、ラジオボタンの設定は以下のように変えておく。たぶんあとからも変えられるけど。
    • Application Type:  Client
    • Default Access type:  Read & Write
  • 「Consumer Key」と「Consumer secret」を保存しておく。
動作テスト

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 が出てくるので、bot のアカウントでログインした状態のブラウザを使ってアクセスする。

http://twitter.com/oauth/authorize?oauth_token=******************************************

ブラウザに7桁の数字がどーんと表示されるので、慎重にメモる。irbに戻って以下を叩く。

access_token = request_token.get_access_token(:oauth_verifier => '*******')

アクセストークンとアクセスシークレットを出力し控えておく。

puts access_token.token
# => ********-*****************************************
puts access_token.secret
# => ******************************************

POSTのテスト。

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

タイムラインにつぶやきが POST されたら OK 。

rubytter

what’s rubytter?

@jugyo 作、rubygems の twitter クライアントライブラリ。github で公開されている。リポジトリはこちら

前回使った「twitter4r」はわりと分厚く twitter API を wrap している印象。それに対して rubytter は、wrap 層はあくまでも薄く、でも面倒なところはしっかりサポートしてくれている印象。API の仕様書を読みながら自分なりのクライアントを作るにはこちらの方が向いているし、書く楽しさも大きいように思う。

使い方

インストールはおなじみ…

gem install rubytter

取得した consumer / oauth のパラメータを与えて初期化。

require 'oauth'
require 'rubytter'

consumer = OAuth::Consumer.new(
  CONSUMER_KEY,
  CONSUMER_SECRET,
  :site => 'http://twitter.com'
  )

token = OAuth::AccessToken.new(
  consumer,
  ACCESS_TOKEN,
  ACCESS_TOKEN_SECRET
  )

rubytter = OAuthRubytter.new(token)

あとはこの rubytter オブジェクトに API へのパラメータを渡してメソッドをコールするだけ。例えば…

# mentionsを取得
rubytter.mentions :count => 200

# あるユーザのある発言に mention
rubytter.update "@#{user_name} #{text}", :in_reply_to_status_id => status_id

API を使うのとほぼ同じ感覚で使えるのが、少し実装するとわかってくると思う。

ちなみに。上のサンプルはとある発言 (status) へのリプライとして (in_reply_to_status_idを指定して) いるが、本文の先頭に「@{user_name}」がないと設定されないので注意。

まとめ

  • oauth を使うと クライアント名 (status[:source]) を設定できる
  • rubytter を使うと API をそのまま使うような直感的なインタフェースで twitter API を利用できる
  • どっちも rubygems なのでインストール簡単

次はやっと twitter bot 本体のお話。

oauth

TwitterのbotをOAuthに対応させる – しばそんノート

http://d.hatena.ne.jp/shibason/20090802/1249204953

rubytter

System.Exit — Rubytter

http://jugyo.org/blog/tag/rubytter

jugyo’s rubytter at master – GitHub

http://github.com/jugyo/rubytter