2009-08-25 6 views
9

私はXMLHttpRequestとサーバ側のスクリプトを使ってこのデータを投稿するjsを持つページを持っています。Rubyはヘッダを機械化する

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 
+0

何ヘッダー、サーバー側のスクリプトが探していますか?それは変わることがあります。たとえば、Railsでは_methodが検索されると信じていますが、PHPスクリプトがあれば必ずしもそのようになるとは限りません。 –

+1

私はあなたが答えを受け入れる必要があると思うAnimalCode ... – Kris

答えて

2

documentationをご覧ください。

あなたは猿パッチのいずれかに必要とするか、またはカスタムヘッダーがプライベートメソッドpost_formに渡されるようにpostメソッドをオーバーライドするWWW::Mechanizeから独自のクラスを派生させます。

は例えば、

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 
11

は、私は(2ヵ月後、私は知っている)ウェブ検索でこの記事を発見し、ちょうど別の解決策を共有したいと思いました。

あなたは猿が事前接続フックを使用してMechanizeのにパッチを適用せずにカスタムヘッダーを追加することができます。

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

+0

もっと優雅! +1 –

+0

Refererヘッダーを設定する方法を探していました。しかし、_mechanize(2.3)_によって、 'undefined method 'pre_connect_hooks' for nil:NilClass(NoMethodError)' – Marcos

+0

@marcosというエラーが出ます。何らかの理由で 'agent'オブジェクトがnilであることを示唆しています。それを確認できますか?これを修正すると、Mechanize 2.0にはラムダの引数が異なることがわかります - 最新のドキュメントを確認してください。 –

8
ajax_headers = { 'X-Requested-With' => 'XMLHttpRequest', 'Content-Type' => 'application/json; charset=utf-8', 'Accept' => 'application/json, text/javascript, */*'} 
params = {'emailAddress' => '[email protected]'}.to_json 
response = agent.post('http://example.com/login', params, ajax_headers) 

を上記のコードは、私の作品(1.0を機械)を作るための方法として、サーバーはリクエストがAJAX経由で来ると考えていますが、他の回答に記載されているように、サーバーが探しているものによって異なりますが、異なるフレームワーク/ jsライブラリコンボでは異なります。

Firefox HTTPLiveHeadersプラグインまたはHTTPScoopを使用して、ブラウザから送信されたリクエストヘッダーを見て、それを複製してみてください。

3

ラムダは一つの引数を持っていたことMechanizeの以前のバージョンのように思えるが、今では2を持っています

agent = Mechanize.new do |agent| 
    agent.pre_connect_hooks << lambda do |agent, request| 
    request["Accept-Language"] = "ru" 
    end 
end 
関連する問題