2015-04-27 3 views
0

Я все еще очень новичок в рельсах и программировании вообще, пожалуйста, помогите мне в любом случае, спасибо заранее!Почему этот бот работает локально, но не на героку?

Я написал небольшой бот, который отлично работает на моей локальной системе, но затем ничего не делает, когда я его загружаю.

Мой html.erb просто вызывает метод бота ниже. Это бесконечный цикл, но на локальном сервере он позволяет боту в основном работать в фоновом режиме, пока страница загружается навсегда, что работает для меня. Я знаю, что приложение развернуто правильно, потому что я прокомментировал метод бота и просто распечатал все на пустой странице и отлично работает. Так что это связано с чем-то в моем методе бота. Единственная проблема заключается в том, что когда я покидаю метод бота, запущенный в среде heroku, появляется всплывающее сообщение: «Мы сожалеем, что что-то пошло не так» и говорит мне проверять журнал, за исключением того, что журнал не дает мне никаких ошибок только пинг уведомления:

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

привет и добро пожаловать к переполнению стека. Таким образом, моей первой простой рекомендацией будет «отладка отпечатка» ... т. Е. Добавить логические вызовы в каждую из основных ветвей (до цикла, только внутри циклов и т. Д.), Каждый с разными сообщениями, объясняющими, в какой точке кода вы находитесь до ... и посмотреть, в какой момент код доходит до того, как он умрет. –

+0

Моей другой рекомендацией было бы: удалить цикл ... проверить, что произойдет, если бот просто пытается это сделать один раз, а затем закончится ... –

ответ

0

Heroku имеет request timeout of 30 seconds для HTTP-запросов, которые нельзя изменить. Поэтому, оставляя загрузку страницы, она будет работать в конце, когда запрос будет отключен.

Способ использования Heroku заключается в использовании background worker.

+0

Знаете ли вы, есть ли способ структурировать приложение, чтобы он мог использовать все рабочий тип dyno как мой 1 свободный динамо, а затем должен использовать веб-дино, поскольку весь процесс, который я ищу, создает, так или иначе, happing серверная сторона? – Alex

+0

Или есть способ автоматически остановить все, начиная с бега, если я достиг определенного предела в часовом режиме в герою, чтобы я мог просто закрыть все на своих 750 бесплатных часовых ограничениях? который, если я буду запускать эту программу непрерывно с двумя динамиками, я предполагаю, что это должно быть на полпути через месяц. – Alex

0

Вы используете Watir?

Чтобы использовать PhantomJS на Heroku, вы должны будете использовать 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 секунд, если вы ожидаете, что ваш запрос займет больше двух вариантов, 1- сделайте задерживаемую работу и запустите ее в фоновом режиме, чтобы ваш запрос быстро ответил , 2-, если вам действительно нужно это сделать сейчас, и вы можете разделить запрос на более чем 1 запрос, чтобы каждый из них мог принимать менее 30 секунд, поэтому отправляйте запросы с внешнего интерфейса с помощью ajax и в случае успеха каждого из них вы можете отправить второй или даже вы можете отправить их все и отслеживать, когда все они будут завершены. –

Смежные вопросы