如何手动将Cookie添加到Mechanize状态?

时间:2010-03-30 23:26:33

标签: ruby cookies mechanize

我在Ruby工作,但我的问题也适用于其他语言。

我有一个机械化驱动的应用程序。我正在谈论的服务器使用JavaScript(而不是标准的set-cookie)设置cookie,因此Mechanize不会捕获cookie。我需要在下一个GET请求中传回该cookie。

好消息是我已经知道cookie的价值,但我不知道如何告诉Mechanize将其包含在我的下一个GET请求中。

5 个答案:

答案 0 :(得分:31)

我通过推断(和阅读来源)得出结论:

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现在需要add方法中的URL。这是修改后的配方,假设您已经使用代理完成了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)

答案 1 :(得分:15)

这些答案都是陈旧的,所以为了更新,这些日子看起来更像是这样:

cookie = Mechanize::Cookie.new :domain => '.mydomain.com', :name => name, :value => value, :path => '/', :expires => (Date.today + 1).to_s
agent.cookie_jar << cookie

答案 2 :(得分:4)

我想添加我的经验,专门将Cookie从Selenium传递给Mechanize:

从硒驱动程序中获取cookie

sel_driver = Selenium::WebDriver.for :firefox
sel_driver.navigate.to('https://sample.com/javascript_login')
#login
sel_cookies = sel_driver.manage.all_cookies

Selenium Cookie中:expires的值是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

现在实例化为Mechanize cookie并将它们放入cookie jar

mech_agent = Mechanize.new
sel_cookies.each { |c| agent.cookie_jar << Mechanize::Cookie.new(c) }
mech_agent.get 'https://sample.com/html_pages'

答案 3 :(得分:2)

你也可以试试这个

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

来源:http://twitter.com/#!/calebcrane/status/51683884341002240

答案 4 :(得分:0)

response.to_hash.fetch("set-cookie").each do |c|
  agent.cookie_jar.parse c
end

response是本机Ruby stdlib,例如Net :: HTTPOK。