Сохранение файлов cookie между запросами Mechanize - PullRequest
15 голосов
/ 13 августа 2011

Я пытаюсь использовать 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-адрес, на который отправляется страница входа в систему сайта, и я подтвердил, чтоэто действительно регистрирует меня. Но страница, которая возвращается после вызова get, - это «Ой, ты не вошел!»page.

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

Что я делаю не так?

1 Ответ

13 голосов
/ 16 ноября 2011

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

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

Один из способов - просто сделать temp_jar = agent.cookie_jar.jar, а затем просто просмотреть каждый файл cookie и снова добавить его, используя метод .add

ОДНАКО - самый простой способ - просто установить последнюю версию 2.1 предварительного релиза Mechanize (много исправлений), потому что тогда вы сможете сделать это очень просто. Чтобы установить последнюю версию, выполните команду 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

Кстати, документация здесь http://mechanize.rubyforge.org/index.html

...