【问题标题】:How to manually add a cookie to Mechanize state?如何手动将 cookie 添加到机械化状态?
【发布时间】:2011-02-02 17:05:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby cookies mechanize


    【解决方案1】:

    我是通过推断(和阅读资料)得出的:

    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)
    

    【讨论】:

    • 注意:现在你必须传递一个类似agent.cookie_jar.add(URI.parse('www.oddity.com', cookie)的URI。
    • @BenjaminManns 很高兴将您的评论更正为agent.cookie_jar.add(URI.parse('www.oddity.com'), cookie)
    • 当你使用破坏性方法时,你不必传递一个URI! agent.cookie_jar.add!(cookie)
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,@pguardiario。因为我的答案已经过时,所以给你打勾。
    【解决方案3】:

    我想补充一下我专门将 cookie 从 Selenium 传递到 Mechanize 的经验:

    从你的 selenium 驱动程序中获取 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'
    

    【讨论】:

      【解决方案4】:

      你也可以试试这个

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

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

      【讨论】:

        【解决方案5】:
        response.to_hash.fetch("set-cookie").each do |c|
          agent.cookie_jar.parse c
        end
        

        response 这是一个原生的 Ruby 标准库,比如 Net::HTTPOK。

        【讨论】:

          猜你喜欢
          • 2011-01-12
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 2016-05-11
          • 1970-01-01
          • 1970-01-01
          • 2011-11-13
          • 1970-01-01
          相关资源
          最近更新 更多