rubyでTwitterBot

ちょっと今TwitterBotを作ることになってまして。(僕が作るのは特にBotの制御部分)
詳しいことはそのうちまた書くと思うのですが、夏ぐらいにTwitterからデータを取る必要があってRuby Twitter Gemを使ったので、まあすぐできるだろうと思っていたのです。

昔はメールアドレスとパスワードによるログイン(Twitter::HTTPAuth)が使われていたが、
Twitterの仕様変更より、2010/8/31で使えなくなりました(Twitter::OAuthに変更)


ちょwwwwwwww


まあごにょごにょ言ってても仕方ないので、
Route 477
見ながらアプリとしてTwitterに登録、atokenを取得、まではさこっとできました。しかしここで問題発生。

uninitialized constant Twitter::OAuth

どうやらruby twitter gem はバージョン1.0.0になって仕様が変わった模様。ライブラリの中みたら確かにoauth.rbがなかった。調べるのも面倒だったので、

gem install twitter --version'=0.9.8'

とかして古いバージョンを落としてくる(よく見るとリファレンスにも0.9.8準拠って書いてある)。
これでどんどん進めようとするものの、最後のところで投稿できないよって怒られる。どうやらうちのWSはproxy越しなので、proxyを指定しなければいけないよう。しかしここでもTwitter::OAuthのproxy指定の方法がわからない
(HTTPAuthはTwitter::HTTPAuth.http_proxy(PROXY_NAME,PROXY_PORT)とか指定すればよかった)。

いくつか調べていると、ruby twitter gem使わずにoauthから

@consumer = OAuth::Consumer.new(TOKEN, KEY, {
  :site               => 'http://app.twitter.com',
  :proxy              => 'http://PROXY_NAME:PROXY_PORT',
  })

とか指定できるっぽい。でもruby twitter gem使いたいしなー…

結論としては、gems/1.8/gems/twitter-0.9.8/lib/twitter/oauth.rbを書き換えて、optionsの引数にproxyを取れるようにしました。
プロキシを超えてRuby Twitter GemでOAuth認証が通らない - oTheRwoRld
丸々ここに書いてあるとおりやっただけ…

if options[:sign_in]
  @consumer_options[:authorize_path] =  '/oauth/authenticate'
end

の後に、

if options[:proxy]
  @consumer_options[:proxy] = options[:proxy]
end

と書き加えて、

tw_oauth = Twitter::OAuth.new(CONSUMER_KEY,CONSUMER_SECRET,{:proxy=>'http://PROXY_NAME:PROXY_PORT'})

とかやればOauthでもproxy越しにTwitterに投稿することができますよ、と。

あー…長かった…