Подтвердить что ты не робот

Получить перенаправление URL-адреса в Ruby

В соответствии с графическим API Facebook мы можем запросить изображение профиля пользователя с этим (примером):

https://graph.facebook.com/1489686594/picture

Но реальный URL изображения предыдущей ссылки:

http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg

Если вы наберете первую ссылку в своем браузере, она перенаправит вас ко второй ссылке.

Есть ли способ получить полный URL (вторая ссылка) с Ruby/Rails, зная только первый URL?

(Это повторение этого вопроса, но для Ruby)

4b9b3361

Ответ 1

Вы можете использовать Net:: Http и прочитать заголовок Location: из ответа

require 'net/http'
require 'uri'

url = URI.parse('http://www.example.com/index.html')
res = Net::HTTP.start(url.host, url.port) {|http|
  http.get('/index.html')
}
res['location']

Ответ 2

Об этом ответили правильно, но есть гораздо более простой способ:

res = Net::HTTP.get_response(URI('https://graph.facebook.com/1489686594/picture'))
res['location']

Ответ 3

У вас есть URL-адреса HTTPS, поэтому вы справитесь с этим...

require 'net/http'
require 'net/https' if RUBY_VERSION < '1.9'
require 'uri'

u = URI.parse('https://graph.facebook.com/1489686594/picture')

h = Net::HTTP.new u.host, u.port
h.use_ssl = u.scheme == 'https'

head = h.start do |ua|
  ua.head u.path
end

puts head['location']

Ответ 4

Я знаю, что это старый вопрос, но я добавлю этот ответ для потомков:

Большинство решений, которые я видел, следует только за одним перенаправлением. В моем случае мне пришлось выполнить несколько переадресаций, чтобы получить фактический конечный целевой URL. Я использовал Curl (через Curb gem) так:

result = Curl::Easy.perform(url) do |curl|
  curl.head = true
  curl.follow_location = true
end
result.last_effective_url

Ответ 5

Вы можете проверить код состояния ответа и получить окончательный URL-адрес рекурсивно, используя что-то вроде метода get_final_redirect_url:

  require 'net/http'

  def get_final_redirect_url(url, limit = 10)
    uri = URI.parse(url)
    response = ::Net::HTTP.get_response(uri)
    if response.class == Net::HTTPOK
      return uri
    else
      redirect_location = response['location']
      location_uri = URI.parse(redirect_location)
      if location_uri.host.nil?
        redirect_location = uri.scheme + '://' + uri.host + redirect_location
      end
      warn "redirected to #{redirect_location}"
      get_final_redirect_url(redirect_location, limit - 1)
    end
  end

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

Вы можете найти информацию об использовании здесь.

Ответ 6

Да, ответный заголовок "Местоположение" сообщает вам фактический URL-адрес изображения.

Однако, если вы используете изображение в качестве изображения профиля пользователя на своем сайте, я рекомендую вам использовать URL-адрес стиля "https://graph.facebook.com/:user_id/picture" вместо фактического URL-адреса изображения. В противном случае ваши пользователи будут видеть много "не найденных" изображений или устаревших изображений профиля в будущем.

Вы просто поместите "https://graph.facebook.com/:user_id/picture" в качестве атрибута "src" тега "img". Браузер получает обновленное изображение пользователя.

пс. У меня такие проблемы на моем сайте с Twitter и Yahoo! OpenID теперь..