2015-04-27 49 views
0

我还是很新的rails和编程一般请帮助我,无论如何,谢谢提前!为什么这个机器人在本地运行,但不在heroku上?

我写了一个小型机器人,可以在我的本地系统上完美工作,但是当我上传它时什么也不做。

我的html.erb只是调用下面的bot方法。这是一个无限循环,但在本地服务器上,它只允许机器人在后台运行,而页面永久加载,这对我很有用。我知道这个应用程序是正确部署的,因为我评论了这个bot方法,并且只是在空白页上打印了一些东西,而且完美地工作。所以它与我的机器人方法中的某些东西有关。 唯一的问题是,当我离开在heroku环境上运行的bot方法时,会弹出一个页面,提示“我们很抱歉发生了什么问题”,并告诉我检查日志,除了日志不会给我任何错误平通知:

Apr 26 23:34:08 guarded-falls-5003 heroku/router: at=info method=GET path="/" host=guarded-falls-5003.herokuapp.com request_id=ae3616c7-2ff6-4bdd-9738-03a2cc291f96 fwd="50.31.164.139" dyno=web.1 connect=2ms service=13ms status=500 bytes=1754 

这是controller.rb

require 'rubygems' 
require 'watir-webdriver' 
require 'phantomjs' 

def time(t) 
     mm, ss = t.divmod(60) 
     hh, mm = mm.divmod(60)   
     dd, hh = hh.divmod(24)  
     return "%d days, %d hours, %d minutes and %d seconds " % [dd, hh, mm, ss] 
    end 

    def remaining_time(delay) 
    time = Time.now.to_f 
    fin = delay + time 

    while fin > time 
     time = Time.now.to_f 
     @finished = "Current delay is #{time(fin-time)} \r" 
     sleep 1; 
    end 
    print "\n" 
    end 


    #################################################################### 
    #       bot          # 
    #################################################################### 

def bot 

    # bots login information 
    name = "*******" 
    email = "**********" 
    password = "*********" 

    #channel they are posting to on output website 
    channel = "Sports" 


    #################################################################### 
    # set the following url to the channel you would like to pull from # 
    #################################################################### 

    # input website (video) 
    url = "**************" 

    #################################################################### 
    #       bot code        # 
    #################################################################### 

    video = "" 

    ########################### Loop ################################### 

    loop do 

    # Starts the Browser, enters URL, and goes to the videos page 
    browser = Watir::Browser.new :phantomjs 
    browser.goto(url + "/videos") 
    # click on the class for the link of the video. Note that this just clicks on the first one it finds 
    browser.link(:class, "yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2").click 

    # Checks if the current video is already stored as the video variable 
     if video != browser.url 

     # Set video variable to current url 
     video = browser.url 

     # Close and open a new video because phantomjs bugs out when you try 
     # to change websites on an already existing window 
     browser.close 
     browser = Watir::Browser.new :phantomjs 

     # goto output website sign in page and sign in 
     browser.goto "**************" 
     browser.text_field(:id, "user_email").set(email) 
     browser.text_field(:id, "user_password").set(password) 
     browser.button(:value,"Sign in").click 

     # Upload the video (resize because search bar is hidden at default size) 
     browser.window.resize_to(1600, 1000) 
     browser.text_field(:id, "q").set(video) 
     browser.button(:text, "Upload").click 
     browser.select_list(:id, "video_channel_id").select(channel) 
     # browser.button(:text,"Create Video").click 

     puts "uploaded #{video}" 
     remaining_time(delay) 

     $stdout.flush 
     sleep(delay) 

     # Exit Browser 
     browser.close 

     else 

     browser.close 

     puts "Did not upload anything. The video has already been uploaded." 
     remaining_time(delay) 

     $stdout.flush 
     sleep(delay) 

     end 



    end 

end 

的Gemfile

source 'https://rubygems.org' 

gem 'newrelic_rpm' 
gem 'phantomjs' 
gem 'watir-webdriver' 
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 
gem 'rails', '4.2.0' 
# Use SCSS for stylesheets 
gem 'sass-rails', '~> 5.0' 
# Use Uglifier as compressor for JavaScript assets 
gem 'uglifier', '>= 1.3.0' 
# Use CoffeeScript for .coffee assets and views 
gem 'coffee-rails', '~> 4.1.0' 
# See https://github.com/sstephenson/execjs#readme for more supported runtimes 
# gem 'therubyracer', platforms: :ruby 

# Use jquery as the JavaScript library 
gem 'jquery-rails' 
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks 
gem 'turbolinks' 
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 
gem 'jbuilder', '~> 2.0' 
# bundle exec rake doc:rails generates the API under doc/api. 
gem 'sdoc', '~> 0.4.0', group: :doc 

# Use ActiveModel has_secure_password 
# gem 'bcrypt', '~> 3.1.7' 

# Use Unicorn as the app server 
# gem 'unicorn' 

# Use Capistrano for deployment 
# gem 'capistrano-rails', group: :development 

group :development, :test do 
    # Call 'byebug' anywhere in the code to stop execution and get a debugger console 
    gem 'byebug' 

    # Access an IRB console on exception pages or by using <%= console %> in views 
    gem 'web-console', '~> 2.0' 

    # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring 
    gem 'spring' 
end 

任何想法?

+0

您好,欢迎堆栈溢出。所以我的第一个简单的建议就是“printf调试”......也就是说,在每个主要分支(循环之前,就在循环之内)添加记录器调用,每一个都有不同的消息,说明代码中的哪个点最多......并查看代码在死亡之前到达的位置。 –

+0

我的其他建议是:删除循环...测试如果机器人只是尝试一次,然后结束会发生什么...... –

回答

0

对于无法更改的HTTP请求,Heroku有request timeout of 30 seconds。所以在离开页面加载的时候,它会在请求超时时终止。

Heroku的运行方式是使用background worker

+0

你知道是否有一种方法来构建应用程序,以便它只能使用工人类型dyno作为我的1免费dyno而不是必须使用网络dyno,因为我期望创建的整个过程无论如何都是服务器端? – Alex

+0

或者如果我在heroku中达到特定的动态小时限制时,是否有办法自动停止所有运行,以便我可以在750小时的限制内关闭所有内容?如果我连续使用两个dynos运行这个程序,那么我认为这个程序将不得不在一个月的一半。 – Alex

0

你在使用Watir吗?

要使用在Heroku PhantomJS,你需要使用一个Heroku PhantomJS buildpack

检查这个答案还有:

Can you deploy Watir on Heroku to generate HTML Snapshots? If so, how?

+0

我在尝试,但我认为这个页面解决方案修复了它。 http://stackoverflow.com/questions/12495463/how-to-run-phantomjs-on-heroku – Alex

+0

感谢您指出我在正确的方向!现在看起来我正在运行其他评论所说的我的页面超时。 – Alex

+0

Heroku超时问题是一个已知问题,如果您的请求需要更多的时间,您最多需要花30秒的时间,如果您希望获得更多的选择,请选择2个选项,1-延迟工作并在后台运行,以便您的请求能够快速响应,2-如果你真的需要现在处理它,你可以将请求分成多个请求,每个请求可以少于30秒,因此请使用ajax从前端发送请求,并且每个请求都可以发送第二,甚至你可以将它们全部发送并追踪完成。 –

相关问题