在Mechanize请求之间维护cookie

我正在尝试使用Ruby版本的Mechanize从票证管理系统中提取我的雇主的票证,我们正在远离那些不提供API的票证管理系统。

问题是,似乎Mechanize没有在post调用和下面显示的get调用之间保留cookie:

 require 'rubygems' require 'nokogiri' require 'mechanize' @agent = Mechanize.new page = @agent.post('http://.com/user_session', { 'authenticity_token' => '', 'user_session[login]' => '', 'user_session[password]' => '', 'user_session[remember_me]' => '0', 'commit' => 'Login' }) page = @agent.get 'http://.com///tickets/1' puts page.title 

user_session是网站登录页面POST的URL,我已经确认这确实get我登录。但是从get调用返回的页面是’哎呀,你还没有登录!’ 页。

我已经validation了从post调用返回的页面上的click链接是有效的,但我实际上无法在没有JavaScript的情况下到达我需要去的地方。 当然,我已经使用相同的登录function在浏览器上成功完成了这项工作。

我究竟做错了什么?

好的,这可能对你有所帮助 – 首先你使用的是什么版本的机械化? 您需要确定,如果此问题是由于请求之间通过机械化覆盖/清除cookie或者cookie是否错误/未首先设置。 您可以通过在两个请求之间添加puts @agent.cookie_jar.jar来查看存储的内容。

如果是覆盖问题,您可以通过从第一个请求中收集cookie并将其应用到第二个请求来解决它。 有很多方法可以做到这一点:

一种方法是只做一个temp_jar = agent.cookie_jar.jar然后只是浏览每个cookie并使用.add方法再次添加它

但是 – 最简单的方法是安装最新的2.1版本的机械化(许多修复),因为你可以非常简单地完成它。 要安装最新的做一个gem install mechanize --pre并确保在此之后摆脱旧版本的mechanize gem uninstall mechanize 'some_version' ,你可以简单地做到如下:

 require 'rubygems' require 'nokogiri' require 'mechanize' @agent = Mechanize.new page = @agent.post('http://.com/user_session', { 'authenticity_token' => '', 'user_session[login]' => '', 'user_session[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://.com///tickets/1' puts page.title 

BTW文档在这里http://mechanize.rubyforge.org/index.html