6901


tweetstream
を利用して特定ユーザーのtweetを監視するアプリをheroku上にデプロイしましたが、TweetStream::ReconnectError
というエラーが発生しうまく動作していないようです。

ローカルで foreman を利用し動作を確認したところ問題ありませんでした。heroku上で動作させるためには何か必要なのでしょうか？

ソースコードとログをGithub上に公開しているので下記を参照ください。

ソースコード:  
<https://github.com/shts/nogi_tweet_observer>

[code]

    require 'net/http'
    require 'uri'
    require 'tweetstream'
    require 'parse-ruby-client'
    require 'uri'
    
    Parse.init :application_id => ENV['PARSE_APP_ID'],
               :api_key        => ENV['PARSE_API_KEY']
    
    TweetStream.configure do |config|
      config.consumer_key       = ENV['TWITTER_CONSUMER_KEY']
      config.consumer_secret    = ENV['TWITTER_CONSUMER_SECRET']
      config.oauth_token        = ENV['TWITTER_OAUTH_TOKEN']
      config.oauth_token_secret = ENV['TWITTER_OAUTH_TOKEN_SECRET']
      config.auth_method        = :oauth
    end
    
    def push_notification(url) # must String
      data = { :alert => "Push from ruby sample!" + url.to_s, :url => url.to_s }
      push = Parse::Push.new(data)
      push.where = { :deviceType => "android" }
      p push.save
    end
    
    def replace_uri(s)
        str = s.dup
        uri_reg = URI.regexp(%w[http https])
        str.gsub!(uri_reg) {"#{$&}"}
        "#{$&}"
    end
    
    NOGIZAKA_BLOG = "http://blog.nogizaka46.com"
    
    def expand_url(url)
      uri = url.kind_of?(URI) ? url : URI.parse(url)
      Net::HTTP.start(uri.host, uri.port) { |io|
        r = io.head(uri.path)
        r['Location'] || uri.to_s
      }
    end
    
    EM.run do
      client = TweetStream::Client.new
      # 1084091587 -> 練習用
      # 317684165 -> 本番
      client.follow(1084091587) do |status|
        puts "#{status.user.screen_name}: #{status.text}"
    
        url = replace_uri(status.text)
        if (!url.to_s.include?("http://t.co/") && !url.to_s.include?("http://bit.ly/"))
          puts "url may be not nogizaka blog domain : " + url.to_s
        else
          url = expand_url(url)
          if (url.include?(NOGIZAKA_BLOG))
            push_notification(url)
          else
            url = expand_url(url)
            if (url.include?(NOGIZAKA_BLOG))
              push_notification(url)
            else
              puts "url may be not nogizaka blog domain"
            end
          end
        end
      end
    
      client.on_error do |message|
        puts "error: #{message}\n"
      end
    
      client.on_reconnect do |timeout, retries|
        puts "reconnecting in: #{timeout} seconds\n"
      end
    
    end
    
[/code]

エラーログの要点部分:  
<https://github.com/shts/nogi_tweet_observer/issues/1>

