2011-08-12 9 views
14

Estoy intentando usar la versión de Ruby de Mechanize para extraer las entradas de mi empleador de un sistema de gestión de tickets del que nos estamos alejando y que no proporciona una API.Mantenimiento de cookies entre solicitudes de Mechanize

El problema es que parece Mechanize no está manteniendo las galletas entre el post llamada y la llamada get muestra a continuación:

require 'rubygems' 
require 'nokogiri' 
require 'mechanize' 

@agent = Mechanize.new 

page = @agent.post('http://<url>.com/user_session', { 
              'authenticity_token' => '<token>', 
              'user_session[login]' => '<login>', 
              'user_session[password]' => '<password>', 
              'user_session[remember_me]' => '0', 
              'commit' => 'Login' 
}) 

page = @agent.get 'http://<url>.com/<organization>/<repo-name>/tickets/1' 
puts page.title 

user_session es la URL a la que el sitio de página Posts inicio de sesión, y no tengo verifiqué que esto realmente me conecta. Pero la página que regresa de la llamada get es '¡Vaya, no ha iniciado sesión!' página.

He verificado que click enlaces de ing en la página que regresa de la llamada post funciona, pero en realidad no puedo llegar a donde tengo que ir sin JavaScript. Y, por supuesto, lo hice con éxito en el navegador con el mismo nombre de usuario.

¿Qué estoy haciendo mal?

Respuesta

12

Bien, esto podría ayudarlo, ¿qué versión de mecanizado está usando primero? Debe identificar, si este problema se debe a que las cookies se sobrescriben/limpian mediante mecanizado entre las solicitudes o si las cookies son incorrectas/no se establecen en primer lugar. Puede hacerlo agregando un puts @agent.cookie_jar.jar entre las dos solicitudes, para ver qué se almacena.

Si se trata de un problema de sobreescritura, es posible que pueda resolverlo recopilando las cookies de la primera solicitud y aplicándolas a la segunda. Hay muchas maneras de hacer esto:

Una forma es simplemente hacer un temp_jar = agent.cookie_jar.jar una continuación, sólo pasando por cada galleta y añadir de nuevo utilizando el método .add

Sin embargo - la forma más fácil es al solo instalar el la última versión 2.1 de mecanize (muchas correcciones), porque entonces podrás hacerlo de manera muy simple. para instalar la última hacer un gem install mechanize --pre y asegúrese de deshacerse de la versión antigua de mecanizar gem uninstall mechanize 'some_version' después de esto, sólo tiene que hacer lo siguiente:

require 'rubygems' 
require 'nokogiri' 
require 'mechanize' 

@agent = Mechanize.new 

page = @agent.post('http://<url>.com/user_session', { 
             'authenticity_token' => '<token>', 
             'user_session[login]' => '<login>', 
             'user_session[password]' => '<password>', 
             'user_session[remember_me]' => '0', 
             'commit' => 'Login' 
}) 
temp_jar = @agent.cookie_jar 
#Do whatever you need an use the cookies again in a new session after that 
@agent = Mechanize.new 
@agent.cookie_jar = temp_jar 

page = @agent.get 'http://<url>.com/<organization>/<repo-name>/tickets/1' 
puts page.title 

BTW la documentación está aquí http://mechanize.rubyforge.org/index.html

+0

esto es bastante mal, ¿por qué es necesaria una nueva instancia de mecanizado? –

+0

@DitmarWendt esto es solo un ejemplo de cómo volver a utilizar las cookies obtenidas antes después de la publicación de la sesión ejecutada. –

Cuestiones relacionadas