Сохранение файлов cookie между запросами Mechanize

Я пытаюсь использовать Ruby-версию Mechanize для извлечения моих билетов на работодателя из системы управления билетами, от которой мы уходим, и не предоставляет API.

Проблема в том, что Mechanize не поддерживает файлы cookie между вызовом post и вызовом get, показанным ниже:

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 - это URL-адрес, на который отправляются POST-страницы учетной записи сайта, и я подтвердил, что это действительно меня ввело. Но страница, возвращающаяся из вызова get, - это "Упс, вы не зарегистрированы в!' стр.

Я проверил, что click ссылки на странице, которая возвращается из вызова post, работает, но я не могу добраться до того, где мне нужно идти без JavaScript. И, конечно, я сделал это успешно в браузере с тем же именем.

Что я делаю неправильно?

Ответы

Ответ 1

Хорошо, это может помочь вам - прежде всего, какую версию механизации вы используете? Вам нужно идентифицировать, если эта проблема связана с тем, что файлы cookie перезаписываются/очищаются путем механизации между запросами или если файлы cookie ошибочны/не устанавливаются в первую очередь. Вы можете сделать это, добавив puts @agent.cookie_jar.jar между двумя запросами, чтобы посмотреть, что хранится.

Если это проблема с перезаписи, вы можете решить ее, собирая файлы cookie с первого запроса и применяя их ко второму. Существует много способов сделать это:

Один из способов - просто сделать temp_jar = agent.cookie_jar.jar a, а затем просто пройти через каждый файл 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://<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 документация находится здесь http://mechanize.rubyforge.org/index.html