开发者

How to manually add a cookie to Mechanize state?

开发者 https://www.devze.com 2022-12-25 00:02 出处:网络
I\'m working in Ruby, but my question is valid for other languages as well. I have a Mechanize-driven application.The server I\'m talking to sets a cookie using JavaSc开发者_StackOverflow社区ript (ra

I'm working in Ruby, but my question is valid for other languages as well.

I have a Mechanize-driven application. The server I'm talking to sets a cookie using JavaSc开发者_StackOverflow社区ript (rather than standard set-cookie), so Mechanize doesn't catch the cookie. I need to pass that cookie back on the next GET request.

The good news is that I already know the value of the cookie, but I don't know how to tell Mechanize to include it in my next GET request.


I figured it out by extrapolation (and reading sources):

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")

Seems to do the job just fine.

update

As @Benjamin Manns points out, Mechanize now wants a URL in the add method. Here's the amended recipe, making the assumption that you've done a GET using the agent, and that the last page visited is the domain for the cookie (saves a 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)


These answers are old, so to bring this up to date, these days it looks more like this:

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


I wanted to add my experience for specifically passing cookies from Selenium to Mechanize:

Get the cookies from your selenium driver

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

Value for :expires from Selenium cookie is a DateTime object or blank.

However, value for :expires Mechanize cookie (a) must be a string and (b) cannot be blank

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

Now instantiate as Mechanize cookies and place them in the 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'


Also you can try this

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

source: http://twitter.com/#!/calebcrane/status/51683884341002240


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

response here is a native Ruby stdlib thing, like Net::HTTPOK.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号