在Mechanize请求之间维护cookie

ada*_*ord 15 ruby screen-scraping mechanize

我正在尝试使用Ruby版本的Mechanize从我们正在离开的票证管理系统中提取我的雇主的票据,而不提供API.

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

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
Run Code Online (Sandbox Code Playgroud)

user_session是网站登录页面POST的URL,我已经确认这确实get会让我登录.但是从通话中返回的页面是'哎呀,你还没有登录!' 页.

我已经验证了clickpost调用返回的页面上的链接是否正常工作,但实际上我无法在没有JavaScript的情况下到达我需要的位置.当然,我已经在浏览器上使用相同的登录成功完成了此操作.

我究竟做错了什么?

Nie*_*ian 13

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

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

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

但是 - 最简单的方法是安装最新的2.1版本的机械化(许多修复),因为你可以非常简单地完成它.要安装最新的do a gem install mechanize --pre并确保gem uninstall mechanize 'some_version'在此之后摆脱旧版本的mechanize ,您可以简单地执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

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