Google App EngineのJRubyでSinatraを使ってHello worldを済ませたので、目的のTwitter Botを作り始めようと、まず手始めに手動でGAE上からTwitterにつぶやいてみようとしたんだけど、結果的にそれすらできなかった。
RubyのTwitterライブラリだと、そのままの名前のtwitterとrubytterの2つが有名だと思うんだけど、どちらも失敗した。原因はそれぞれ違うっぽいけども。おそらく自分の設定・デプロイ方法が悪かったんだと思うんだけど、JRuby特有の部分もあるのかなあ。
というわけで今回は、まったくもって何一つ解決出来ていない内容だけど備忘録。
twitterライブラリ
twitter 1.1.1ライブラリをrequire
しただけで以下のエラーが出てしまった。以下はメインとなるapp.rb
のコード。OAuthに必要な各キーの文字列部分は変えてある。
require 'rubygems'
require 'sinatra'
require 'twitter'
before do
Twitter.configure do |config|
config.consumer_key = "Consumer key"
config.consumer_secret = "Consumer secret"
config.oauth_token = "OAuth token"
config.oauth_token_secret = "OAuth token secret"
end
end
get '/' do
'Google App Engine上のJRubyでSinatraを使ってHello world!'
end
get '/tweet' do
t = Time.now # 同一内容投稿エラーの防止用
Twitter.update("Google App EngineからHello world! at #{t}")
"tweet complete"
end
dev_appserver
で起動中にエラーが発生。http://loaclhost:8080/ にアクセスしても以下のようなエラー。
Internal Server Error (500)
Request Method: GET
Request URL: http://localhost:8080/500.html
no such file to load -- twitter from ./app.rb:3 from ./app.rb:1:in `require' from config.ru:1
ライブラリをロードできてないっぽい。いろいろ試行錯誤したけどこのエラーを解決できず、ここから一歩も進めずに終了。
rubytterライブラリ
次にrubytterを使って同じことをやってみる。
require 'rubygems'
require 'sinatra'
require 'rubytter'
before do
consumer = OAuth::Consumer.new(
'Consumer key',
'Consumer secret',
:site => 'http://twitter.com'
)
access_token = OAuth::AccessToken.new(
consumer,
'OAuth token',
'OAuth token secret'
)
@rubytter = OAuthRubytter.new(access_token)
end
get '/' do
'Google App Engine上のJRubyでSinatraを使ってHello world!'
end
get '/tweet' do
t = Time.now # 同一内容投稿エラーの防止用
@rubytter.update("Google App EngineからHello world! at #{t}")
"tweet complete"
end
dev_appserver
でエラーが出ず起動した!期待age!
http://localhost:8080/ には正常にアクセスできる!
http://localhost:8080/tweet にアクセスするとエラー!くそー… 以下がエラー内容。
LoadError at /tweet
no such file to load -- openssl
* file: ssl.rb
* location: require
* line: 6
お、これならopensslをrequire
すればいいだけじゃね?ってことで、Gemfile
にgem "jruby-opennssl"
を追加して、app.rb
にrequire "opennssl"
を追加して、さきほどと同じように、dev_appserver
を起動して http://localhost:8080/tweet にアクセスするとまたエラー!
ArgumentError at /tweet
wrong # of arguments(3 for 2)
* file: base.rb
* location: digest
* line: 12
引数が足りないとか言われても、全然知らないファイルのことを言っている。もうお手上げだー!JRubyむずい! というわけで、GAEからTwitterへは一言もつぶやけずにTwitter Bot作戦は終了。
10分ではじめる GAE/JRuby (OAuth + Sinatraのサンプル) - まちゅダイアリー(2009-09-03) LoadErrorに心が折れそうなときに試したい2つのこと - 勇気があれば何でも動く!