2014-10-06 3 views
0

Я понимаю, что вы можете использовать прокси-сервер в ruby ​​Net :: HTTP. Однако я понятия не имею, как это сделать с помощью пула прокси. Мне нужно, чтобы Net :: HTTP изменился на другой прокси-сервер и отправил другой почтовый запрос после каждого почтового запроса. Кроме того, можно ли изменить Net :: HTTP на другой прокси-сервер, если предыдущий прокси не работает? Если да, то как? код Я пытаюсь выполнить сценарий в:Net :: HTTP Proxy list

require 'net/http' 
sleep(8) 
http = Net::HTTP.new('URLHERE', 80) 
http.read_timeout = 5000 
http.use_ssl = false 
path = 'PATHHERE' 
data = '(DATAHERE)' 
headers = { 
'Referer' => 'REFERER HERE', 
'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8', 
'User-Agent' => '(USERAGENTHERE)'} 

resp, data = http.post(path, data, headers) 


# Output on the screen -> we should get either a 302 redirect (after a successful login) or an error page 
puts 'Code = ' + resp.code 
puts 'Message = ' + resp.message 
resp.each {|key, val| puts key + ' = ' + val} 
puts data 

конца

+0

Вы смогли заставить его работать с одним прокси-сервером? Если да, разместите ли вы код? – thohl

+0

Я не смог успешно реализовать прокси. –

ответ

0

Учитывая массив прокси, следующий пример будет делать запрос через каждый прокси в массиве, пока он не получит «302 Found " ответ. (Это на самом деле не работает пример, потому что Google не принимает POST запросы, но он должен работать, если вы вставляете свой пункт назначения и рабочие прокси.)

require 'net/http' 

destination = URI.parse "http://www.google.com/search" 
proxies = [ 
    "http://proxy-example-1.net:8080", 
    "http://proxy-example-2.net:8080", 
    "http://proxy-example-3.net:8080" 
] 

# Create your POST request_object once 
request_object = Net::HTTP::Post.new(destination.request_uri) 
request_object.set_form_data({"q" => "stack overflow"}) 

proxies.each do |raw_proxy| 

    proxy = URI.parse raw_proxy 

    # Create a new http_object for each new proxy 
    http_object = Net::HTTP.new(destination.host, destination.port, proxy.host, proxy.port) 

    # Make the request 
    response = http_object.request(request_object) 

    # If we get a 302, report it and break 
    if response.code == "302" 
     puts "#{proxy.host}:#{proxy.port} responded with #{response.code} #{response.message}" 
     break 
    end 
end 

Вы должны также, вероятно, сделать некоторые проверки ошибок с begin ... rescue ... end каждый раз, когда вы делаете запрос. Если вы не выполняете проверку ошибок и прокси-сервер не работает, управление никогда не достигнет строки, которая проверяет наличие response.code == "302" - программа просто выйдет из строя с некоторым типом ошибки таймаута соединения.

См. the Net::HTTPHeader docs для других методов, которые могут быть использованы для настройки объекта Net::HTTP::Post.