ruby - malos - que son los cookies de una pagina web
¿Cómo agregar manualmente una cookie al estado Mecanizar? (5)
Estas respuestas son antiguas, así que para actualizar esto, en estos días se parece más a esto:
cookie = Mechanize::Cookie.new :domain => ''.mydomain.com'', :name => name, :value => value, :path => ''/'', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
Estoy trabajando en Ruby, pero mi pregunta también es válida para otros idiomas.
Tengo una aplicación mecanizada. El servidor con el que estoy hablando establece una cookie usando JavaScript (en lugar de la cookie estándar establecida), por lo que Mechanize no captura la cookie. Necesito devolver esa cookie a la próxima solicitud GET.
La buena noticia es que ya conozco el valor de la cookie, pero no sé cómo decirle a Mechanize que la incluya en mi próxima solicitud GET.
Lo descubrí por extrapolación (y fuentes de lectura):
agent = Mechanize.new
...
cookie = Mechanize::Cookie.new(key, value)
cookie.domain = ".oddity.com"
cookie.path = "/"
agent.cookie_jar.add(cookie)
...
page = agent.get("https://www.oddity.com/etc")
Parece hacer el trabajo muy bien.
actualizar
Como señala @Benjamin Manns, Mechanize ahora quiere una URL en el método de add
. Aquí está la receta modificada, asumiendo que usted ha hecho un GET con el agente y que la última página visitada es el dominio de la cookie (guarda un URI.parse()
):
agent = Mechanize.new
...
cookie = Mechanize::Cookie.new(key, value)
cookie.domain = ".oddity.com"
cookie.path = "/"
agent.cookie_jar.add(agent.history.last.uri, cookie)
Quería agregar mi experiencia para pasar específicamente las cookies de Selenium a Mechanize:
Consigue las cookies de tu driver de selenio
sel_driver = Selenium::WebDriver.for :firefox
sel_driver.navigate.to(''https://sample.com/javascript_login'')
#login
sel_cookies = sel_driver.manage.all_cookies
El valor para :expires
de Selenium cookie es un objeto DateTime
o en blanco.
Sin embargo, el valor para :expires
cookie de Mechanize (a) debe ser una cadena y (b) no puede estar en blanco
sel_cookies.each do |c|
if c[:expires].blank?
c[:expires] = (DateTime.now + 10.years).to_s #arbitrary date in the future
else
c[:expires] = c[:expires].to_s
end
end
Ahora cree una instancia como Mecanizar cookies y colóquelas en el tarro de galletas
mech_agent = Mechanize.new
sel_cookies.each { |c| agent.cookie_jar << Mechanize::Cookie.new(c) }
mech_agent.get ''https://sample.com/html_pages''
También puedes probar esto
Mechanize::Cookie.parse(url, "SessionCookie=#{sessid}",
Logger.new(STDOUT)) { |c| agent.cookie_jar.add(url, c) }
fuente: http://twitter.com/#!/calebcrane/status/51683884341002240
response.to_hash.fetch("set-cookie").each do |c|
agent.cookie_jar.parse c
end
response
aquí es una cosa nativa de Ruby stdlib, como Net :: HTTPOK.