2010/06/30でtwitter APIのBasic認証が廃止されます。 Basic認証からOAuth認証へのカウントダウンサイトもできていて、twitter関連のアプリケーション開発者は対応が必要な状況ですね。
ブラウザベースのアプリケーション(WebService)では、各種ライブラリやtwitter @anywhereを利用して比較的簡単にOAuth認証へ移行できるかと思いますが、デスクトップアプリケーションやbotなど、ユーザがブラウザで利用することを想定していないアプリケーションで、twitter APIのOAuth認証を利用するための情報はまだ少ない状況です。
そこで、rubyの(一般的な)twitterライブラリtwitter gemを使って、ブラウザベースではないアプリケーションからOAuth認証を利用するシンプルな方法をご紹介します。
クライアントアプリケーションとして対話型のrubyクライアントであるirbを利用します。rubyがインストールされている環境であれば標準で利用できるものです。
以下に、実際のソースコードも含めてご紹介します。
事前に用意するもの
- ruby
- twitter gem(sudo gem install twitterでインストールしておく)
- OAuthのアプリケーション登録
- twitterに登録したアプリケーションの「Consumer key」と「Consumer secret」
OAuthのアプリケーション登録
twitterアプリケーションページから登録してください。
今回は、ブラウザベースではないアプリケーションからOAuth認証を利用するので、「Application Type」はClientを選択します。
このときのアプリケーション名やWebSiteなどは後からでも変更できるので、とりあえずさくっと登録してみるのが良いと思います。
「Consumer key」と「Consumer secret」
上記で登録した(または登録してあった)アプリケーションを、twitterアプリケーションページから選択し、Consumer keyとConsumer secretを控えておいてください。
準備が整ったらさっそく試してみましょう
irbを起動します
まずは、irbを起動します。この起動したirbはずっと使いますので、途中で終了しないようにしてください。
$ irb -rrubygems -rtwitter
rubygemsとtwitterをrequireしています。
認証番号(PIN)の発行
ブラウザベースではないアプリケーションでも一度だけブラウザでtwitterにアクセスして、ログインのための認証番号(PIN)を発行する必要があります。
consumer_token = "XXXXXXX" # ここに「Consumer key」 consumer_secret = "YYYYYYYY" # ここに「Consumer secret」 tauth = Twitter::OAuth.new(consumer_token, consumer_secret) request = tauth.consumer.get_request_token puts request.authorize_url # => http://twitter.com/oauth/authorize?oauth_token=ZZZZZZZZZZ
ここでは、Consumer keyとConsumer secretを使って認証番号(PIN)発行ページのURLを作成します。
表示されたURLにブラウザでアクセスすると、アプリケーションからアカウントへのアクセスを許可するかどうかの画面がでますので、登録したアプリケーションへのアクセスを「許可(Allow)」します。
すると、上の画像のように「暗証番号(PIN)」が発行されるので控えておきます。
「Access token」と「Access secret」の生成
先ほどのirbに戻り、認証番号(PIN)を利用してAccess tokenとAccess secretを生成します。これがアプリケーションにおけるパスワード代わりになります。
pin = "DDDDDDD" # ここに「暗証番号(PIN)」 atoken, asecret = tauth.authorize_from_request(request.token, request.secret, pin) twitter_client = Twitter::Base.new(tauth)
これで、twitter_clientがOAuthで認証されたので、
p twitter_client.home_timeline # => .... 自分のタイムライン取得 ....
などとしてtwitter APIを利用できます。
2回目以降の利用
毎回ブラウザを開いて暗証番号(PIN)を取得していてはブラウザベースではないアプリケーションとして成り立ちません。2回目以降に暗証番号(PIN)無しで認証するためには、先ほどのAccess tokenとAccess secretを保存しておきます。
tauth = Twitter::OAuth.new(consumer_token, consumer_secret) tauth.authorize_from_access(atoken, asecret) # 保存しておいたAccess token, Access secret twitter_client = Twitter::Base.new(tauth) p twitter_client.home_timeline # => .... 自分のタイムライン取得 ....
上記のようにすれば、暗証番号(PIN)無しで認証されます。
ご注意
平文でアカウントとパスワードは見えませんが、atoken, asecret はそれと等しいので保管には注意しましょう。
Access tokenとAccess secretの有効期限については、言及を見つけられませんでした。永続利用できないかもしれませんので、アプリケーション側でexpireするなどが必要かもしれません。(ご存じの方がいらっしゃれば教えてください)
最後に
Basic認証からOAuth認証への移行ができないと、あなたのbotが6/30で動かなくなります。本記事が移行の手助けになれば幸いです。
なお、本記事上のソースコードはThe MIT Licenseです。(たいしたコードではありませんが)
最後までお読みいただきありがとうございます。

こんにちわ。昨日のニコニコ動画のメンテ以後Heat the nicovideo upが使えなくなってしまいました・・・。とても重宝していたので残念です。アップデートされる予定はありませんか?
http://blog.fulltext-search.biz/pages/visualize-comments-upsurge-greasemonkey-script-for-nicovideo
http://dev.twitter.com/pages/oauth_faq
に
Technical
How long does an access token last?
We do not currently expire access tokens. Your access token will be invalid if a user explicitly rejects your application from their settings or if a Twitter admin suspends your application. If your application is suspended there will be a note on your application page saying that it has been suspended.
のように記されているので、
今のところAccess tokenとAccess secretの有効期限は基本的には無期限のようです。
非常に役立ちました。
どうもありがとうございます。