multiples instasaver instasave imagenes historias fotos for downloader descargar como app album ruby httpwebrequest javax.imageio

ruby - imagenes - instasaver



¿Descargar una imagen desde una URL? (3)

Estoy intentando usar HTTP :: get para descargar una imagen de un gráfico de Google desde una URL que creé.

Este fue mi primer intento:

failures_url = [title, type, data, size, colors, labels].join("&") require ''net/http'' Net::HTTP.start("http://chart.googleapis.com") { |http| resp = http.get("/chart?#{failures_url") open("pie.png" ,"wb") { |file| file.write(resp.body) } }

Lo que produjo sólo un archivo PNG vacío.

Para mi segundo intento, utilicé el valor almacenado dentro de failure_url dentro de la llamada http.get() .

require ''net/http'' Net::HTTP.start("http://chart.googleapis.com") { |http| resp = http.get("/chart?chtt=Builds+in+the+last+12+months&cht=bvg&chd=t:296,1058,1217,1615,1200,611,2055,1663,1746,1950,2044,2781,1553&chs=800x375&chco=4466AA&chxl=0:|Jul-2010|Aug-2010|Sep-2010|Oct-2010|Nov-2010|Dec-2010|Jan-2011|Feb-2011|Mar-2011|Apr-2011|May-2011|Jun-2011|Jul-2011|2:|Months|3:|Builds&chxt=x,y,x,y&chg=0,6.6666666666666666666666666666667,5,5,0,0&chxp=3,50|2,50&chbh=23,5,30&chxr=1,0,3000&chds=0,3000") open("pie.png" ,"wb") { |file| file.write(resp.body) } }

Y, por alguna razón, esta versión funciona aunque el primer intento tuvo los mismos datos dentro de la llamada http.get() . ¿Alguien sabe a que se debe esto?

SOLUCIÓN:

Después de intentar averiguar por qué sucede esto, encontré " ¿Cómo descargo un archivo binario a través de HTTP? ".

Uno de los comentarios menciona la eliminación de http:// en la Net::HTTP.start(...) contrario no tendrá éxito. Efectivamente después de que hice esto:

failures_url = [title, type, data, size, colors, labels].join("&") require ''net/http'' Net::HTTP.start("chart.googleapis.com") { |http| resp = http.get("/chart?#{failures_url") open("pie.png" ,"wb") { |file| file.write(resp.body) } }

funcionó.


Iría después del archivo usando Ruby''s Open::URI :

require "open-uri" File.open(''pie.png'', ''wb'') do |fo| fo.write open("http://chart.googleapis.com/chart?#{failures_url}").read end

La razón por la que prefiero Open :: URI es que maneja las redirecciones automáticamente, de modo que CUANDO Google haga un cambio en su back-end e intente redireccionar la URL, el código lo manejará de forma mágica. También maneja los tiempos de espera y reintenta con más gracia si recuerdo bien.

Si debe tener un control de nivel inferior, me gustaría ver a uno de los muchos otros clientes HTTP para Ruby; Net :: HTTP está bien para crear nuevos servicios o cuando un cliente no existe, pero usaría Open :: URI o algo así como Net :: HTTP hasta que se presente la necesidad.

La URL:

http://chart.googleapis.com/chart?chtt=Builds+in+the+last+12+months&cht=bvg&chd=t:296,1058,1217,1615,1200,611,2055,1663,1746,1950,2044,2781,1553&chs=800x375&chco=4466AA&chxl=0:|Jul-2010|Aug-2010|Sep-2010|Oct-2010|Nov-2010|Dec-2010|Jan-2011|Feb-2011|Mar-2011|Apr-2011|May-2011|Jun-2011|Jul-2011|2:|Months|3:|Builds&chxt=x,y,x,y&chg=0,6.6666666666666666666666666666667,5,5,0,0&chxp=3,50|2,50&chbh=23,5,30&chxr=1,0,3000&chds=0,3000

hace URI molesto. Sospecho que está viendo caracteres que deberían estar codificados en las URL.

Para fines de documentación, esto es lo que URI dice cuando se intenta analizar esa URL como está:

URI::InvalidURIError: bad URI(is not URI?)

Si primero codifico el URI, obtengo un análisis exitoso. Las pruebas adicionales usando Open :: URI muestran que es capaz de recuperar el documento en ese punto y devuelve 23701 bytes.

Creo que esa es la solución adecuada para el problema si algunos de esos personajes no son aceptables para URI Y están fuera de la RFC.

Solo para información, la gema Addressable::URI es un excelente reemplazo para el URI integrado.


Su versión original no tenía el nombre del parámetro para cada parámetro, solo los datos. Por ejemplo, en el título, simplemente no puede enviar "Builds + in + the + last + 12 + months", sino que debe ser "chtt = Builds + in + the + last + 12 + months".

Prueba esto:

failures_url = ["title="+title, "type="+type, "data="+data, "size="+size, "colors="+colors, "labels="+labels].join("&")


resp = http.get("/chart?#{failures_url")

Si copió su código original, entonces falta un corchete de cierre en la cadena de su ruta.