2017-04-16 3 views
0

Ich schrieb ein Ruby-Skript eine Bild-URL heruntergeladen werden:Wie man eine cloudflare 520 Anfrage mit Ruby "nachlädt"?

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 

Verwendungsbeispiel:

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

Das Problem ist, manchmal laufe ich über diesen Ausgang Fehler:

520 Origin Error

Dann, wenn ich die gleiche URL in meinem Browser versuche, bekomme ich etwas wie folgt:

enter image description here

Wenn ich um die Seite oder klicken Sie auf den ‚Retry für eine Live-Version‘ Knopf im Bild oben, um die Seite geladen laden.

Dann, wenn ich das Skript erneut ausführen, lädt es das Bild einfach gut.

Also, wie kann ich diese Seite reload replizieren/"Retry für eine Live-Version" Verhalten mit Ruby und ohne zu meinem Browser wechseln? Das Ausführen des Skripts führt die Aufgabe nicht aus.

Antwort

0

Es klingt, als ob Sie nach einem Verzögerungsbefehl suchen. Wenn das Skript fehlschlägt (oder auf '520 Origin Error' stößt), warten Sie und versuchen Sie es erneut.

Dies ist eine schnell aufgebaute rekursive Funktion. Vielleicht möchten Sie weitere Prüfungen hinzufügen, wie oft Sie geloopt haben und nach so vielen brechen. (Auch nicht getestet, kann Fehler enthalten, gemeint als Beispiel)

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 
+0

Es stellt sich heraus, es ist egal, wie lange Sie warten. Es funktioniert nur, wenn Sie es versuchen und im Browser neu laden und dann das Skript erneut aufrufen. – kraftydevil

+0

Eine letzte Idee (naja ein paar) Je nachdem, wie weit du damit gehen willst. Sie könnten versuchen, wget oder curl über die Befehlszeile mit System auszuführen, ein Beispiel wäre "System" wget url_to_file_or_image "" Nokoguri hat für mich in der Vergangenheit gearbeitet, es hat einige nette Funktionen, um mit externen Quellen zu verbinden. –