简体   繁体   English

为什么该机器人在本地运行而不在heroku上运行?

[英]Why does this bot run locally but not on heroku?

I am still very new to rails and programming in general please help me in anyway, thanks ahead of time! 我仍然对Rails和编程还很陌生,无论如何,请随时帮助我,谢谢!

I wrote a small bot that works perfectly on my local system but then does nothing when I upload it. 我写了一个小机器人,可以在我的本地系统上完美运行,但是在上传时什么也不做。

My html.erb just calls the bot method below. 我的html.erb只是调用下面的bot方法。 It is an infinite loop but on the local server it just allows the bot to basically run in the background while the page is loading forever, which works for me. 这是一个无限循环,但在本地服务器上,它只允许bot在页面永久加载时基本上在后台运行,这对我有用。 I know that the app is deployed correctly because I commented out the bot method and just had things print on a blank page and that works perfectly. 我知道该应用程序已正确部署,因为我注释掉了bot方法,只是将内容打印在空白页上,并且效果很好。 So it has to do with something in my bot method. 因此,这与我的bot方法中的某些事情有关。 The only problem is that when I leave the bot method running on the heroku environment a page pops up saying "We're sorry something went wrong" and tells me to check log, except the log doesn't give me any errors only a ping notification: 唯一的问题是,当我让bot方法在heroku环境上运行时,会弹出一个页面,说“我们很抱歉出现了问题”,并告诉我检查日志,但该日志仅凭ping命令不会给我任何错误通知:

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

This is the controller.rb 这是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

Any ideas? 有任何想法吗?

Heroku has a request timeout of 30 seconds for HTTP requests that can not be changed. 对于无法更改的HTTP请求,Heroku的请求超时为30秒 So while leaving the page loading will work, it will eventually terminate when the request is timed out. 因此,在离开页面加载的同时,它将继续工作,但最终将在请求超时时终止。

The Heroku way of running this would be to use a background worker . Heroku运行此方法的方法是使用后台工作者

Are you using Watir ? 您在使用Watir吗?

To use PhantomJS on Heroku, you'll need to use a Heroku PhantomJS buildpack 要在Heroku上使用PhantomJS,您需要使用Heroku PhantomJS buildpack

Check this answer as well: 还要检查以下答案:

Can you deploy Watir on Heroku to generate HTML Snapshots? 您可以在Heroku上部署Watir来生成HTML快照吗? If so, how? 如果是这样,怎么办?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM