Ruby open-uri y galletas
cookies (6)
Me gustaría almacenar las cookies de una llamada open-uri y pasarlas a la siguiente. Parece que no puedo encontrar los documentos correctos para hacer esto. Te agradecería que me dijeras la forma correcta de hacerlo.
NOTAS: w3.org no es la URL real, pero es más corta; fingir que las galletas son importantes aquí.
h1 = open("http://www.w3.org/")
h2 = open("http://www.w3.org/People/Berners-Lee/", "Cookie" => h1.FixThisSpot)
Actualización después de 2 noches : aunque esto no fue pensado como una pregunta retórica, garantizo que es posible. Actualización después de tumbleweeds : Ver (la respuesta), es posible. Me tomó un buen rato, pero funciona.
Dependiendo de lo que estés tratando de lograr, echa un vistazo a webrat . Sé que generalmente se usa para pruebas, pero también puede afectar sitios en vivo, y hace muchas de las cosas que su navegador web haría por usted, como almacenar cookies entre solicitudes y seguir redirecciones.
Es necesario agregar un encabezado "Cookie".
No estoy seguro si open-uri puede hacer esto o no, pero se puede hacer usando Net :: HTTP.
# Create a new connection object.
conn = Net::HTTP.new(site, port)
# Get the response when we login, to set the cookie.
# body is the encoded arguments to log in.
resp, data = conn.post(login_path, body, {})
cookie = resp.response[''set-cookie'']
# Headers need to be in a hash.
headers = { "Cookie" => cookie }
# On a get, we don''t need a body.
resp, data = conn.get(path, headers)
Gracias Matthew Schinckel su respuesta fue realmente útil. Usando Net :: HTTP tuve éxito
# Create a new connection object.
site = "google.com"
port = 80
conn = Net::HTTP.new(site, port)
# Get the response when we login, to set the cookie.
# body is the encoded arguments to log in.
resp, data = conn.post(login_path, body, {})
cookie = resp.response[''set-cookie'']
# Headers need to be in a hash.
headers = { "Cookie" => cookie }
# On a get, we don''t need a body.
resp, data = conn.get(path, headers)
puts resp.body
Hay una implementación de tarro de cookies RFC 2109 y RFC 2965 que se encuentra aquí, ya que requiere un manejo de cookies compatible con el estándar.
Pensé que alguien lo sabría, pero supongo que no suele hacerse con open-uri
. Aquí está la versión fea que no comprueba la privacidad, la caducidad, el dominio correcto ni la ruta correcta:
h1 = open("http://www.w3.org/")
h2 = open("http://www.w3.org/People/Berners-Lee/",
"Cookie" => h1.meta[''set-cookie''].split(''; '',2)[0])
Si, funciona. No, no es bonito, ni cumple totalmente con las recomendaciones, ni maneja múltiples cookies (como es).
Claramente, HTTP es un protocolo muy sencillo, y open-uri
permite en la mayoría de ellos. Supongo que lo que realmente necesitaba saber era cómo obtener la cookie de la solicitud h1
para que pudiera pasar a la solicitud h2
(la parte que ya sabía y mostraba). Lo sorprendente aquí es cuánta gente básicamente tenía ganas de responder diciéndome que no usara open-uri
, y solo una de ellas mostró cómo obtener un conjunto de cookies en una solicitud que pasó a la siguiente solicitud.
tendría que utilizar su propio soporte de cookies analizando los meta encabezados al leer y agregar un encabezado de cookie al enviar una solicitud si está utilizando open-uri. Considere usar httpclient http://raa.ruby-lang.org/project/httpclient/ o algo así como mecanizar en su lugar mechanize.rubyforge.org ya que tienen compatibilidad con cookies incorporada.