Как вручную добавить файл cookie в состояние Mechanize?
Я работаю в Ruby, но мой вопрос действительно и для других языков.
У меня есть приложение, управляемое механизмом. Сервер, с которым я говорю, устанавливает cookie с использованием JavaScript (а не стандартного set-cookie), поэтому Mechanize не поймает cookie. Мне нужно передать этот файл cookie на следующий запрос GET.
Хорошей новостью является то, что я уже знаю ценность файла cookie, но я не знаю, как сказать Mechanize, чтобы включить его в мой следующий запрос GET.
Ответы
Ответ 1
Эти ответы старые, поэтому, чтобы довести это до сегодняшнего дня, в наши дни это выглядит примерно так:
cookie = Mechanize::Cookie.new :domain => '.mydomain.com', :name => name, :value => value, :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
Ответ 2
Я понял это путем экстраполяции (и источников чтения):
agent = Mechanize.new
...
cookie = Mechanize::Cookie.new(key, value)
cookie.domain = ".oddity.com"
cookie.path = "/"
agent.cookie_jar.add(cookie)
...
page = agent.get("https://www.oddity.com/etc")
Кажется, что это просто отлично.
Обновление
Как указывает @Benjamin Manns, Mechanize теперь хочет URL-адрес в методе add
. Здесь исправленный рецепт, исходя из предположения, что вы сделали GET с помощью агента, и что последняя посещенная страница является доменом для файла cookie (сохраняет URI.parse()
):
agent = Mechanize.new
...
cookie = Mechanize::Cookie.new(key, value)
cookie.domain = ".oddity.com"
cookie.path = "/"
agent.cookie_jar.add(agent.history.last.uri, cookie)
Ответ 3
Также вы можете попробовать это
Mechanize::Cookie.parse(url, "SessionCookie=#{sessid}",
Logger.new(STDOUT)) { |c| agent.cookie_jar.add(url, c) }
источник: http://twitter.com/#!/calebcrane/status/51683884341002240
Ответ 4
Я хотел добавить свой опыт для передачи cookie файлов из Selenium для Механизации:
Получить файлы cookie из вашего драйвера selenium
sel_driver = Selenium::WebDriver.for :firefox
sel_driver.navigate.to('https://sample.com/javascript_login')
#login
sel_cookies = sel_driver.manage.all_cookies
Значение для :expires
из Selenium cookie - это объект DateTime
или пустой.
Однако значение для :expires
Mechanize cookie (a) должно быть строкой и (b) не может быть пустым
sel_cookies.each do |c|
if c[:expires].blank?
c[:expires] = (DateTime.now + 10.years).to_s #arbitrary date in the future
else
c[:expires] = c[:expires].to_s
end
end
Теперь создайте экземпляр в виде файлов cookie Mechanize и поместите их в банку cookie
mech_agent = Mechanize.new
sel_cookies.each { |c| agent.cookie_jar << Mechanize::Cookie.new(c) }
mech_agent.get 'https://sample.com/html_pages'