OAuth::CLI::Twitter

ターミナル向け Twitter クライアントの termtter は初回起動時に、自動的にプラットフォームを判別した上でブラウザを開き、OAuth の認証画面を表示し、ユーザに Pin を入力させた上でアクセストークンを取得して ~/.termtter/token に書き込んでいる。

この仕組みが便利なので、termtter だけじゃなくて他のコマンドライン・アプリケーションでも使えるようにできないかなと思って、ライブラリを作ってみた。

インストール

gem install oauth-cli-twitter

基本的な使い方

access_token = OAuth::CLI::Twitter.get_access_token(:file => ENV['HOME'] + '/.my_app')

こんなのを書くと以下を自動的にやってくれる。

  • 初回起動時は認証 URL を表示して PIN コードの入力を促す
    • 入力された PIN コードを元にアクセストークンを取得し、~/.my_app に書き込む
  • 2 回目以降は ~/.my_app からアクセストークンを読み込み、OAuth::AccessToken オブジェクトを返す

PIN コードの入力プロンプトはこんな感じ。

$ ruby example/test.rb
Visit URL below to allow this application.
http://api.twitter.com/oauth/authorize?oauth_token=RNUH1XwY9n1KgsCVMR5WlohChf7Rp7qr5TqOkUPMcw
Enter pin > 

あとは返ってきた OAuth::AccessToken オブジェクトをそのまま使ったり、他の Twitter 用ライブラリのオブジェクトを生成したり。

access_token.post(
  'http://twitter.com/statuses/update.json',
  'status'=> 'hello'
)
rubytter = OAuthRubytter.new(access_token)
rubytter.update('hello')

Pit に保存する

get_access_token に :pit => 'my-app' とか書くとアクセストークンを Pit に保存するようになる。

access_token = OAuth::CLI::Twitter.get_access_token(:pit => 'my-app')

ブラウザで開く

前述の termtter のブラウザで開くやつを使うには get_access_token に :browser => true と指定する。

access_token = OAuth::CLI::Twitter.get_access_token(:pit => 'my-app', :browser => 'true')

自分のアプリケーションの Consumer を指定する

今までの例では OAuth::CLI::Twitter の Consumer 情報を使っていたんだけど、自分のアプリケーション用の Consumer 情報を指定することもできる。CONSUMER_TOKEN / CONSUMER_SECRET の 2 つの定数を定義するだけ。

CONSUMER_TOKEN  = '358RyJ77o4BYJUViVRQ'
CONSUMER_SECRET = 'aOHsTInoyOjNewpvC9c5uwBqF3XOd5xSGlHFtaB8A'

access_token = OAuth::CLI::Twitter.get_access_token(:file => ENV['HOME'] + '/.my_app')

インクルードして使う

もっと本格的に、自分のクラスに組み込んで使いたいときには include することも可能。

class MyApplication
  include OAuth::CLI::Twitter

  CONSUMER_TOKEN  = '358RyJ77o4BYJUViVRQ'
  CONSUMER_SECRET = 'aOHsTInoyOjNewpvC9c5uwBqF3XOd5xSGlHFtaB8A'

  def initialize
    access_token = get_access_token(:pit => 'oauth-cli-twitter-inclusion')
    oauth = Twitter::OAuth.new(CONSUMER_TOKEN, CONSUMER_SECRET)
    oauth.authorize_from_access(access_token.token, access_token.secret)
    @twitter = Twitter::Base.new(oauth)
  end

  def update(status)
    @twitter.update(status)
  end
end

app = MyApplication.new
app.update('hello from my app.')

編集後記

大したことやってない割には作るのに結構時間かかった…。定数を定義するやり方は腹立つとかいいつつ、結果的にこれと似た感じになってしまった。Module#included とか初めて使ったので勉強になった。

Twitter ボットのエンハンス のときよりだいぶ便利になったので、bot.rb にもこれを組み込んで gem にしたい、あと「Twitter のプロフィールをタスク管理ツールにする」っていう意味分からないの作ってるのでこれでも使う。