Как вручную добавить cookie в состояние Mechanize? - PullRequest
22 голосов
/ 31 марта 2010

Я работаю в Ruby, но мой вопрос подходит и для других языков.

У меня есть приложение, управляемое Mechanize. Сервер, с которым я разговариваю, устанавливает cookie с использованием JavaScript (а не стандартного set-cookie), поэтому Mechanize не перехватывает cookie. Мне нужно передать этот cookie обратно на следующий запрос GET.

Хорошей новостью является то, что я уже знаю значение куки, но я не знаю, как сказать Mechanize включить его в мой следующий запрос GET.

Ответы [ 5 ]

31 голосов
/ 31 марта 2010

Я понял это путем экстраполяции (и чтения источников):

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)
15 голосов
/ 01 августа 2013

Эти ответы старые, поэтому, чтобы обновить их, в наши дни это выглядит примерно так:

cookie = Mechanize::Cookie.new :domain => '.mydomain.com', :name => name, :value => value, :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie
4 голосов
/ 29 января 2016

Я хотел бы добавить свой опыт для специальной передачи файлов 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 из файла cookie Selenium является DateTime объектом или пустым.

Однако значение для :expires Механизировать 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

Теперь создайте экземпляр как «Механизировать куки» и поместите их в банку с печеньем

mech_agent = Mechanize.new
sel_cookies.each { |c| agent.cookie_jar << Mechanize::Cookie.new(c) }
mech_agent.get 'https://sample.com/html_pages'
2 голосов
/ 19 июня 2011

Также вы можете попробовать это

Mechanize::Cookie.parse(url, "SessionCookie=#{sessid}", 
  Logger.new(STDOUT)) { |c| agent.cookie_jar.add(url, c) }

источник: http://twitter.com/#!/calebcrane/status/51683884341002240

0 голосов
/ 25 октября 2018
response.to_hash.fetch("set-cookie").each do |c|
  agent.cookie_jar.parse c
end

response здесь есть нативная вещь Ruby stdlib, например Net :: HTTPOK.

...