Сохранение файлов 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, на который отправляется страница входа в систему сайта, и я убедился, что это действительно регистрирует меня. Но страница, которая возвращается из get
Вызов "Ой, вы не авторизованы!" стр.
Я подтвердил это click
ссылки на странице, которая возвращается из post
вызов работает, но я не могу добраться туда, куда мне нужно идти без JavaScript. И, конечно, я сделал это успешно в браузере с тем же логином.
Что я делаю неправильно?
1 ответ
Хорошо, это может помочь вам - в первую очередь, какую версию механизации вы используете? Вам необходимо определить, связана ли эта проблема с тем, что файлы cookie перезаписываются / очищаются с помощью механизма между запросами, или файлы cookie неверны / не устанавливаются в первую очередь. Вы можете сделать это, добавив puts @agent.cookie_jar.jar
между двумя запросами, чтобы увидеть, что хранится.
Если это перезаписывающая проблема, вы можете решить ее, собирая файлы cookie из первого запроса и применяя их ко второму. Есть много способов сделать это:
Одним из способов является просто сделать temp_jar = agent.cookie_jar.jar
затем просто просматривая каждый файл cookie и добавляя его снова, используя метод.add
ОДНАКО - самый простой способ - просто установить последнюю предварительную версию 2.1 механизации (много исправлений), потому что тогда вы сможете сделать это очень просто. Для установки последней сделайте gem install mechanize --pre
и не забудьте избавиться от старой версии механизировать 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
Mechanize будет автоматически отправлять файлы cookie, полученные из ответа в последовательном запросе. Вы можете использовать тот же агент без повторной новой.
require 'mechanize'
@agent = Mechanize.new
@agent.post(create_sessions_url, params, headers)
@agent.get(ticket_url)
Протестировано с mechanize 2.7.6
.