Twittter用バッチをOAuthに対応する

TwitterBasic認証の対応を近日中止するとのことですので、それに対応して自動投稿プログラム(bot)の認証を変更してみました。

ちょっと環境の都合があってプログラムのバージョンが古いのですが、今回利用した環境は以下の通りです。

従来のTwitterライブラリを使ってBasic認証する場合は、非常に単純で以下のようにできました

 tw_auth = Twitter::HTTPAuth.new(“ログインするid”,”パスワード”)
 @tw = Twitter::Base.new(tw_auth)

これで認証が完了し、認証したユーザでの読み書きが可能にあります。

これをOAuthに変更する場合は3つのステップが必要です。

  1. Twtitterにアプリケーション登録申請を行う
  2. アクセスするユーザから認証を貰う
  3. プログラムの認証処理をOAuthに変更する

このステップを行う事で処理を切り替える事ができます。

1.Twtitterにアプリケーション登録申請を行う

まずTwitterにアプリケーション登録申請をします。今回は私が商品入荷を呟く専用につかっている @tgg_boardgame アカウントを使います。
アプリケーションもとのアカウントでTwitterにアクセスして右上の「設定」をクリックします。

設定画面に入ったら右端の「連携アプリ」をクリックすると以下の画面が出ます。画面中央にでている「No Application has been...」という文字の部分はそのアカウントがアクセスの許可を許しているアプリケーションがあればそこに表示されますので、何かが表示されていても気にしなくて大丈夫です。

重要なのはその右側に「開発者の方へ」という欄があり、そこの「こちら」リンクをクリックします。

するとTwitterアプリケーションの画面に遷移しますので、「新しいアプリケーションの追加」をクリックします。ここでも既に自分で開発済み・中のアプリケーションがあればそれが表示されています。

「アプリケーションの登録申請」画面に遷移しますので、登録するアプリケーションの名前等を登録し、申請します。ここでは tgg_boardgame_bot としました。

申請が完了するとOAuth認証に必要なキーが表示されます。

画像では消していますが、token部分とsecret部分が今後必要になりますので、控えておきます。

2.アクセスするユーザから認証を貰う

アプリケーションの登録が完了したら、そのアプリケーションがアクセスしたいユーザから認証(許可)を貰う必要があります。ここではpinを貰う方法で試しています。

rubyirbが対話方式で勧められて便利ですので、それですすめます。

$irb
irb(main):001:0>require "rubygems"
irb(main):002:0>gem "twitter","0.6.15"
irb(main):003:0> require "twitter"
irb(main):004:0> oauth = Twitter::OAuth.new(“アプリケーションのトークン”,”アプリケーションのシークレット”)

これで基本のTwitter用OAuthオブジェクトができあがります。この次にユーザに認証をして貰うためのリクエストにはいります。まずリクエストをするためのリクエスト用トークンとリクエスト用シークレットを作ります。

irb(main):005:0> rtoken = oauth.request_token.token
irb(main):006:0> rsecret = oauth.request_token.secret

これができあがるとユーザに対して認証pinを貰うためのリクエストを投げます

irb(main):007:0> oauth.request_token.authorize_url

この次の行でURLが表示されているはずですので、それをコピーして認証させたいユーザでログイン済みのブラウザに貼り付けます。

アクセスできるとプログラムからの認証を許可しますか?という画面が出ていますので、「許可」を押します。

許可を押すとピン番号が表示される画面にいきます。この番号は毎回違います。

この番号を控えたら再びirbに戻ります。

irb(main):008:0> oauth.authorize_from_request( rtoken,rsecret, “ピン番号”)

作っておいたリクエスト用のトークンとシークレットにピン番号を加えて認証リクエストを送ります。この戻り値には配列が帰ってきます。配列には2つの文字列が格納されており、最初が認証を許可してくれたユーザのアクセス用トークンで2つめがアクセス用シークレットです。この2つを控えておけば、ユーザによる認証は終了です。

3.プログラムの認証処理をOAuthに変更する

最初に示しました従来のBasic認証の1行目部分をOAuthに書き換えます。以下は旧の物です

   tw_auth = Twitter::HTTPAuth.new(“ログインするid”,”パスワード”)
   @tw = Twitter::Base.new(tw_auth)

書き換えると以下のようになります。

  oauth = Twitter::OAuth.new(“アプリケーションのトークン”,”アプリケーションのシークレット”)
  oauth.authorize_from_access(“アクセスするユーザのアクセストークン”,”アクセスするユーザのアクセスシークレット”)
   @tw = Twitter::Base.new(oauth)

以後は従来と同じアクセスが可能です。