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

fea*_*ool 22 ruby cookies mechanize

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

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

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

fea*_*ool 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")
Run Code Online (Sandbox Code Playgroud)

似乎做得很好.

更新

正如@Benjamin Manns所指出的,Mechanize现在想要一个URL add.这是修改后的配方,假设你已经使用代理完成了GET,并且访问的最后一页是cookie的域(保存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)
Run Code Online (Sandbox Code Playgroud)

  • 注意:现在你必须传递一个像`agent.cookie_jar.add(URI.parse('www.oddity.com',cookie)`这样的URI. (6认同)
  • @BenjaminManns很高兴你的评论更正为`agent.cookie_jar.add(URI.parse('www.oddity.com'),cookie) (2认同)
  • 当您使用破坏性方法时,您不必传递URI!`agent.cookie_jar.add!(饼干)` (2认同)

pgu*_*rio 15

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

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