Подтвердить что ты не робот

Как вручную добавить файл cookie в состояние Mechanize?

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

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

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

4b9b3361

Ответ 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)

Ответ 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'