2009-08-25 27 views
9

Tôi có trang có js đăng dữ liệu qua XMLHttpRequest và kiểm tra kịch bản lệnh phía máy chủ cho tiêu đề này, cách gửi tiêu đề này?Ruby cơ giới hóa bài đăng với tiêu đề

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

tiêu đề là gì server side script tìm kiếm? Nó có thể khác nhau. Ví dụ, trong Rails tôi tin rằng _method được tìm kiếm, nhưng đó không nhất thiết phải là trường hợp với bất kỳ kịch bản PHP nào bạn đang nhấn. –

+1

Tôi nghĩ bạn cần chấp nhận câu trả lời là AnimalCode ... – Kris

Trả lời

2

Hãy xem documentation.

Bạn cần hoặc là khỉ vá hoặc lấy được lớp của riêng bạn từ WWW::Mechanize để ghi đè phương thức post để tiêu đề tùy chỉnh được chuyển sang phương thức riêng tư post_form.

Ví dụ,

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

tôi thấy bài này với một tìm kiếm web (hai tháng sau đó, tôi biết) và chỉ muốn chia sẻ một giải pháp khác.

Bạn có thể thêm tiêu đề tùy chỉnh mà không khỉ vá mechanize sử dụng một cái móc pre-connect:

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

+0

MUCH thanh lịch hơn! +1 –

+0

Tôi đến đây để tìm cách thiết lập tiêu đề Người giới thiệu. Tuy nhiên với _mechanize (2.3) _ Tôi nhận được lỗi 'undefined method' pre_connect_hooks 'cho nil: NilClass (NoMethodError) ' – Marcos

+0

@marcos: điều đó sẽ gợi ý rằng đối tượng' agent' của bạn là nil vì một số lý do. Bạn có thể kiểm tra điều đó không? Một khi bạn sửa lỗi đó, bạn sẽ thấy rằng Mechanize 2.0 có các đối số khác nhau cho lambda - kiểm tra các tài liệu mới nhất. –

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) 

Đoạn mã trên làm việc cho tôi (cơ giới hóa 1.0) như là một cách để làm cho máy chủ nghĩ rằng yêu cầu là đến thông qua AJAX, nhưng như đã nêu trong các câu trả lời khác nó phụ thuộc vào những gì máy chủ đang tìm kiếm, nó sẽ khác nhau đối với các khung công tác khác nhau của thư viện/js.

Điều tốt nhất cần làm là sử dụng plugin Firefox HTTPLiveHeaders hoặc HTTPScoop và xem tiêu đề yêu cầu được gửi bởi trình duyệt và chỉ cần thử và nhân rộng điều đó.

3

Có vẻ như phiên bản trước của mechanize rằng lambda có một đối số, nhưng bây giờ nó có hai:

agent = Mechanize.new do |agent| 
    agent.pre_connect_hooks << lambda do |agent, request| 
    request["Accept-Language"] = "ru" 
    end 
end 
Các vấn đề liên quan