Получить файл изображения, используя рубин и капибару

Это тег изображения на странице, к которой капибара обращается по протоколу HTTPS:

<img src="path">

Есть ли способ получить файл изображения со страницы с помощью капибары с любым драйвером?

Я не могу использовать что-то вроде File.read('path'), потому что изображение также доступно только через HTTPS. Мои последние исследования привели меня к такому решению:

  1. Посетите страницу
  2. Сохранить страницу в png (такая полезная возможность есть у драйвера webkit)
  3. Обрезать изображение

Но я верю, что красивое решение существует.

Отредактировано 1:

Я пробовал решение padde, но вот тело ответа:

<html><head><title>Object moved</title></head> 
    <body>
        <h2>Object moved to <a href=\"/Bledy/Blad404.aspx?aspxerrorpath=/CaptchaType.ashx\">here</a>.</h2> 
    </body>
</html>

Отредактировано 2:

> curl -I image_path

5860cf30abf5d5480
HTTP/1.1 302 Found
Cache-Control: private
Content-Length: 168
Content-Type: text/html; charset=utf-8
Location: /Bledy/Blad404.aspx?aspxerrorpath=/CaptchaType.ashx
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 03 Nov 2012 17:18:55 GMT

person FUT    schedule 03.11.2012    source источник


Ответы (1)


Что вам, вероятно, нужно, так это HTTPS-запрос от Ruby, если я правильно понял. Пытаться:

require 'net/https'

url = URI.parse('path')

Net::HTTP.start(url.host, url.port, :use_ssl => true, :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
  res = http.get(url.request_uri)
  open("image.png", "wb") do |f|
    f.write(res.body)
  end
end

Для кадрирования вы можете использовать chunky_png (чистый Ruby) или rmagick (требуется ImageMagick)

Изменить: если вы хотите следовать перенаправлениям, вы можете сделать

require 'net/https'

def process_image( content )
  # do your cropping here

  open("image.png", "wb") do |f|
    f.write(content)
  end
end

def fetch( url )
  Net::HTTP.start(url.host, url.port, :use_ssl => true, :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
    response = http.get(url.request_uri)
    case response.code
    when Net::HTTPRedirection
      fetch response['location']
    else
      process_image response.body
    end
  end
end

fetch URI.parse('path')
person Patrick Oscity    schedule 03.11.2012
comment
Ошибка проверки сертификата. Не знаю почему. Как я понимаю, когда интерпретатор входит в блок - соединение с этим сервером устанавливается, и все сохраненные файлы cookie сеанса будут отправлены при выполнении http.get. Во всяком случае, вы указали мне правильное направление поиска. Спасибо! - person FUT; 03.11.2012
comment
Я предполагаю, что вы используете Ruby 1.9, где проверка сертификата более строгая, чем в предыдущих версиях. Вы можете обойти эту проблему, используя :verify_mode => OpenSSL::SSL::VERIFY_NONE. Я тоже обновил свой ответ. - person Patrick Oscity; 03.11.2012
comment
Да, ты прав! Но ответ: <html><head><title>Object moved</title></head> <body><h2>Object moved to <a href=\"/Bledy/Blad404.aspx? aspxerrorpath=/CaptchaType.ashx\">here</a>.</h2> </body></html> Это похоже на мои предыдущие результаты wget и curl. - person FUT; 03.11.2012
comment
Ну, это проблема с веб-службой, которую вы вызываете. Тот же путь работает, когда вы вводите его в браузере? Может быть, пример URL будет полезен. - person Patrick Oscity; 03.11.2012
comment
Да работает просто отлично. Я думаю, что мне не хватает чего-то ценного здесь. - person FUT; 03.11.2012
comment
Вероятно, это означает, что ваш браузер перенаправляет вас. Вы можете попробовать что-то вроде stackoverflow.com/questions/6934185/ - person Patrick Oscity; 03.11.2012
comment
Пожалуйста, введите curl -I <path> в командной строке и покажите мне результаты, чтобы я мог вам помочь. - person Patrick Oscity; 03.11.2012
comment
Я проверю ссылку и изменю/добавлю текущий комментарий. Спасибо! - person FUT; 03.11.2012
comment
Конечно, я буду, но в настоящее время мы находимся на пути к ответу :) Я обновил вопрос. Проверьте это, пожалуйста. - person FUT; 03.11.2012
comment
Проверьте мое редактирование. Остальное я оставлю на ваше усмотрение, потому что это превращается в один из этих вопросов, пожалуйста, сделайте за меня мою работу. - person Patrick Oscity; 03.11.2012