9

XMLHttpRequest を介してデータを投稿する js を含むページがあり、サーバー側スクリプトはこのヘッダーをチェックします。このヘッダーを送信するにはどうすればよいですか?

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
4

4 に答える 4

11

Web 検索でこの投稿を見つけ (2 か月後、私は知っています)、別の解決策を共有したかっただけです。

事前接続フックを使用して Mechanize にモンキー パッチを適用せずにカスタム ヘッダーを追加できます。

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

于 2009-10-08T07:52:45.633 に答える
8
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)

上記のコードは、リクエストがAJAX経由で送信されているとサーバーに思わせる方法として私(Mechanize 1.0)で機能しますが、他の回答で述べたように、サーバーが探しているものに依存し、フレームワーク/ jsライブラリごとに異なりますコンボ。

最善の方法は、Firefox HTTPLiveHeadersプラグインまたはHTTPScoopを使用して、ブラウザから送信されたリクエスト ヘッダーを確認し、それを複製してみることです。

于 2010-06-30T14:18:15.750 に答える
4

以前はラムダの引数が 1 つだったようですが、現在は 2 つになっています。

agent = Mechanize.new do |agent|
  agent.pre_connect_hooks << lambda do |agent, request|
    request["Accept-Language"] = "ru"
  end
end
于 2015-05-15T18:30:49.013 に答える
2

ドキュメントを見てください。

カスタム ヘッダーがプライベート メソッドに渡されるように、モンキー パッチを適用するか、独自のクラスを派生させてメソッドWWW::Mechanizeをオーバーライドする必要があります。postpost_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
于 2009-08-25T18:39:50.637 に答える