Получение изображений статуса Skype с сайта HTTPS - PullRequest
1 голос
/ 24 сентября 2011

У меня есть приложение Rails 3, где я пытаюсь отобразить страницу с пользователями и их соответствующим статусом Skype. Это легко сделать, если страница HTTP: просто установите фоновый URL-адрес элемента для изображения, возвращенного из http://mystatus.skype.com/mediumicon/USERNAME.

Однако мой сайт работает по протоколу HTTPS, и загрузка ресурсов через HTTP из HTTPS приводит к удушению IE. И, очевидно, Skype не предоставляет HTTPS-версию значка статуса.

Таким образом, я использую подход для получения статуса Skype на стороне сервера (т.е. в контроллере), вызывая указанный выше URL с Net :: HTTP. Затем я могу просто написать байты изображения обратно на страницу без проблем, используя send_data (). Но я не могу понять, как передавать байты изображения обратно в представление вместе со всеми остальными данными страницы.

Есть идеи?

1 Ответ

3 голосов
/ 24 сентября 2011

Вот фрагмент кода, который работает. Я сделал это в sinatra исключительно для того, чтобы он работал автономно, но содержимое блока get - это важные строки.

require 'sinatra'
require 'net/http'
require 'base64'

get '/' do
  base_image = Net::HTTP.get(URI.parse('http://mystatus.skype.com/mediumicon/Gazler'))
  "<img src=\"data:image/png;base64,#{Base64.encode64(base_image)}\">"
end

Для этого используется кодировка base64 источника. Вы можете прочитать больше здесь .

Обратите внимание, что это может не работать в старых версиях IE.

Одним из решений этого было бы кодирование base64 возвращенного изображения, как указано выше, и сохранение всех возможных изображений в виде статуса, а затем сравнение с результатом. Очевидно, что каждый раз это будет выполняться довольно медленно, поэтому вы захотите сохранить base64 изображений локально, а затем выполнить поиск по строке base64.

Надеюсь, это имеет смысл.

EDIT

В качестве вспомогательного метода:

def skype_status(username)
  base_image = Net::HTTP.get(URI.parse("http://mystatus.skype.com/mediumicon/#{username}"))
  content_tag("img", :src =>"data:image/png;base64,#{Base64.encode64(base_image)}")
end
...