rubygemsのtwitterを使ったOAuth認証クライアントスクリプト(プロキシ対応?)

以前のエントリで書いたtwitter client scriptが動かなくなったので、新たに書いてみました。

動かなくなった理由

# 以前書いたスクリプトより引用。

Twitter::HTTPAuth.http_proxy( PROXY_ADDR, PROXY_PORT )
base = Twitter::Base.new( Twitter::HTTPAuth.new( USERNAME, PASSWORD ) )

basic認証を使うHTTPAuthから、OAuthに変更する必要があります。

下準備

OAuth認証では、事前にアプリーション登録access tokenの取得が必要になります。
以下のサイトを参考に登録・取得を行ってください。

流れ
  1. アプリケーション登録
    • Consumer keyとConsumer secretを取得する
  2. access tokenの取得
  3. 取得した情報をスクリプトに記述する

新たなスクリプト

#!/usr/bin/ruby

require 'rubygems'
require 'twitter'
require 'time'

OAUTH_CONSUMER_KEY    = 'dummy_key'
OAUTH_CONSUMER_SECRET = 'dummy_secret'
OAUTH_ACCESS_TOKEN    = 'dummy_token'
OAUTH_ACCESS_SECRET   = 'dummy_secret'

PROXY_ADDR = nil

def request( base, getting_replies )
  if getting_replies then
    return base.mentions
  end
  return base.friends_timeline
end

oauth = Twitter::OAuth.new( OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET )
# oauth = Twitter::OAuth.new( OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, {:proxy => PROXY_ADDR} )
oauth.authorize_from_access( OAUTH_ACCESS_TOKEN, OAUTH_ACCESS_SECRET )
# oauth.access_token.consumer.options[ :proxy ] = PROXY_ADDR
base = Twitter::Base.new( oauth )

getting_replies = nil
if ARGV[ 0 ] == '-r' then
  getting_replies = true
  ARGV.shift
end

if ARGV.size > 0 then
  base.update( ARGV.join( ' ' ) )
end

request( base, getting_replies ).reverse.each do |s|
  puts "#{s.user.screen_name} : #{s.text} [ #{Time.parse(s.created_at).strftime( '%Y/%m/%d %H:%M' )}]"
end

変更箇所

変更した箇所は以下です。HTTPAuth(basic認証)からOAuth(OAuth認証)に変更しました。

oauth = Twitter::OAuth.new( OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET )
oauth.authorize_from_access( OAUTH_ACCESS_TOKEN, OAUTH_ACCESS_SECRET )
base = Twitter::Base.new( oauth )

こちらも変更しました。repliesよりもmentionsメソッドの使用が推奨されているからです。

    return base.mentions

proxyについて

最初はこれでいけると思ったんですが、自分の環境ではうまくいきませんでした。

oauth.access_token.consumer.options[ :proxy ] = PROXY_ADDR

なので、こちらを参考に、twitter.rbを編集しました。編集内容はリンク先を参照。

そして、コンストラクタにproxyの設定を渡せばOK.

oauth = Twitter::OAuth.new( OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, {:proxy => PROXY_ADDR} )

終わりに

token, secretを取得してしまえば後は簡単なんですが、そこまでが非常に面倒でした。
理解してしまえば楽なんですけど。