huginn/huginn

Twitter Agent fails with "Not authorized." rather than checks HTTP error code.

Open

#751 建立於 2015年3月23日

在 GitHub 查看
 (1 留言) (0 反應) (0 負責人)Ruby (49,270 star) (4,264 fork)batch import
enhancementhelp wanted

描述

One of the Twitter agents (I think it's TwitterStreamAgent) fails with the error "Not authorized." under some circumstances. Here's a stack trace before I go into my observations:

Not authorized.
/home/drwho/.rvm/gems/ruby-2.1.0/gems/twitter-5.8.0/lib/twitter/rest/response/raise_error.rb:17:in `on_complete'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/faraday-0.9.1/lib/faraday/response.rb:9:in `block in call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/faraday-0.9.1/lib/faraday/response.rb:57:in `on_complete'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/faraday-0.9.1/lib/faraday/response.rb:8:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/faraday-0.9.1/lib/faraday/request/url_encoded.rb:15:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/faraday-0.9.1/lib/faraday/request/multipart.rb:14:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/twitter-5.8.0/lib/twitter/rest/request/multipart_with_file.rb:18:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/faraday-0.9.1/lib/faraday/rack_builder.rb:139:in `build_response'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/faraday-0.9.1/lib/faraday/connection.rb:377:in `run_request'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/faraday-0.9.1/lib/faraday/connection.rb:140:in `get'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/twitter-5.8.0/lib/twitter/rest/client.rb:92:in `request'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/twitter-5.8.0/lib/twitter/rest/client.rb:63:in `get'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/twitter-5.8.0/lib/twitter/request.rb:22:in `perform'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/twitter-5.8.0/lib/twitter/request.rb:42:in `perform_with_objects'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/twitter-5.8.0/lib/twitter/rest/utils.rb:48:in `perform_with_objects'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/twitter-5.8.0/lib/twitter/rest/utils.rb:90:in `objects_from_response_with_user'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/twitter-5.8.0/lib/twitter/rest/timelines.rb:50:in `user_timeline'
/home/drwho/huginn/app/models/agents/twitter_user_agent.rb:91:in `check'
/home/drwho/huginn/app/models/agent.rb:437:in `async_check'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/performable_method.rb:30:in `perform'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/backend/base.rb:94:in `block in invoke_job'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `block in initialize'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `execute'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:40:in `run_callbacks'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/backend/base.rb:91:in `invoke_job'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:204:in `block (2 levels) in run'
/home/drwho/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/timeout.rb:82:in `block in timeout'
/home/drwho/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/timeout.rb:70:in `catch'
/home/drwho/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/timeout.rb:70:in `timeout'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:204:in `block in run'
/home/drwho/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/benchmark.rb:294:in `realtime'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:203:in `run'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:280:in `block in reserve_and_run_one_job'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `block in initialize'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `execute'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:40:in `run_callbacks'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:280:in `reserve_and_run_one_job'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:187:in `block in work_off'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:186:in `times'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:186:in `work_off'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:150:in `block (4 levels) in start'
/home/drwho/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/benchmark.rb:294:in `realtime'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:149:in `block (3 levels) in start'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `block in initialize'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `execute'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:40:in `run_callbacks'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:148:in `block (2 levels) in start'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:147:in `loop'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:147:in `block in start'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/plugins/clear_locks.rb:7:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/plugins/clear_locks.rb:7:in `block (2 levels) in <class:ClearLocks>'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:79:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:79:in `block (2 levels) in add'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `block in initialize'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:79:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:79:in `block in add'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `execute'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:40:in `run_callbacks'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/worker.rb:146:in `start'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/command.rb:124:in `run'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/command.rb:112:in `block in run_process'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons/application.rb:255:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons/application.rb:255:in `block in start_proc'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons/application.rb:264:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons/application.rb:264:in `start_proc'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons/application.rb:296:in `start'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons/controller.rb:73:in `run'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons.rb:197:in `block in run_proc'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons/cmdline.rb:109:in `call'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons/cmdline.rb:109:in `catch_exceptions'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/daemons-1.1.9/lib/daemons.rb:196:in `run_proc'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/command.rb:110:in `run_process'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/command.rb:91:in `block in daemonize'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/command.rb:89:in `times'
/home/drwho/.rvm/gems/ruby-2.1.0/gems/delayed_job-4.0.6/lib/delayed/command.rb:89:in `daemonize'
script/delayed_job:5:in `<main>'

I have observed that if Twitter's API service is getting hammered too hard or too fast by an application (say, if TwitterStreamAgent has been stuck in the retry queue for too long and suddenly several copies start running) the API service will return the whimsical HTTP Status 420: Enhance Your Calm (https://dev.twitter.com/overview/api/response-codes). It is my hypothesis that TwitterStreamAgent (or another of the Twitter agents, or possibly all of them due to the underlying Ruby Gem implementing the Twitter client application protocol) is misinterpreting this status code as a fatal error. Is there something that could be done in Huginn to fix this?

貢獻者指南