Как я могу получить целевой URL сокращенного URL, используя Ruby? - PullRequest
13 голосов
/ 04 апреля 2011

Как мне взять этот URL http://t.co/yjgxz5Y и получить целевой URL, который равен http://nickstraffictricks.com/4856_how-to-rank-1-in-google/

Ответы [ 4 ]

23 голосов
/ 04 апреля 2011
require 'net/http'
require 'uri'

Net::HTTP.get_response(URI.parse('http://t.co/yjgxz5Y'))['location']
# => "http://nickstraffictricks.com/4856_how-to-rank-1-in-google/" 
8 голосов
/ 04 апреля 2011

Я использовал open-uri для этого, потому что это красиво и просто. Он извлечет страницу, но также будет следовать нескольким перенаправлениям:

require 'open-uri'

final_uri = ''
open('http://t.co/yjgxz5Y') do |h|
  final_uri = h.base_uri
end
final_uri # => #<URI::HTTP:0x00000100851050 URL:http://nickstraffictricks.com/4856_how-to-rank-1-in-google/>

Документы показывают хороший пример использования нижнего уровня Net :: HTTP для обработки перенаправлений.

require 'net/http'
require 'uri'

def fetch(uri_str, limit = 10)
  # You should choose better exception.
  raise ArgumentError, 'HTTP redirect too deep' if limit == 0

  response = Net::HTTP.get_response(URI.parse(uri_str))
  case response
  when Net::HTTPSuccess     then response
  when Net::HTTPRedirection then fetch(response['location'], limit - 1)
  else
    response.error!
  end
end

puts fetch('http://www.ruby-lang.org')

Конечно, все это ломается, если страница не использует перенаправление HTTP. Многие сайты используют мета-перенаправления, которые вы должны обрабатывать, извлекая URL-адрес из метатега, но это другой вопрос.

3 голосов
/ 28 декабря 2013

Для разрешения перенаправлений вы должны использовать запрос HEAD, чтобы избежать загрузки всего тела ответа (представьте, что вы разрешаете URL-адрес аудио или видео файла).

Рабочий пример с использованием камня Фарадея:

require 'faraday'
require 'faraday_middleware'

def resolve_redirects(url)
    response = fetch_response(url, method: :head)
    if response
        return response.to_hash[:url].to_s
    else
        return nil
    end
end

def fetch_response(url, method: :get)
    conn = Faraday.new do |b|
        b.use FaradayMiddleware::FollowRedirects;
        b.adapter :net_http
    end
    return conn.send method, url
rescue Faraday::Error, Faraday::Error::ConnectionFailed => e
    return nil
end

puts resolve_redirects("http://cre.fm/feed/m4a") # http://feeds.feedburner.com/cre-podcast
1 голос
/ 04 апреля 2011

Вы должны будете следовать перенаправлению. Я думаю, что это поможет:

http://shadow -file.blogspot.com / 2009/03 / обработка HTTP-Перенаправление-в-ruby.html

...