Как "перезагрузить" запрос cloudflare 520 с помощью ruby?

Я написал скрипт ruby ​​для загрузки URL изображения:

require 'open-uri'

imageAddress = ARGV[0]
targetPath = ARGV[1]

fullFileNamePath = "#{targetPath}test.jpg"

  begin
    File.open(fullFileNamePath, 'wb') do |fo|
        fo.write open(imageAddress).read
      end
  rescue OpenURI::HTTPError => ex
    puts ex
    File.delete(fullFileNamePath)
  end

Пример использования:

ruby download_image.rb "https://images.genius.com/b015b15e476c92d10a834d523575d3c9.1000x1000x1.jpg" "/Users/Me/Downloads/"

Проблема, иногда я сталкиваюсь с этой ошибкой вывода:

520 Origin Error

Затем, когда я пробую тот же URL в моем браузере, я получаю что-то вроде этого:

введите описание изображения здесь

Если я перезагружаю страницу или нажимаю кнопку "Повторить для версии в реальном времени" на изображении выше, страница загружается.

Затем, если я снова запустил скрипт, он прекрасно загрузил изображение.

Так, как я могу повторить эту перезагрузку страницы / поведение "Повторить для живой версии", используя ruby ​​и не переключаясь на мой браузер? Повторный запуск сценария не делает работу.

1 ответ

Похоже, вы ищете команду задержки. В случае сбоя сценария (или при обнаружении "520 Origin Error") подождите и повторите попытку.

Это быстродействующая рекурсивная функция, вы можете добавить другие проверки того, сколько раз вы сделали цикл, ломаясь после стольких раз. (Также не проверено, может содержать ошибки, приведенные в качестве примера)

def getFile(params_you_need)
   begin
      File.open(fullFileNamePath, 'wb') do |fo|
      fo.write open(imageAddress).read
   end
   rescue OpenURI::HTTPError => ex
     puts ex
     File.delete(fullFileNamePath)
      if ex == '520 Origin Error'
        sleep(30) #generally a good time to pause
        getFile(params_you_need)
      end
   end
end
Другие вопросы по тегам