OAuth::CLI::Twitter
ターミナル向け Twitter クライアントの termtter は初回起動時に、自動的にプラットフォームを判別した上でブラウザを開き、OAuth の認証画面を表示し、ユーザに Pin を入力させた上でアクセストークンを取得して ~/.termtter/token に書き込んでいる。
この仕組みが便利なので、termtter だけじゃなくて他のコマンドライン・アプリケーションでも使えるようにできないかなと思って、ライブラリを作ってみた。
- tily's ruby-oauth-cli-twitter at master - GitHub
- oauth-cli-twitter | RubyGems.org | your community gem host
インストール
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 のプロフィールをタスク管理ツールにする」っていう意味分からないの作ってるのでこれでも使う。