【问题标题】:Ruby mechanize post with header带有标题的 Ruby 机械化帖子
【发布时间】:2009-08-25 10:55:13
【问题描述】:

我有一个带有 js 的页面,它通过 XMLHttpRequest 和服务器端脚本检查这个头文件,如何发送这个头文件?

agent = WWW::Mechanize.new { |a|
  a.user_agent_alias = 'Mac Safari'
  a.log = Logger.new('./site.log')
}

agent.post('http://site.com/board.php',
  {
    'act' => '_get_page',
    "gid" => 1,
    'order' => 0,
    'page' => 2
  }
) do |page|
  p page
end

【问题讨论】:

  • 服务器端脚本在寻找什么标头?它可以变化。例如,我相信在 Rails 中会寻找 _method,但无论您使用什么 PHP 脚本,情况都不一定如此。
  • 我认为你需要接受AnimalCode的答案...

标签: ruby xmlhttprequest mechanize


【解决方案1】:

我通过网络搜索找到了这篇文章(我知道是两个月后),只是想分享另一个解决方案。

您可以使用预连接挂钩添加自定义标头,而无需猴子修补 Mechanize:

  agent = WWW::Mechanize.new
  agent.pre_connect_hooks << lambda { |p|
    p[:request]['X-Requested-With'] = 'XMLHttpRequest'
  }

【讨论】:

  • 我来这里是为了寻找一种设置Referer标头的方法。但是使用 mechanize (2.3) 我收到错误 undefined method 'pre_connect_hooks' for nil:NilClass (NoMethodError)
  • @marcos:这表明您的 agent 对象由于某些原因为零。你能检查一下吗?一旦你解决了这个问题,你会发现 Mechanize 2.0 对 lambda 有不同的参数——查看最新的文档。
  • 编辑此答案后,我的评论不再有效。以前我错误地将其编码为一长行,如第 1 版中所示,导致 agent.pre_connect_hooksagent 被定义之前使用。
  • 给我wrong number of arguments (2 for 1),mechanize-2.7.3/lib/mechanize/http/agent.rb:398:in `call'。使用stackoverflow.com/a/30266454/111995insted
【解决方案2】:
ajax_headers = { 'X-Requested-With' => 'XMLHttpRequest', 'Content-Type' => 'application/json; charset=utf-8', 'Accept' => 'application/json, text/javascript, */*'}
params = {'emailAddress' => 'me@my.com'}.to_json
response = agent.post( 'http://example.com/login', params, ajax_headers)

上面的代码适用于我(Mechanize 1.0),可以让服务器认为请求是通过 AJAX 来的,但正如其他答案中所述,这取决于服务器在寻找什么,不同的框架会有所不同/js 库组合。

最好的办法是使用 Firefox HTTPLiveHeaders 插件或 HTTPScoop 并查看浏览器发送的请求标头,然后尝试复制它。

【讨论】:

    【解决方案3】:

    好像之前 lambda 有一个参数,但现在它有两个:

    agent = Mechanize.new do |agent|
      agent.pre_connect_hooks << lambda do |agent, request|
        request["Accept-Language"] = "ru"
      end
    end
    

    【讨论】:

      【解决方案4】:

      看看documentation

      您需要猴子补丁或从WWW::Mechanize 派生您自己的类来覆盖post 方法,以便将自定义标头传递给私有方法post_form

      例如,

      class WWW::Mechanize
        def post(url, query= {}, headers = {})
          node = {}
          # Create a fake form
          class << node
            def search(*args); []; end
          end
          node['method'] = 'POST'
          node['enctype'] = 'application/x-www-form-urlencoded'
      
          form = Form.new(node)
          query.each { |k,v|
            if v.is_a?(IO)
              form.enctype = 'multipart/form-data'
              ul = Form::FileUpload.new(k.to_s,::File.basename(v.path))
              ul.file_data = v.read
              form.file_uploads << ul
            else
              form.fields << Form::Field.new(k.to_s,v)
            end
          }
          post_form(url, form, headers)
        end
      end
      
      agent = WWW::Mechanize.new
      
      agent.post(URL,POSTDATA,{'custom-header' => 'custom'}) do |page|
          p page
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 2011-01-13
        • 2013-09-07
        • 2012-08-05
        • 2016-04-17
        • 1970-01-01
        相关资源
        最近更新 更多