[code]

    2015-02-21T09:50:47.443193+00:00 heroku[observer.1]: State changed from crashed to starting
    2015-02-21T09:50:47.425787+00:00 heroku[observer.1]: Process exited with status 1
    2015-02-21T09:50:49.806923+00:00 heroku[observer.1]: Starting process with command `bundle exec ruby observer.rb`
    2015-02-21T09:50:50.414194+00:00 heroku[observer.1]: State changed from starting to up
    2015-02-21T10:01:22.966632+00:00 app[observer.1]: /app/vendor/bundle/ruby/2.0.0/gems/tweetstream-2.6.1/lib/tweetstream/client.rb:449:in `block in connect': Failed to reconnect after 6 tries. (TweetStream::ReconnectError)
    2015-02-21T10:01:22.966647+00:00 app[observer.1]:   from /app/vendor/bundle/ruby/2.0.0/gems/em-twitter-0.3.5/lib/em-twitter/connection.rb:297:in `call'
    2015-02-21T10:01:22.966648+00:00 app[observer.1]:   from /app/vendor/bundle/ruby/2.0.0/gems/em-twitter-0.3.5/lib/em-twitter/connection.rb:297:in `invoke_callback'
    2015-02-21T10:01:22.966650+00:00 app[observer.1]:   from /app/vendor/bundle/ruby/2.0.0/gems/em-twitter-0.3.5/lib/em-twitter/connection.rb:269:in `rescue in schedule_reconnect'
    2015-02-21T10:01:22.966657+00:00 app[observer.1]:   from /app/vendor/bundle/ruby/2.0.0/gems/eventmachine-1.0.7/lib/eventmachine.rb:1457:in `event_callback'
    2015-02-21T10:01:22.966652+00:00 app[observer.1]:   from /app/vendor/bundle/ruby/2.0.0/gems/em-twitter-0.3.5/lib/em-twitter/connection.rb:264:in `schedule_reconnect'
    2015-02-21T10:01:22.966656+00:00 app[observer.1]:   from /app/vendor/bundle/ruby/2.0.0/gems/em-twitter-0.3.5/lib/em-twitter/connection.rb:92:in `unbind'
    2015-02-21T10:01:22.966660+00:00 app[observer.1]:   from /app/vendor/bundle/ruby/2.0.0/gems/eventmachine-1.0.7/lib/eventmachine.rb:187:in `run'
    2015-02-21T10:01:22.966658+00:00 app[observer.1]:   from /app/vendor/bundle/ruby/2.0.0/gems/eventmachine-1.0.7/lib/eventmachine.rb:187:in `run_machine'
    2015-02-21T10:01:22.966661+00:00 app[observer.1]:   from observer.rb:42:in `<main>'
    
[/code]

また、rubyについては始めたばかりなのでソースコードなどにおかしなところがあれば、知見をお持ちの方に指摘いただきたいです。

よろしくお願いいたします。


CC BY-SA 3.0
2015-02-21T12:07:29.767
6865
2015-02-22T21:30:08.460
2015-02-22T21:30:08.460
4114
8273
question
ruby twitter heroku
herokuでTweetStream::ReconnectErrorが発生する


念のために確認ですが、Herokuに環境変数は設定してありますか？  
以下のコードで環境変数を使っているので、まず最初に環境変数が入っていないと正しく動かないと思います。

[code]

    Parse.init :application_id => ENV['PARSE_APP_ID'],
               :api_key        => ENV['PARSE_API_KEY']
    
    TweetStream.configure do |config|
      config.consumer_key       = ENV['TWITTER_CONSUMER_KEY']
      config.consumer_secret    = ENV['TWITTER_CONSUMER_SECRET']
      config.oauth_token        = ENV['TWITTER_OAUTH_TOKEN']
      config.oauth_token_secret = ENV['TWITTER_OAUTH_TOKEN_SECRET']
      config.auth_method        = :oauth
    end
    
[/code]

ローカルで動いているのであればそれぐらいしか違いが思いつかないので、念のため確認をお願いします。


CC BY-SA 3.0
2015-02-22T02:12:42.470
6901
2015-02-22T02:12:42.470
85
6865
answer


ローカルでの Ruby のバージョンと Heroku での Ruby のバージョンが違うために動作が異なっているのかもしれません（ EventMachine
がらみのエラーが生じ得ます）。

Junichi Ito さんの確認（[環境変数](https://devcenter.heroku.com/articles/config-
vars)）に加えて、 Heroku での Ruby バージョンを指定してみてください。

例えば、もしもローカルで Ruby 2.1.5 を使っていれば Gemfile を

[code]

    source 'https://rubygems.org'
    ruby "2.1.5"
    # プロセス管理
    gem 'foreman'
    gem 'tweetstream'
    gem 'parse-ruby-client'
    
[/code]

にしてください。

個人的には Twitter 関係の gem は [The Twitter Ruby
Gem](http://www.rubydoc.info/gems/twitter)
を使った方が良いと思っています（目的にしておられる、他のアカウントのツイートを Streaming で見張っていることも可能で、私も使っています）。  
TweetStream 及びそのベースとなっている em-twitter は、最近はあまり更新されておらず、しかも最近の更新に関しては Twitter
Ruby Gem 作者の sferik が行っていたりします。  
Twitter Ruby Gem は現在 5.14.0 、バージョン6でさらなる Streaming 対応を図ろうとしているところのようです。

おまけ：observer.rb で、二回目の `require 'uri'` は不要です（全く意味が無いです）。


CC BY-SA 3.0
2015-02-22T15:31:31.097
6932
2015-02-22T15:31:31.097
4114
6865
answer